본문 바로가기
알고리즘/스택 \ 큐 \ 덱

#7 [파이썬] 백준 10828번 문제: 스택

by 채채씨 2021. 4. 6.
728x90
반응형

<문제>

www.acmicpc.net/problem/10828

10828번: 스택

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

www.acmicpc.net


 

<소스코드>

 

import sys

n = int(input())

stack = []

for i in range(n):
    command = sys.stdin.readline().strip()

    if command.split()[0] == 'push':
        stack.append(command.split()[1])

    elif command == 'top':
        if not stack:
            print('-1')
        else:
            print(stack[-1])

    elif command == 'size':
        print(len(stack))

    elif command == 'pop':
        if not stack:
            print('-1')
        else:
            print(stack[-1])
            stack.pop()

    elif command == 'empty':
        if not stack:
            print('1')
        else:
            print('0')

 


 

<NOTE>

 

1. 데이터 입력 받기

보통 데이터를 입력 받을 때 input()으로 받지만 입력의 개수가 많은 경우, 반복문으로 여러줄을 input()으로 받으면 시간초과가 발생할 수 있다. 이때 sys.stdin.readline()을 사용하면 빠른 속도로 데이터를 받을 수 있다.

 

 

2. 공백 및 개행문자 제거

rstrip()은 문자열 오른쪽 끝에있는 공백이나 개행문자를 제거한다. input()이든 sys.stdin.readline()이든 한 줄의 문자열 단위로 입력을 받으므로 개행문자가 포함되어있다. 따라서 rstrip()을 통해 제거해주었다. input().split() 또는 sys.stdin.readline().split()을 하면 문자열내의 공백을 기준으로 split되어 리스트에 저장되고 문자열 끝의 공백이나 개행문자는 제거된다.

 

 

3. 입력받을 때 split()을 하지 않은 이유

이 문제에서 command를 sys.stdin.readline().split()으로 받지 않은 이유는 push를 제외한 다른 명령어는 split()할 필요가 없기 때문에, push명령어에서만 split()을 해주기 위해서이다. 만약 sys.stidn.readline().split()으로 받으면 모든 명령어에 접근할 때 리스트의 원소로 접근해야하기 때문이다. ex) command[0] == 'size'

 

 

4. 빈 리스트 조건문

'리스트가 비어있으면'이라는 조건문은 if not 리스트: 로 작성할 수 있다. 

if not stack: 

 

아래와 같이 리스트 길이로 리스트가 비어있는지를 확인하는 것은 권장하지 않는다.

if len(stack) == 0:

 

 

728x90
반응형

댓글