리셋 되지 말자

[백준 1874] 스택 수열 - 스택 본문

알고리즘

[백준 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)
Comments