함수 하나씩 만들어가면서 천천히 풀이하면 되는 문제
스택 자체를 구현하는 문제이다
괄호문제에서 설명했듯이, Stack 은 Last in Frist Out (LIFO) 구조를 띈다.
쉽게 생각하면 한쪽 면이 막힌 원통을 생각하면 된다.
따라서 마지막에 들어간 원소가 제일 먼저 나올 수 있는 구조가 되는 것이다.
코드는 아래처럼 작성했는데,
input()
함수를 사용하는 것 보다
import sys
sys.stdin.readline().strip()
이용하는 것이 속도면에서 빠르다고 한다. (그래서 처음에 단순히 input 으로 입력을 받았다가 시간초과에 걸렸다.)
input() 과 sys.stdin.readline().strip() 에서 시간 차이가 발생하는 이유
- input() 은 사용자로부터 한 줄을 입력받고, 그 후에 개행 문자 ('\n')를 제거하는 방식으로 입력을 읽는다. 따라서 입력을 받을 때마다 개행문자('\n')를 기다리는 동안 프로그램이 block 될 수 있다.
- sys.stdin.readline()은 한 줄을 읽어오고 개행문자까지 포함되어 반환된다. input()에서와는 달리 개행문자를 따로 제거하는 과정이 없기 때문에 조금 더 빠르다.
- 그래서 개행문자를 제거하기 위해 .strip()를 사용하여 받아온다.
- input().strip()을 이용하면 input()만 사용하는 것 보다는 조금 더 빠르게 입력을 처리할 수 있지만, 여전히 sys.stdin.readline().strip() 보다는 성능이 떨어질 수 있다.
Python code
import sys
n = int(input())
num_list = []
def push(x):
num_list.append(x)
return num_list
def pop() :
if len(num_list) == 0 :
return print(-1)
else :
print(num_list[-1])
num_list.pop()
return num_list
def size():
return print(len(num_list))
def empty():
if len(num_list) == 0 :
return print(1)
else :
return print(0)
def top():
if len(num_list) == 0 :
return print(-1)
else :
return print(num_list[-1])
for i in range(n):
cmd = sys.stdin.readline().strip().split()
if cmd[0] == 'push' :
push(int(cmd[1]))
elif cmd[0] == 'pop' :
pop()
elif cmd[0] == 'size' :
size()
elif cmd[0] == 'empty' :
empty()
elif cmd[0] == 'top':
top()
'알고리즘과 자료구조 > 매일매일 알고리즘' 카테고리의 다른 글
[백준] 10799 번 쇠막대기 (스택) (3) | 2024.04.04 |
---|---|
[백준] 11726번 DP - 파이썬 (오버플로우) (0) | 2024.04.01 |
[백준] 9012번 괄호 (1) | 2024.01.23 |
11. 카드 역배치 (0) | 2024.01.04 |
10. 문자열에서 숫자만 추출하기 (1) | 2024.01.04 |