1. 출제 문제
스택의 기본 개념에 대해 알아볼 수 있는 문제이다. 스택의 기본적인 구조를 익혀 보았다.
https://www.acmicpc.net/problem/10828
10828번: 스택
첫째 줄에 주어지는 명령의 수 N (1 ≤ N ≤ 10,000)이 주어진다. 둘째 줄부터 N개의 줄에는 명령이 하나씩 주어진다. 주어지는 정수는 1보다 크거나 같고, 100,000보다 작거나 같다. 문제에 나와있지
www.acmicpc.net
2. 조건 확인
주어지는 명령어 N개에 대해 해당 작동을 수행한다.
- push X: 정수 X를 스택에 넣는 연산이다.
- pop: 스택에서 가장 위에 있는 정수를 빼고, 그 수를 출력한다. 만약 스택에 들어있는 정수가 없는 경우에는 -1을 출력한다.
- size: 스택에 들어있는 정수의 개수를 출력한다.
- empty: 스택이 비어있으면 1, 아니면 0을 출력한다.
- top: 스택의 가장 위에 있는 정수를 출력한다. 만약 스택에 들어있는 정수가 없는 경우에는 -1을 출력한다.
3. 접근 방법
- push : 리스트.append()를 수행한다.
- pop : len(리스트) != 0이라면 수, len(리스트) == 0이라면 -1을 수행한다.
- size : len(리스트)를 수행한다.
- empty : len(리스트)!=0이라면 0, len(리스트)==0이라면 1을 출력한다.
- top : len(리스트) !=0이라면 리스트[-1], len(리스트)==0이라면 -1을 출력한다.
4. 문제 해결
import sys
def push(arr):
stack.append(arr[1])
def pop(arr):
if len(stack) != 0:
print(stack.pop())
else:
print(-1)
def size(arr):
print(len(stack))
def empty(arr):
if len(stack) != 0:
print(0)
else:
print(1)
def top(arr):
if len(stack) != 0:
print(stack[-1])
else:
print(-1)
N = int(sys.stdin.readline())
stack = []
for i in range(N):
arr = sys.stdin.readline().split()
if arr[0] == 'push':
push(arr)
elif arr[0] == 'pop':
pop(arr)
elif arr[0] == 'size':
size(arr)
elif arr[0] == 'empty':
empty(arr)
else:
top(arr)
5. 최적화 방안
처음 for문을 통해 구현했더니 시간 초과가 났다.
많은 수의 명령어의 경우 모든 조건식을 하나씩 확인해 가며 진행하는 부분에서 시간 초과가 났다고 생각한다.
따라서 각각의 함수를 선언해 조건문에서 걸리는 시간을 줄여가는 것이 핵심인 것 같다.
추후에 더 나은 방향을 생각해 봐야 겠다.
'알고리즘 > 백준' 카테고리의 다른 글
[트리] 5639번 : 이진 검색 트리 (0) | 2023.03.19 |
---|---|
[트리] 1991번 : 트리 순회 (0) | 2023.03.19 |
[스택] 10773번 : 제로 (0) | 2023.03.09 |
[스택] 9012번 : 괄호 (0) | 2023.03.09 |
[문자열] 2557번 : Hello World (0) | 2023.03.03 |