1874 스택 수열
https://www.acmicpc.net/problem/1874
1874번: 스택 수열
1부터 n까지에 수에 대해 차례로 [push, push, push, push, pop, pop, push, push, pop, push, push, pop, pop, pop, pop, pop] 연산을 수행하면 수열 [4, 3, 6, 8, 7, 5, 2, 1]을 얻을 수 있다.
www.acmicpc.net
내 풀이(맞음)
n = int(input())
ary = []
for i in range(n):
x = int(input())
ary.append(x)
lst = []
rst = []
i = 0#ary
j = 1#rst
while(True):
if lst and lst[-1] == ary[i]:
rst.append('-')
lst.pop()
i += 1
continue
if j == n+1:
break
lst.append(j)
j += 1
rst.append('+')
test = []
bol = []
l = 1
k = 0
for i in rst:
if i == '+':
test.append(l)
l += 1
else:
t = test.pop()
if t == ary[k]:
bol.append(t)
k += 1
else:
break
if ary == bol:
for i in rst:
print(i)
else:
print('NO')
ary에 만들어야 할 수열을 입력한다. lst는 1부터 넣어가는 리스트이고 rst는 +, -를 넣는 리스트이다. i는 ary, j는 rst의 위치 값을 나타낸다. 그리고 while문에서는 lst가 안비어 있고 마지막 숫자가 ary의 첫번째랑 같으면 rst에 -를 넣고 lst의 끝 값을 삭제하고 ary의 위치 값을 1 올린다. 그리고 j가 n+1이랑 같아지면 더 이상 조건문을 진행하지 않는다. 그리고 lst에 숫자를 넣고 다음 숫자로 바꿔준다. 그리고 rst에 +를 넣어준다.
그 다음에 test는 lst 처럼 넣어가는 리스트이고 bol는 ary와 같은지 확인해주는 리스트이다. for문에서 rst만큼 반복하면서 +이면 test에 l을 더해주고 다음 1을 더해준다. -이면 t에 test의 오른쪽 값을 삭제한 것을 저장하고 만약에 t가 ary[k]번째와 같으면 bol에 더해주고 k에 1을 더해 ary의 위치 값을 옮겨준다. 만약에 ary의 위치값과 다르면 종료한다.
그리고 ary와 bol이 같으면 정싱적으로 rst를 출력하고 아니면 NO를 출력한다.