[백준] 10828번 스택

백준 10828

 

함수 하나씩 만들어가면서 천천히 풀이하면 되는 문제

스택 자체를 구현하는 문제이다

 

괄호문제에서 설명했듯이, Stack 은 Last in Frist Out (LIFO) 구조를 띈다.

쉽게 생각하면 한쪽 면이 막힌 원통을 생각하면 된다.

따라서 마지막에 들어간 원소가 제일 먼저 나올 수 있는 구조가 되는 것이다.

 

코드는 아래처럼 작성했는데,

input()

 

함수를 사용하는 것 보다

import sys
sys.stdin.readline().strip()

 

이용하는 것이 속도면에서 빠르다고 한다. (그래서 처음에 단순히 input 으로 입력을 받았다가 시간초과에 걸렸다.)

 

 

input() 과 sys.stdin.readline().strip() 에서 시간 차이가 발생하는 이유

  • input() 은 사용자로부터 한 줄을 입력받고, 그 후에 개행 문자 ('\n')를 제거하는 방식으로 입력을 읽는다. 따라서 입력을 받을 때마다 개행문자('\n')를 기다리는 동안 프로그램이 block 될 수 있다.
  • sys.stdin.readline()은 한 줄을 읽어오고 개행문자까지 포함되어 반환된다. input()에서와는 달리 개행문자를 따로 제거하는 과정이 없기 때문에 조금 더 빠르다.
    • 그래서 개행문자를 제거하기 위해 .strip()를 사용하여 받아온다.
    • input().strip()을 이용하면 input()만 사용하는 것 보다는 조금 더 빠르게 입력을 처리할 수 있지만, 여전히 sys.stdin.readline().strip() 보다는 성능이 떨어질 수 있다.

Python code

 

import sys

n = int(input())
num_list = []

def push(x):
    num_list.append(x)
    return num_list

def pop() : 
    if len(num_list) == 0 :
        return print(-1)
    
    else : 
        print(num_list[-1])
        num_list.pop()
        return num_list
    
def size():
    return print(len(num_list))

def empty():
    if len(num_list) == 0 :
        return print(1)
    else : 
        return print(0)
    
def top():
    if len(num_list) == 0 :
        return print(-1)
    else : 
        return print(num_list[-1])


for i in range(n):
    cmd = sys.stdin.readline().strip().split()
    if cmd[0] == 'push' :
        push(int(cmd[1]))
    elif cmd[0] == 'pop' :
        pop()
    elif cmd[0] == 'size' :
        size()
    elif cmd[0] == 'empty' :
        empty()
    elif cmd[0] == 'top':
        top()