

문제 출처 : https://www.acmicpc.net/problem/1874
문제가 이해가 조금 어려웠다.
우리는 1부터 N까지의 숫자를 가지고 있다.
이 숫자들을 스택(stack) 에 넣었다가(push) 꺼내며(pop)
입력으로 주어진 목표 수열을 만들 수 있는지 확인해야 한다.
만약 목표 수열을 만들 수 있다면,
우리가 했던 push/pop의 순서를 + / - 로 출력한다.
+-만들 수 없다면 NO를 출력한다.
목표 수열을 왼쪽부터 하나씩 처리한다고 하자.
지금 만들고 싶은 값이 x일 때:
아직 push하지 않은 다음 숫자가 next라면,
next <= x 인 동안 계속 push 해서 x가 스택 위에 올라오게 만든다. (+ 기록)
이제 스택의 top이 x이면 pop 한다. (- 기록)
그런데 top이 x가 아니라면?
그 순간은 불가능하다.
왜냐하면:
-> NO를 출력해줘야 한다.
목표: 4 3 6 8 7 5 2 1
초기 상태: 스택 [], next=1
+ → [1]+ → [1,2]+ → [1,2,3]+ → [1,2,3,4]4에서 pop 을 해준다.
- → [1,2,3]- → [1,2]+ → [1,2,5]+ → [1,2,5,6]- → [1,2,5]+ → [1,2,5,7]+ → [1,2,5,7,8]- → [1,2,5,7]- → [1,2,5]- → [1,2]- → [1]- → []이렇게 끝까지 가능하면, 우리가 기록한 +/- 를 그대로 출력하면 된다.
목표 수열이 3 1 2 라고 해보자 (N=3)
초기: 스택 [], next=1
+ → [1]+ → [1,2]+ → [1,2,3]- → [1,2]근데 지금 스택 top은 2다.
스택은 top에서만 pop 할 수 있으니 1을 꺼내려면 2를 먼저 꺼내야 한다.
하지만 목표는 “지금 당장 1”이라서
2를 먼저 꺼내는 순간 목표 수열이 깨진다.
→ 그래서 이 경우는 불가능, NO
import sys
input = sys.stdin.readline
n = int(input().strip())
targets = []
for _ in range(n):
targets.append(int(input()))
# targets = [4, 3, 6, 8, 7, 5, 2, 1]
stack = []
ops = []
cur_num = 1
for x in targets:
# x가 스택에 올라올 때 까지 push 한다.
while cur_num <= x:
stack.append(cur_num)
ops.append("+")
cur_num += 1
# 이제 스택 top이 x면 pop 해준다.
if stack and stack[-1] == x:
stack.pop()
ops.append("-")
# 스택에 올라올 때 까지 push했는데도, 스택에 top이 x가 아니라는 것은 x를 꺼낼 바업이 없다.
else:
print("NO")
sys.exit(0)
print("\n".join(ops))