유물/└ 백준

<백준(파이썬)> 10828번: 스택

디벅잉 2022. 3. 23. 17:50
728x90

 

🤖

 

문제

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

 

10828번: 스택

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

www.acmicpc.net

 

풀이

시간초과로 구글링을 하였고, 입력값을 받는 방법을 변경하여 해결했습니다.

input() 대신 속도가 더 빠르다고 하는 sys.stdin.readline()을 사용했습니다.

속도 차이가 나는 이유는 버퍼의 크기가 다르기 때문으로 보입니다.

sys.stdin.readline() 버퍼의 크기가 커서 한번에 많은 처리를 하는 것입니다.

또한 출력내용을 한번에 모아서 출력하면 속도가 조금 더 빨라집니다.

단순하게 생각하면 print를 바로바로 해주는게 빠를것 같은데 컴퓨터는 print 명령을 처리하는 것이 힘든가 봅니다.

최종 코드

from sys import stdin

N = int(stdin.readline())

stack = list()
answer = []

for _ in range(N):
    command = stdin.readline().split()

    if command[0] == 'push':
        val = int(command[1])
        stack.append(val)
    elif command[0] == 'pop':
        answer.append(stack.pop() if len(stack) != 0 else -1)
    elif command[0] == 'size':
        answer.append(len(stack))
    elif command[0] == 'empty':
        answer.append(0 if len(stack) != 0 else 1)
    elif command[0] == 'top':
        answer.append(stack[-1] if len(stack) != 0 else -1)

result = ""
for el in answer:
    result += (str(el) + '\n')
print(result)

시간초과 발생한 코드

N = int(input())

stack = list()
answer = []

for _ in range(N):
    command = input().split()

    if command[0] == 'push':
        val = int(command[1])
        stack.append(val)
    elif command[0] == 'pop':
        print(stack.pop() if len(stack) != 0 else -1)
    elif command[0] == 'size':
        print(len(stack))
    elif command[0] == 'empty':
        print(0 if len(stack) != 0 else 1)
    elif command[0] == 'top':
        print(stack[-1] if len(stack) != 0 else -1)

모아서 한번에 print한 경우 144ms, 140ms 소요된 반면, 따로따로 print한 경우 164ms, 180ms 소요됐습니다.

 

728x90