본문 바로가기

알고리즘/백준-파이썬

[백준] 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

 

문제가 이상한건지, 내 지능이 모자란건지 참 어렵게도 설명해놓았다.

검색해보니 나 뿐만아니라 다른 사람들도 어느정도 나와 의견이 맞는걸 보니 문제 제출자의 다분한 의도(?)가 느껴진다.

 

예제에 나와있는 대로 설명을 해본다.

 

첫 줄에 8을 입력받았다.

1, 2, 3, 4, 5, 6, 7, 8 <- 이 숫자들을 이용한다는 뜻이다.

 

두 번째 줄에 4를 입력받았다.

스택에 push하는 순서는 반드시 오름차순을 지키도록 한다고 하자.

 

라는 의미는 4를 push하기위해서는 1, 2, 3 숫자를 push 한 다음 4를 push해란 뜻이다.

 

  1. 스택.push(1)
  2. 스택.push(2)
  3. 스택.push(3)
  4. 스택.push(4)

현재 스택 = [1, 2, 3, 4]

그리고 마지막 숫자를 제거한다.

 

  1. 스택.pop()

현재 스택 = [1, 2, 3]

제거된 숫자가 입력받은 4와 같다면 통과 아니면 실패이다.

 

세 번째 줄에 3을 입력받았다.

1, 2, 3, 4, 5, 6, 7, 8 중 3은 이미 사용되었기 때문에 push할 수 없다.

마지막 숫자를 제거한다.

 

  1. 스택.pop()

현재 스택 = [1, 2]

제거된 숫자가 3이다. 통과이므로 계속 진행한다.

 

네 번째 줄에 6을 입력받았다.

6을 push하기 위해선 1, 2, 3, 4, 5를 먼저 push해야 한다.

그 중 1, 2, 3, 4는 이미 push를 했기 때문에 5만 하면 된다.

 

  1. 스택.push(5)
  2. 스택.push(6)

현재 스택 = [1, 2, 5, 6]

마지막 숫자를 제거한다.

 

  1. 스택.pop()

현재 스택 = [1, 2, 5]

제거된 숫자가 6이다. 통과이므로 계속 진행한다.

 

다섯번 째 줄에 8을 입력받았다.

 

  1. 스택.push(7)
  2. 스택.push(8)

현재 스택 = [1, 2, 5, 7, 8]

마지막 숫자를 제거한다.

 

  1. 스택.pop()

현재 스택 = [1, 2, 5, 7]

여섯번 째, 일곱번 째, 여덟번 째, 아홉번 째 숫자로 각각 7, 5, 2, 1을 입력받았고

이 숫자들은 스택의 마지막 숫자들이므로 

 

  1. 스택.pop()
  2. 스택.pop()
  3. 스택.pop()
  4. 스택.pop()

이렇게 되면 성공적인 로직이 되는것이다.

만약 pop한 숫자가 입력받은 숫자와 다르게 나오면 실패한 로직이므로 "NO"를 출력한다.

 

import sys

total_number = int(input())
stack = []
symbols = []
i = 1

for _ in range(total_number):  #
    input_number = int(sys.stdin.readline().strip())
    while i <= input_number:
        stack.append(i)
        symbols.append("+")
        i += 1
    if stack[-1] == input_number:
        stack.pop()
        symbols.append("-")
    else:
        print("NO")
        break
else:
    for symbol in symbols:
        print(symbol)