정수를 저장하는 스택을 구현한 다음, 입력으로 주어지는 명령을 처리하는 프로그램을 작성하시오.
명령은 총 다섯 가지이다.
첫째 줄에 주어지는 명령의 수 N (1 ≤ N ≤ 10,000)이 주어진다. 둘째 줄부터 N개의 줄에는 명령이 하나씩 주어진다. 주어지는 정수는 1보다 크거나 같고, 100,000보다 작거나 같다. 문제에 나와있지 않은 명령이 주어지는 경우는 없다.
출력해야하는 명령이 주어질 때마다, 한 줄에 하나씩 출력한다.
import sys
num = int(sys.stdin.readline().strip())
stack = []
for i in range(0, num):
op = sys.stdin.readline().split()
if op[0] == "push":
stack.append(op[1])
elif op[0] == "pop":
print(stack.pop() if len(stack) > 0 else -1)
elif op[0] == "size":
print(len(stack))
elif op[0] == "empty":
print(1 if len(stack) == 0 else 0)
elif op[0] == "top":
print(stack[len(stack) - 1] if len(stack) > 0 else -1)
파이썬에서 스택은 리스트로 표현할 수 있습니다. 스택의 LIFO(Last In First Out)방식을 구현할 수 있는 append나 pop과 같은 리스트 연산자들이 존재하기 때문에 이것들을 활용해서 쉽게 구현할 수 있을 것으로 생각했습니다.
스택을 표현할 리스트를 하나 만들어준 뒤, 입력을 하나씩 받으면서 if-elif 문으로 입력에 따른 처리를 해주었습니다.
stack : 스택을 표현하는 리스트num : 명령어의 수op : 하나씩 입력되는 명령어를 담은 변수로, push는 길이 2의 리스트, push를 제외한 모든 명령어는 길이 1의 리스트로 표현된다.push의 경우 op[1]에 추가하고자 하는 값이 들어있다. pop과 empty, top 부분에 python식 삼항연산자를 사용된 것을 확인할 수 있습니다. 스택이 비어있는지 아닌지를 확인한 뒤 그에 맞는 출력을 보여주기 위함입니다.
삼항연산자는 condition ? A : B에서 조건에 만족하면 A, 만족하지 않으면 B를 선택하는 연산자입니다. 일반 if-else문과 혹시 다른 것이 있나 찾아봤는데, 그냥 if-else문을 한 줄로 표현한 것이나 다름없다고 합니다.
예전 자료구조 공부할 때가 생각이 나는 문제였다. 간단한 문제지만 백준을 풀면서 이렇게 기초부터 잘 다져가면 좋을 것 같다는 생각이 들었다. 또 예전의 덕지덕지 코드가 아니라 효율적이고 알아보기 쉬운 코드로의 연습을 많이 해보면 좋을 것 같다는 생각을 했다!😎