Posts 스택 [Python]
Post
Cancel

스택 [Python]

url : https://www.acmicpc.net/problem/10828

문제

  • 정수를 저장하는 스택을 구현한 다음, 입력으로 주어지는 명령을 처리하는 프로그램을 작성하시오.
  • 명령은 총 다섯 가지이다.
    • push X: 정수 X를 스택에 넣는 연산이다.
    • pop: 스택에서 가장 위에 있는 정수를 빼고, 그 수를 출력한다. 만약 스택에 들어있는 정수가 없는 경우에는 -1을 출력한다.
    • size: 스택에 들어있는 정수의 개수를 출력한다.
    • empty: 스택이 비어있으면 1, 아니면 0을 출력한다.
    • top: 스택의 가장 위에 있는 정수를 출력한다. 만약 스택에 들어있는 정수가 없는 경우에는 -1을 출력한다.

문제 풀이

  • 명령마다 if 문을 작성, input으로 데이터를 받으니 시간초과가 남
  • input 대신 sys의 stdin.readline()을 사용하면 시간이 더 빠르다고 하여 변경함
    • stdin.readline의 경우 for문을 돌면서 입력받을때 사용하면 메모리 및 시간측면에서 유용하다고 함
    • 다만 jupyter 환경에서는 테스트 하기가 어려움 (셀 단위 실행이라 readline이 안되는듯?)
  • 사실 명령어는 if문으로 실행하면 되서 어렵지 않음. 다만 시간초과를 어떻게 해결하느냐를 알려주기 위한 문제인듯
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
# input 대신 sys.stdin.readline() 사용
# sys.stdin.readline()은 \n 개행문자가 붙으므로, 형 변환이 필요함

import sys

stack = []

# 처음 N의 갯수 입력 
N = int(sys.stdin.readline())

for i in range(0, N):
    
    # command 입력 받음, push의 경우 뒤에 숫자가 있음.
    temp_command = sys.stdin.readline().split()
    command = temp_command[0]
    
    # push 명령어 실행
    if command == 'push':
        stack.append(int(temp_command[1]))
    
    # pop 명령어 실행
    elif command == 'pop':
        if len(stack):
            print(stack.pop())
        else:
            print(-1)

    # size 명령어 실행
    elif command == 'size':
        print(len(stack))
    
    # empty 명령어 실행
    elif command == 'empty':
        if len(stack):
            print(0)
        else:
            print(1)
    
    # top 명령어 실행
    elif command == 'top':
        if len(stack):
            print(stack[-1])
        else:
            print(-1)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
# input 때문에 시간초과가 남
stack = []
N = 14

for i in range(0, N):
    command = input()
    if command[:4] == 'push':
        stack.append(int(command.split()[1]))

    elif command == 'pop':
        if len(stack):
            print(stack.pop())
        else:
            print(-1)

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

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

    elif command == 'top':
        if len(stack):
            print(stack[-1])
        else:
            print(-1)
1
2
3
4
5
6
7
8
9
10
11
2
2
0
2
1
-1
0
1
-1
0
3
1
2
3
4
5
6
7
8
9
10
11
12
13
14
commands = ['push 1',
'push 2',
'top',
'size',
'empty',
'pop',
'pop',
'pop',
'size',
'empty',
'pop',
'push 3',
'empty',
'top',]
This post is licensed under CC BY 4.0 by the author.