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
import sys
input = sys.stdin.readline
n = int(input())
find = []
for i in range(n):
find.append(int(input()))
stack = [] # 임의의 스택
number = [i for i in range(1, n+1)] # 1~n까지의 수 => 스택에 넣었다 뺴면서 원하는 수열을 완성할 수 있는지 check
answer=[]
plusminus=[]
index=0
while number:
stack.append(number.pop(0)) # 일단 스택에 넣음 -> +
plusminus.append("+")
while stack and stack[-1]==find[index]:
index+=1
answer.append(stack.pop()) # 스택의 제일 위의 값이 찾는 값과 일치 -> -
plusminus.append("-")
while stack:
answer.append(stack.pop()) # 스택에서 뻄 -> +
plusminus.append("-")
if find == answer:
for i in plusminus:
print(i)
else:
print("NO")
일단 스택에 1~n의 값을 집어넣고 스택의 가장 위의 값과 찾는 값을 비교
-> 찾는 값과 일치하면 스택에서 빼고, answer에 append
-> 찾는 값과 일치하지 않으면 그 다음 값을 스택에 넣음
마지막에 스택에 값이 남아있다면 모두 answer에 LIFO형태로 넣어줌
find와 answer가 같다면? push, pop연산을 저장한 값들을 출력
같지 않다면? 스택을 만들 수 없다는 뜻이므로 "NO"출력
[ref] 유사한 문제 - 주차 관리인
[Stack] 주차 관리인
스택: LIFO(Last-In, FIrst-Out) 스택 정렬: 스택의 내용을 빈 스택 하나를 이용해서 정렬하는 알고리즘 강의교재에서 본 주차장의 주차 관리인에게 주차 주문이 도착했다. 이 주차 주문에 따르면, 1번
bokoo.tistory.com
'Problem Solving > BOJ' 카테고리의 다른 글
[Greedy] 1931 회의실 배정 (1) | 2023.01.04 |
---|---|
[DP] 1912 연속합 (0) | 2023.01.04 |
[Stack] 4949 균형잡힌 세상 (0) | 2023.01.03 |
[Brute Force] 7568 덩치 (1) | 2023.01.03 |
[DP] 11660 구간합구하기5 (1) | 2023.01.02 |