본문 바로가기

Algoritm

[백준] 1874번: 스택 수열 (python)

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

  • 이 문제의 경우, 처음에 손으로 직접 적어보고서 하니까 코드를 더 잘 적을 수 있었다.
  • 경우를 크게 3가지로 나누었고, 마지막에 스택에 원소가 남아있을 경우 'NO'를 출력하도록 하였다. 
    1. 스택이 비어있을 경우, 즉 처음의 상황(push)
    2. 스택의 맨 위의 원소가 입력받은 숫자보다 더 작을 때(push)
    3. 스택의 맨 위의 원소가 입력받은 숫자와 같을 때 (pop)
import sys
input = sys.stdin.readline

n = int(input().rstrip())
n_list = []
mark = []
add = 0

for i in range(1,n+1):
  x = int(input().rstrip())

  if not n_list: #n_list가 비었다면 (제일 처음에)
    for j in range(i,x+1): # 입력받은 숫자까지 스택에 원소를 push
      add = j+1
      n_list.append(j)
      mark.append('+')

  elif n_list[-1] < x: # 스택의 맨 윗 원소가 입력받은 숫자보다 작을 경우 (해당 숫자가 될때까지 push)
    for j in range(add,x+1): # 한번 더했던건 넘어가야 하는데, 또 더함 --> 이를 방지하기 위해 add사용
      add = j+1
      n_list.append(j)
      mark.append('+')

  if n_list[-1] == x: # 스택의 맨 윗 원소 == 입력받은 숫자 일때, pop
    n_list.pop()
    mark.append('-')


if not n_list: # 입력된 수열을 만들 수 있는 경우 (스택이 비었을 경우)
  for i in mark:
    print(i)
else: # 입력된 수열을 만들 수 없는 경우
  print('NO')

'Algoritm' 카테고리의 다른 글

[백준]10870번: 피보나치 수5(python)  (0) 2022.09.27
[백준] 2178번 : 미로 탐색 (python)  (0) 2022.07.12
[백준] 1021번: 회전하는 큐 (python)  (0) 2022.07.06
[백준] 10866번: 덱 (python)  (0) 2022.07.06
덱(Deque)  (0) 2022.06.26