[백준] 10828 : 스택 - Python [파이썬]

    ▼ 문제 설명

    더보기

    - 문제

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

    명령은 총 다섯 가지이다.

    • push X: 정수 X를 스택에 넣는 연산이다.
    • pop: 스택에서 가장 위에 있는 정수를 빼고, 그 수를 출력한다. 만약 스택에 들어있는 정수가 없는 경우에는 -1을 출력한다.
    • size: 스택에 들어있는 정수의 개수를 출력한다.
    • empty: 스택이 비어있으면 1, 아니면 0을 출력한다.
    • top: 스택의 가장 위에 있는 정수를 출력한다. 만약 스택에 들어있는 정수가 없는 경우에는 -1을 출력한다.

    - 입력

    첫째 줄에 주어지는 명령의 수 N (1 ≤ N ≤ 10,000)이 주어진다. 둘째 줄부터 N개의 줄에는 명령이 하나씩 주어진다. 주어지는 정수는 1보다 크거나 같고, 100,000보다 작거나 같다. 문제에 나와있지 않은 명령이 주어지는 경우는 없다.

    - 출력

    출력해야하는 명령이 주어질 때마다, 한 줄에 하나씩 출력한다.

    - 예제입력

    14
    push 1
    push 2
    top
    size
    empty
    pop
    pop
    pop
    size
    empty
    pop
    push 3
    empty
    top
    

     

    - 예제출력

    2
    2
    0
    2
    1
    -1
    0
    1
    -1
    0
    3

    풀이

    파이썬의 List와 append(), pop(), len() 함수를 이용하여 간단하게 스택을 구현 하였다.

    명령횟수와 명령어를 input()으로 받았을 때 시간초과 문제가 발생하였다.

    이에 대한 해결방안은 sys.stdin.readline() 을 사용하는 것이다.

     

    input() 이 sys.stdin.readline() 보다 느린 이유는 크게 두가지이다.

    1. 불필요한 처리

    input()은 문자열 입력받기 이외에도 프롬프트 메시지 출력할 수 있도록 설계되어 추가적인 시간이 소요 된다.

    2. 개행 문자 처리

    input()은 \n 과 같은 문자열 끝에 개행 문자를 자동으로 제거하기 때문에 추가적인 시간이 소요된다.

     

    아래 코드 중 "command = sys.stdin.readline().strip().split()"에서 strip()은 문자열 양 옆에 공백과 개행문제를 제거한다. 

    strip()이 없어도 코드는 정삭 작동 하지만 split() 으로 만들어진 리스트에 예상치 못하게 개행문자가 들어가 오류가 발생할 수 있기 때문에 항상 strip()을 사용하는 습관을 들이자.

     

    코드

    import sys
    n = int(sys.stdin.readline())   #명령어가 주어지는 횟수
    stack = []                      #숫자를 저장할 스택
    
    for i in range(n):
        command = sys.stdin.readline().strip().split()
        #명령어를 받아 공백 기준으로 나누어 리스트 생성 
        # ex)["push", "1"]
        
        
        #각 함수 구현
        if command[0] == "push":
            stack.append(command[1])
        elif command[0] == "pop":
            if len(stack) == 0:
                print("-1")
            else:
                print(stack.pop())
        elif command[0] == "size":
            print(len(stack))
        elif command[0] == "empty":
            if len(stack) == 0:
                print("1")
            else:
                print("0")
        elif command[0] == "top":
            if len(stack) == 0:
                print("-1")
            else:
                print(stack[len(stack)-1])

    댓글