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',]