백준 1874 파이썬 스택 수열

 

처음엔 문제를 아예 이해 못했다..

 

문제를 해석해보자면

입력된 수열 X = [4, 3, 6, 8, 7, 5, 2, 1] 이 있고

스택 Y에 1부터 순서대로 넣었다가 뒤에서부터 빼서 X 수열을 만들 수 있는지를 물어보는 거였다

 

push 한 번 하면 Y = [1], 두 번 하면 Y = [1, 2] 처럼 되고

출력된 예시처럼 push를 4번 한 이후에는 Y = [1, 2, 3, 4]가 되고,

다섯번째 출력처럼 pop을 하면 X[0]과 같은 값이 나온다

이런 식으로 push, pop 하면서 X[N]까지 하면 되는 것,,

 

 

import sys

N = int(sys.stdin.readline())
X = []

# 입력 받아서 리스트에 저장
for i in range(N):
    X.append(int(sys.stdin.readline()))

Y = []
Z = [i for i in range(1, N + 1)]

out = [] # 출력할 +, - 기호 저장할 리스트
A = True

i = 0
while i != len(X): # i == len(X) 가 되면 끝내기
    if len(Y) == 0: # Y에 아무것도 없다면 push
        if len(Z) != 0: # Z에 남은 데이터 가져오기
            Y.append(Z[0])
            del Z[0]
            out.append('+')
        else: # Z에 남은 데이터가 없다면 끝내기
            break
    elif X[i] == Y[-1]: # Y의 마지막 데이터가 X의 i번째와 같다면 pop
        Y.pop()
        out.append('-')
        i += 1

    else:
        if X[i] < Y[-1]: 
            A = False
            i = len(X)
            break
        else:
            if len(Z) != 0:
                Y.append(Z[0])
                del Z[0]
                out.append('+')
            else:
                out.append('+')

if not A:
    print('NO')
else:
    for i in range(len(out)):
        print(out[i])