본문 바로가기
Problem Solving/BOJ

[Stack] 1874 스택 수열

by Bokoo14 2023. 1. 3.

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] 유사한 문제 - 주차 관리인

https://bokoo.tistory.com/11

 

[Stack] 주차 관리인

스택: LIFO(Last-In, FIrst-Out) 스택 정렬: 스택의 내용을 빈 스택 하나를 이용해서 정렬하는 알고리즘 강의교재에서 본 주차장의 주차 관리인에게 주차 주문이 도착했다. 이 주차 주문에 따르면, 1번

bokoo.tistory.com

 

'Problem Solving > BOJ' 카테고리의 다른 글

[Greedy] 1931 회의실 배정  (0) 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