알고리즘
[백준 1874] 스택 수열 - 스택
kyeongjun-dev
2022. 1. 19. 18:01
코드
def solution(arr):
# stack에 차례대로 넣을 수 배열
nums = [i for i in range(1, len(arr)+1)]
# nums의 index
nums_idx = 0
stack = []
# push, pop 연산 순서 저장
cals = []
# flag가 True이면 NO 출력
flag = False
# pop을 해야하는 타겟 숫자를 차례대로 순회
for target in arr:
while True:
# stack이 비어있거나, stack의 맨 위가 target과 다르면 nums를 append
if len(stack) == 0 or stack[-1] != target:
# target을 pop할 수 없으면, flag를 True로 변경한 뒤 break로 반복문 탈출
if nums_idx == len(arr):
flag = True
break
stack.append(nums[nums_idx])
# append 연산인 +를 추가
cals.append('+')
# append를 했으니 추가할 수 있는 숫자에 대한 index를 1 증가
nums_idx += 1
# stack이 비어있지 않고, stack의 맨 위에 있는 수자와 target이 같으면 pop
elif len(stack) >= 1 and stack[-1] == target:
stack.pop()
# pop 연산인 -를 추가
cals.append('-')
break
# flag가 True이면 수열을 완성할 수 없으므로 NO 출력
if flag:
print('NO')
# flag가 False이면 수열을 완성할 수 있으므로 cals에 저장된 연산을 차례대로 출력
else:
for cal in cals:
print(cal)
n = int(input())
arr = []
for _ in range(n):
arr.append(int(input()))
solution(arr)