본문 바로가기
Algorithms/코테 문풀

[백준 10828번] 스택

by hi-rachel 2023. 8. 13.

문제

https://www.acmicpc.net/problem/10828

 

10828번: 스택

첫째 줄에 주어지는 명령의 수 N (1 ≤ N ≤ 10,000)이 주어진다. 둘째 줄부터 N개의 줄에는 명령이 하나씩 주어진다. 주어지는 정수는 1보다 크거나 같고, 100,000보다 작거나 같다. 문제에 나와있지

www.acmicpc.net

 


풀이

n = int(input())

stack = [];

for _ in range(n):
  order = input().split()
  if order[0] == 'push':
    stack.append(order[1])
  elif order[0] == 'size':
    print(len(stack))
  elif order[0] == 'pop':
    if len(stack) == 0:
      print(-1)
    else:
      print(stack[-1])
      stack.pop()
  elif order[0] == 'top':
    if len(stack) == 0:
      print(-1)
    else:
      print(stack[-1])
  elif order[0] == 'empty':
    if len(stack) == 0:
      print(1)
    else:
      print(0)

위와 같은 코드로 제출했더니 시간 초과가 나왔다.

 

📌 찾아보니 반복문으로 여러 줄을 입력받는 상황에서는 sys.stdin.readline()을 사용해야 시간초과가 발생하지 않는 것을 알았다.

sys.stdin.readline()을 사용하면 개행문자(\n)가 같이 입력받아지는 점을 고려해야 한다.

입력값은 문자열 형태로 저장되고, 만약 map(int, sys.stdin.readline().split())식으로 형변환을 거치면 개행문자가 제거된다.

[참고]

 

[Python 문법] 파이썬 입력 받기(sys.stdin.readline)

파이썬으로 코딩 테스트를 준비한다면, 반드시 알아야 할 입력방식인 sys.stdin.readline()에 대한 정리 입니다.

velog.io

 

import sys
n = int(input())

stack = [];

for _ in range(n):
  order = sys.stdin.readline().split()
  operator = order[0]
  if operator == 'push':
    stack.append(int(order[1]))
  elif operator == 'size':
    print(len(stack))
  elif operator == 'pop':
    if len(stack) == 0:
      print(-1)
    else:
      print(stack[-1])
      stack.pop()
  elif operator == 'top':
    if len(stack) == 0:
      print(-1)
    else:
      print(stack[-1])
  elif operator == 'empty':
    if len(stack) == 0:
      print(1)
    else:
      print(0)

input()을 sys.stdin.readline()로 바꿔주고 통과했다.

 

import sys
n = int(input())

stack = [];

for _ in range(n):
  order = sys.stdin.readline().rstrip()
  if order == 'size':
    print(len(stack))
  elif order == 'pop':
    print(stack.pop() if stack else -1)
  elif order == 'top':
    print(stack[-1] if stack else -1)
  elif order == 'empty':
    print(0 if stack else 1)
  else:
    _, x = order.split()
    stack.append(int(x))

너무 길고 지저분한 코드를 다른 사람의 코드를 참고해 수정했다.

 

시간이 좀 더 빨라졌다.


 

참고

백준