문제
정수를 저장하는 스택을 구현한 다음, 입력으로 주어지는 명령을 처리하는 프로그램을 작성하시오.
명령은 총 다섯 가지이다.
- push X: 정수 X를 스택에 넣는 연산이다.
- pop: 스택에서 가장 위에 있는 정수를 빼고, 그 수를 출력한다. 만약 스택에 들어있는 정수가 없는 경우에는 -1을 출력한다.
- size: 스택에 들어있는 정수의 개수를 출력한다.
- empty: 스택이 비어있으면 1, 아니면 0을 출력한다.
- top: 스택의 가장 위에 있는 정수를 출력한다. 만약 스택에 들어있는 정수가 없는 경우에는 -1을 출력한다.
▶️ 입력 조건
- 첫째 줄에 주어지는 명령의 수 N (1 ≤ N ≤ 10,000)이 주어진다. 둘째 줄부터 N개의 줄에는 명령이 하나씩 주어진다. 주어지는 정수는 1보다 크거나 같고, 100,000보다 작거나 같다. 문제에 나와있지 않은 명령이 주어지는 경우는 없다.
▶️ 출력 조건
- 출력해야하는 명령이 주어질 때마다, 한 줄에 하나씩 출력한다.
풀이
python에서 stack 문제는 거의 보너스 문제급으로 list를 통해서 쉽게 구현할 수 있기 때문에
코드 구현 자체는 문제가 되지 않았지만 입력과 출력으로 인해 시간초과로 최초 시도에 오답을 받았다.
따라서 sys 모듈을 사용해 입력과 출력 방식을 변경하였다.
또한 pop이나 top 명령어의 경우 -1을 출력하기 위해 예외처리를 하여 IndexError시 -1을 출력하도록 구현 했었는데 알고리즘 문제에서 예외처리를 하는 것은 시간이 많이 소요되기 때문에 if문을 통해 분기하는게 좋다는 글을 보고 코드를 수정하여 시간초과 문제를 해결했다.
import sys
n = int(sys.stdin.readline())
stack = []
for _ in range(n):
command = sys.stdin.readline()
match command.split():
case ['push', value]:
stack.append(int(value))
case ['pop']:
if stack:
sys.stdout.write(str(stack.pop()) + '\n')
else:
sys.stdout.write('-1' + '\n')
case ['size']:
sys.stdout.write(str(len(stack)) + '\n')
case ['empty']:
if stack:
sys.stdout.write('0' + '\n')
else:
sys.stdout.write('1' + '\n')
case ['top']:
if stack:
sys.stdout.write(str(stack[-1]) + '\n')
else:
sys.stdout.write('-1' + '\n')
'Algorithm > Problem Solving' 카테고리의 다른 글
[Beakjoon] 2164: 카드 2 - python (0) | 2025.02.07 |
---|---|
[Beakjoon] 10816: 숫자 카드 2 - python (0) | 2025.02.05 |
[Beakjoon] 10814: 나이순 정렬 - python (0) | 2025.02.04 |
[Beakjoon] 2577: 숫자의 개수 - python (0) | 2025.02.04 |
[Baekjoon] 10250: ACM 호텔 - python (0) | 2025.02.04 |