https://www.acmicpc.net/problem/1874
1874번: 스택 수열
1부터 n까지에 수에 대해 차례로 [push, push, push, push, pop, pop, push, push, pop, push, push, pop, pop, pop, pop, pop] 연산을 수행하면 수열 [4, 3, 6, 8, 7, 5, 2, 1]을 얻을 수 있다.
www.acmicpc.net
풀이 과정
1 ~ n 까지의 수를 스택에 오름차순으로 쌓다가 필요한 수를 stack top에서 뽑아쓸 수 있다.
3, 2, 1은 스택 수열인가? push, push, push, pop, pop, pop을 하면 3, 2, 1이 나오니 스택 수열이다. 그렇다면 3, 1, 2는 스택 수열인가? push, push, push, pop까지는 했는데 stack top에 1이 있으니 2를 꺼낼 수 없으니 스택 수열이 아니다.
1. 현재의 stack top에 있는 수보다 큰 수를 꺼내야 하면 push를 계속 해서 큰 수를 쌓다가 원하는 수가 나오면 pop을 하면 된다.
2. 현재의 stack top과 같은 수를 꺼내야 하면 그냥 pop 한번 해서 수를 꺼내면 된다.
3. 현재의 stack top보다 작은 수를 꺼내야 한다면?
작은 수는 stack top 밑의 어딘가에 깔려있다. stack top을 꺼내지 않고서는 꺼낼 방법이 없다. 따라서 입력받은 수를 스택을 통해 만들면서, 현재의 stack top보다 작은 수를 요구하는 입력이 나온다면 스택 수열로 만들 수 없는 수열이라고 판단하면 된다.
코드
import sys
n = int(input())
stack = [0]
topInput = 0
noCount = False
output = []
for i in range(n):
inPu = int(sys.stdin.readline())
if inPu > stack[-1]:
while inPu > stack[-1]:
output.append('+')
topInput += 1
stack.append(topInput)
output.append('-')
del stack[-1]
elif inPu == stack[-1]:
output.append('-')
del stack[-1]
else: noCount = True
if noCount: print('NO')
else:
for i in output:
print(i)
'알고리즘 문제 풀이 > 백준' 카테고리의 다른 글
백준 9093 - 단어 뒤집기 [파이썬] (0) | 2022.03.23 |
---|---|
백준 1158 - 요세푸스 문제 [파이썬] (0) | 2022.03.23 |
백준 10845 - 큐 [파이썬] (0) | 2022.03.20 |
백준 9012 - 괄호 [파이썬] (0) | 2022.03.18 |
백준 10828 - 스택 [파이썬] (0) | 2022.03.18 |