https://www.acmicpc.net/problem/10828
10828번: 스택
첫째 줄에 주어지는 명령의 수 N (1 ≤ N ≤ 10,000)이 주어진다. 둘째 줄부터 N개의 줄에는 명령이 하나씩 주어진다. 주어지는 정수는 1보다 크거나 같고, 100,000보다 작거나 같다. 문제에 나와있지
www.acmicpc.net
문제 설명
정수를 저장하는 스택을 구현한 다음, 입력으로 주어지는 명령을 처리하는 프로그램을 작성하는 문제
- Input: N(주어지는 명령의 수), N개의 줄에 명령이 하나씩 주어진다.
- push X: 정수 X를 스택에 넣는 연산이다.
- pop: 스택에서 가장 위에 있는 정수를 빼고, 그 수를 출력한다. 만약 스택에 들어있는 정수가 없는 경우에는 -1을 출력한다.
- size: 스택에 들어있는 정수의 개수를 출력한다.
- empty: 스택이 비어있으면 1, 아니면 0을 출력한다.
- top: 스택의 가장 위에 있는 정수를 출력한다. 만약 스택에 들어있는 정수가 없는 경우에는 -1을 출력한다.
코드
stack = []
N = int(input())
for i in range(N):
text = input()
if "push" in text:
data = int(text[5:])
stack.append(data)
elif "pop" in text:
if len(stack) == 0:
print(-1)
else:
print(stack[-1])
stack.pop()
elif "size" in text:
print(len(stack))
elif "empty" in text:
if len(stack) == 0:
print(1)
else:
print(0)
elif "top" in text:
if len(stack) == 0:
print(-1)
else:
print(stack[-1])
코드 실행 결과: 시간 초과
input() 함수는 사용자의 입력을 기다리는 동안 프로그램이 일시 정지되므로, 입력이 많은 경우 시간 초과가 발생할 수 있다. 이 문제를 해결하기 위해서 대량의 입력을 한 번에 받는 방식을 사용해야 한다.
대량의 입력을 한 번에 받기 위해서 sys.stdin.readline()을 사용하는 방식이 효율적이다.
- 입출력 버퍼: sys.stdin.readline()은 입출력 버퍼를 효율적으로 활용한다. 입력 함수인 input()은 한 번에 한 줄씩 입력받기 때문에 매번 입력할 때마다 I/O 작업이 발생한다. 반면, sys.stdin.readline()은 버퍼에 미리 입력된 데이터를 한 번에 읽어오기 때문에 I/O 작업이 줄어들어 속도가 향상된다.
- 문자열 변환: input()은 입력을 받으면 문자열로 반환한다. 반면, sys.stdin.readline()은 개행 문자(줄 바꿈을 나타내는 특수 문자, /n)를 포함한 문자열로 반환하기 때문에 rstrip()과 같은 추가 작업 없이도 개행 문자를 제거할 수 있다. 이로 인해 문자열 변환 작업이 간소화되어 속도가 향상된다.
- 대량의 입력 처리: input()은 사용자의 입력을 기다리는 동안 프로그램이 일시 정지되기 때문에, 대량의 입력을 처리할 때 시간이 오래 걸린다. sys.stdin.readline()은 버퍼에 미리 입력된 데이터를 한 번에 읽어오므로, 대량의 입력을 효율적으로 처리할 수 있다.
cf) 버퍼: 데이터를 임시로 저장하는 메모리 영역, 입출력 작업에서 버퍼는 데이터의 효율적인 전송을 돕고, 프로그램의 성능을 향상시키는 역할을 한다.
import sys
stack = []
N = int(sys.stdin.readline().rstrip())
for _ in range(N):
text = sys.stdin.readline().rstrip().split()
if text[0] == "push":
data = int(text[1])
stack.append(data)
elif text[0] == "pop":
if len(stack) == 0:
print(-1)
else:
print(stack.pop())
elif text[0] == "size":
print(len(stack))
elif text[0] == "empty":
if len(stack) == 0:
print(1)
else:
print(0)
elif text[0] == "top":
if len(stack) == 0:
print(-1)
else:
print(stack[-1])
코드 실행 결과: 정답