바킹독 스택 강의를 공부하고 푼 문제. 처음에 문제부터 이해가 안 가서 엉뚱하게 코드 짜고 고민하다가 보니까 친절하게 설명해준 글이 있어서 다시 했다.
문제를 이해하고 나면 어려운 문제는 아니었다. 입력받은 수열이 있고, 1~n까지의 숫자가 있을 때 이 오름차순의 숫자를 스택에 넣고 빼는 작업을 해서 입력받은 수열을 만들면 된다.
배열의 인덱스를 음수로 지정하면 끝에서부터 탐색을 할 수 있다.
예) a[-1]
은 배열의 마지막 원소
import sys
input = sys.stdin.readline
n = int(input()) # 수열의 길이
a = [] # 수열
# 수열 입력받기
for i in range(n) :
a.append(int(input()))
index = 0 # 스택의 숫자를 제거할 기준이 될 수열 원소의 인덱스
s = [] # 스택
result = [] # +, -를 저장할 결과 배열
for i in range(1, n + 1) :
# 일단 스택에 숫자 push
s.append(i)
result.append('+')
# 스택에 남은 숫자가 있고 top이 수열의 index번째인 동안 pop
while s and s[-1] == a[index] :
s.pop()
result.append('-')
index += 1
if s : # 스택에 숫자가 남아 있으면 수열을 만들지 못하는 것이므로 NO 출력
print('NO')
else : # 아니면 result 배열 출력
for e in result :
print(e)