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해란 뜻이다.
- 스택.push(1)
- 스택.push(2)
- 스택.push(3)
- 스택.push(4)
현재 스택 = [1, 2, 3, 4]
그리고 마지막 숫자를 제거한다.
- 스택.pop()
현재 스택 = [1, 2, 3]
제거된 숫자가 입력받은 4와 같다면 통과 아니면 실패이다.
세 번째 줄에 3을 입력받았다.
1, 2, 3, 4, 5, 6, 7, 8 중 3은 이미 사용되었기 때문에 push할 수 없다.
마지막 숫자를 제거한다.
- 스택.pop()
현재 스택 = [1, 2]
제거된 숫자가 3이다. 통과이므로 계속 진행한다.
네 번째 줄에 6을 입력받았다.
6을 push하기 위해선 1, 2, 3, 4, 5를 먼저 push해야 한다.
그 중 1, 2, 3, 4는 이미 push를 했기 때문에 5만 하면 된다.
- 스택.push(5)
- 스택.push(6)
현재 스택 = [1, 2, 5, 6]
마지막 숫자를 제거한다.
- 스택.pop()
현재 스택 = [1, 2, 5]
제거된 숫자가 6이다. 통과이므로 계속 진행한다.
다섯번 째 줄에 8을 입력받았다.
- 스택.push(7)
- 스택.push(8)
현재 스택 = [1, 2, 5, 7, 8]
마지막 숫자를 제거한다.
- 스택.pop()
현재 스택 = [1, 2, 5, 7]
여섯번 째, 일곱번 째, 여덟번 째, 아홉번 째 숫자로 각각 7, 5, 2, 1을 입력받았고
이 숫자들은 스택의 마지막 숫자들이므로
- 스택.pop()
- 스택.pop()
- 스택.pop()
- 스택.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)
'알고리즘 > 백준-파이썬' 카테고리의 다른 글
[백준] 10845번 (python 파이썬) (0) | 2022.04.05 |
---|---|
[백준] 1406번 (python 파이썬) (0) | 2022.04.05 |
[백준] 9012번 (python 파이썬) (0) | 2022.04.04 |
[백준] 9093번 (python 파이썬) (0) | 2022.04.04 |
[백준] 10828번 (python 파이썬) (0) | 2022.04.04 |