https://www.acmicpc.net/problem/10828
문제
정수를 저장하는 스택을 구현한 다음, 입력으로 주어지는 명령을 처리하는 프로그램을 작성하시오.
명령은 총 다섯 가지이다.
push X: 정수 X를 스택에 넣는 연산이다.
pop: 스택에서 가장 위에 있는 정수를 빼고, 그 수를 출력한다. 만약 스택에 들어있는 정수가 없는 경우에는 -1을 출력한다.
size: 스택에 들어있는 정수의 개수를 출력한다.
empty: 스택이 비어있으면 1, 아니면 0을 출력한다.
top: 스택의 가장 위에 있는 정수를 출력한다. 만약 스택에 들어있는 정수가 없는 경우에는 -1을 출력한다.
입력
첫째 줄에 주어지는 명령의 수 N (1 ≤ N ≤ 10,000)이 주어진다. 둘째 줄부터 N개의 줄에는 명령이 하나씩 주어진다. 주어지는 정수는 1보다 크거나 같고, 100,000보다 작거나 같다. 문제에 나와있지 않은 명령이 주어지는 경우는 없다.
출력
출력해야하는 명령이 주어질 때마다, 한 줄에 하나씩 출력한다.
내 풀이
시간초과 때문이라도 deque를 써야할 것 같았지만
일단 그냥 list로 받아서 한번 시도해봤습니다.
n = int(input())
stack = []
for _ in range(n):
command = input()
if command[:4] == 'push':
stack.insert(0, int(command.split()[1]))
elif command == 'pop':
print(-1 if len(stack)==0 else stack.pop(0))
elif command == 'size':
print(len(stack))
elif command == 'empty':
print(1 if len(stack) == 0 else 0)
elif command == 'top':
print(-1 if len(stack) == 0 else stack[0])
당연하게도 시간초과가 떴고요.
deque를 불러와서 시도했는데 입력 되는 수가 많아서 이래도 시간초과가 떴습니다.
그래서 별생각 없이 sys.stdin.readline을 사용했는데 런타임에러로 AttributeError가 떴습니다.
검색해보니 sys.stdin.readline은 입력에 개행문자('\n')도 같이 입력을 받는다고 하더군요.
그래서 문제를 풀어도 'push'가 아닌 'push\n'로 입력 받게되어서 오류가 발생한 것이었습니다.
그동안에는 숫자로 풀었거나 입력된 값을 print하는 식으로 진행되었는지 전혀 생각지도 못했습니다.
그래서 명령어를 입력받을 때는 sys.stdin.readline이 아닌 sys.stdin.readline.rstrip()을 활용하니 문제가 해결되었습니다.
최종코드:
# 34036kb 68ms
from collections import deque
import sys
input = sys.stdin.readline
stack = deque()
n = int(input())
for _ in range(n):
command = input().rstrip()
if command[:4] == 'push':
stack.appendleft(int(command.split()[1]))
elif command == 'pop':
print(-1 if len(stack)==0 else stack.popleft())
elif command == 'size':
print(len(stack))
elif command == 'empty':
print(1 if len(stack) == 0 else 0)
elif command == 'top':
print(-1 if len(stack) == 0 else stack[0])
메모
sys.stdin.readline와 sys.stdin.readline.rstrip()의 차이를 알고 사용하자
'파이썬 알고리즘 연습' 카테고리의 다른 글
[MySQL | 프로그래머스 ] 대장균의 크기에 따라 분류하기 1 (0) | 2024.07.23 |
---|---|
[Python | 백준 7568번] 덩치 (0) | 2024.07.08 |
[Python | 백준 1920번] 수 찾기 (0) | 2024.07.02 |
[Python | 백준 18110번] solved.ac (0) | 2024.06.30 |
[Python | 백준 2164번] 카드2 (0) | 2024.06.27 |