▼ 문제 설명
- 문제
정수를 저장하는 스택을 구현한 다음, 입력으로 주어지는 명령을 처리하는 프로그램을 작성하시오.
명령은 총 다섯 가지이다.
- 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])'백준' 카테고리의 다른 글
| [백준] 10845 : 큐 - Python [파이썬] (0) | 2024.09.23 |
|---|---|
| [백준] 1406 : 에디터 - Python [파이썬] (1) | 2024.09.10 |
| [백준] 1874 : 스택 수열 - Python [파이썬] (0) | 2024.07.25 |
| [백준] 9012 : 괄호 - Python [파이썬] (0) | 2024.07.04 |
| [백준] 9093 : 단어 뒤집기 - Python [파이썬] (0) | 2024.07.04 |
댓글