10828번: 스택

Shawn Kang·2021년 1월 10일
0

BOJ with Python 3

목록 보기
1/1

문제

개요

정수를 저장하는 스택을 구현한 다음, 입력으로 주어지는 명령을 처리하는 프로그램을 작성하시오.
명령은 총 다섯 가지이다.

  • 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을 사용해야 했습니다. readlineinput보다 실행 시간이 빠르기 때문입니다. (관련 내용은 아래 읽어보기에서 간단히 다루었으니 여기서는 넘어가겠습니다.)

단, readline은 개행 문자까지 입력받으므로, 이를 제거하고 싶다면 문자열 내 공백을 제거해주는 strip 계열 메소드를 같이 사용해주는게 좋습니다. strip 외에도 splitinput에서 적용하던 메소드를 모두 적용할 수 있습니다.

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])

읽어보기

inputreadline의 실행 시간 비교해보기

위에서 소개한 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)

이상의 코드를 활용해 readlineinput의 실행 시간을 비교해 보았습니다. 입력은 '1'로 주었고, 각 명령어 당 10번 실행하여 평균을 내 보았습니다. 그 결과는 다음과 같습니다:

inputsys.stdin.readline()보다 약 1.23배 느린 것을 확인할 수 있습니다. 다만 이는 언제까지나 간단한 비교를 위해 대충 코딩하여 제시한 수치입니다. 그냥 'sys.stdin.readline()이 적당히 빠르구나' 정도로 이해하고 넘어가주세요!

profile
i meant to be

0개의 댓글