-
<백준(파이썬)> 10828번: 스택유물/└ 백준 2022. 3. 23. 17:50728x90
🤖
문제
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'유물 > └ 백준' 카테고리의 다른 글
<백준(파이썬)> 10815번: 숫자 카드 (0) 2022.04.01 <백준(파이썬)> 1715번: 카드 정렬하기 (0) 2022.03.30 <백준(파이썬)> 1068번: 트리 (0) 2022.03.23 <백준(node.js)> 1978번: 소수 찾기 (0) 2022.02.22 <백준(node.js)> 10757번: 큰 수 A+B (0) 2022.02.21