본문 바로가기
Computer Science/Algorithm

[백준] 10828번 스택 구현 - 시간초과문제

by 9루트 2023. 1. 8.

스택 문제 예시와 답 모두 맞는 것 같은데, 시간 초과가 뜬다.

고작 O(N)일 뿐인데... 이상하다.

 

# BOJ_10828
n = int(input())

stack = []
for _ in range(n):
  command = list(map(str, input().split()))
  # push
  if command[0] == 'push':
    stack.append(int(command[1]))
  # pop
  elif command[0] == 'pop':
    if len(stack) == 0:
      print(-1)
    else:
      print(stack[-1])
      del stack[-1]
  # size
  elif command[0] == 'size':
    print(len(stack))
  # empty
  elif command[0] == 'empty':
    if len(stack) == 0:
      print(1)
    else:
      print(0)
  # top
  elif command[0] == 'top':
    if len(stack) == 0:
      print(-1)
    else:
      print(stack[-1])

 

찾아봤더니 input()이 아닌 sys.stdin.readline()을 써야 시간 초과가 나지 않는다고 한다.

그 이유는 아래 블로그에 친절하게 써있다.

 

https://velog.io/@yeseolee/Python-%ED%8C%8C%EC%9D%B4%EC%8D%AC-%EC%9E%85%EB%A0%A5-%EC%A0%95%EB%A6%ACsys.stdin.readline

 

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

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

velog.io

맨 첫줄 Test case를 입력받을 때는 input()을 사용해도 괜찮다.
그러나 반복문으로 여러줄 입력받는 상황에서는 반드시 sys.stdin.readline()을 사용해야 시간초과가 발생하지 않는다고 한다.

 

# BOJ_10828
import sys

n = int(input())

stack = []
for _ in range(n):

  command = list(map(str, sys.stdin.readline().split()))

 

로 바꿔주었다.

 

 

드디어 맞았다~

다른 풀이를 보니 클래스로 구현하는 방법도 있었다.

if else가 아니라

각 기능별로 메서드 함수로 나눠주니

가독성이 더 높은 것 같다.

굳굳