정수를 저장하는 스택을 구현한 다음, 입력으로 주어지는 명령을 처리하는 프로그램을 작성하시오.
명령은 총 다섯 가지이다.
push X
: 정수 X를 스택에 넣는 연산이다.pop
: 스택에서 가장 위에 있는 정수를 빼고, 그 수를 출력한다. 만약 스택에 들어있는 정수가 없는 경우에는 -1을 출력한다.size
: 스택에 들어있는 정수의 개수를 출력한다.empty
: 스택이 비어있으면 1, 아니면 0을 출력한다.top
: 스택의 가장 위에 있는 정수를 출력한다. 만약 스택에 들어있는 정수가 없는 경우에는 -1을 출력한다.첫째 줄에 주어지는 명령의 수 N (1 ≤ N ≤ 10,000)이 주어진다. 둘째 줄부터 N개의 줄에는 명령이 하나씩 주어진다. 주어지는 정수는 1보다 크거나 같고, 100,000보다 작거나 같다. 문제에 나와있지 않은 명령이 주어지는 경우는 없다.
출력해야하는 명령이 주어질 때마다, 한 줄에 하나씩 출력한다.
언어는 Python 3(파이썬 3)을 사용했습니다.
코드의 실행 시간을 측정하기 위해 time
모듈을 활용할 수 있습니다.time
모듈에는 시간 측정에 활용할 수 있는 두 가지 메소드가 있습니다. 다만 다음과 같은 특징이 있습니다:
time.perf_counter()
: 짧은 지속 시간을 측정하는 가장 높은 해상도를 가진 시계의 값을 반환합니다. 수면 중 경과 시간이 포함됩니다.time.process_time()
: 현재 프로세스의 시스템과 사용자 CPU 시간 합계의 값을 반환합니다. 수면 중 경과 시간은 포함되지 않습니다.두 함수 모두 실수를 반환하며, 필요에 따라 두 메소드 중 하나를 선택하여 활용합니다. 더 궁금한 내용이 있다면 time - Python 3.9.1 문서를 참고하세요.
input
대신 readline
표준 입력으로 자주 사용했던 input
대신 readline
을 사용해야 했습니다. readline
이 input
보다 실행 시간이 빠르기 때문입니다. (관련 내용은 아래 읽어보기에서 간단히 다루었으니 여기서는 넘어가겠습니다.)
단, readline
은 개행 문자까지 입력받으므로, 이를 제거하고 싶다면 문자열 내 공백을 제거해주는 strip
계열 메소드를 같이 사용해주는게 좋습니다. strip
외에도 split
등 input
에서 적용하던 메소드를 모두 적용할 수 있습니다.
import sys
sys.stdin.readline()
sys.stdin.readline().rstrip().split()
import sys
Arr = []
Input = []
N = int(sys.stdin.readline().rstrip())
for _ in range(N):
Input = sys.stdin.readline().rstrip().split(" ")
if Input[0] == "push":
Arr.append(Input[1])
elif Input[0] == "pop":
if not Arr:
print(-1)
else:
print(Arr[-1])
Arr.pop()
elif Input[0] == "size":
print(len(Arr))
elif Input[0] == "empty":
if not Arr:
print(1)
else:
print(0)
elif Input[0] == "top":
if not Arr:
print(-1)
else:
print(Arr[-1])
input
과 readline
의 실행 시간 비교해보기 위에서 소개한 time.process_time()
을 활용해 다음과 같이 코드를 짜 보았습니다:
import time
import sys
T = time.process_time()
input()
print(time.process_time() - T)
T = time.process_time()
sys.stdin.readline()
print(time.process_time() - T)
이상의 코드를 활용해 readline
과 input
의 실행 시간을 비교해 보았습니다. 입력은 '1'로 주었고, 각 명령어 당 10번 실행하여 평균을 내 보았습니다. 그 결과는 다음과 같습니다:
input
이 sys.stdin.readline()
보다 약 1.23배 느린 것을 확인할 수 있습니다. 다만 이는 언제까지나 간단한 비교를 위해 대충 코딩하여 제시한 수치입니다. 그냥 'sys.stdin.readline()
이 적당히 빠르구나' 정도로 이해하고 넘어가주세요!