알고리즘/Python
[백준] 파이썬 python - 1874번 : 스택 수열
조이은
2023. 12. 24. 16:38
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
1874번: 스택 수열
레벨 실버 2. 스택 / 자료 구조
접근 방식
1. 가장 먼저 입력받았을 경우
- 해당 숫자까지 오름차순으로 stack에 push(+) 한 후, 해당 숫자를 pop(-) 한다.
2. stack이 비었지만, stack에 저장한 경력이 있을 경우
- 마지막으로 push한 숫자부터, 현재 입력받은 숫자까지 stack에 push(+)한 후, 해당 숫자를 pop(-) 한다.
3. 현재 입력받은 숫자와 stack의 top 숫자가 일치할 경우
- 해당 숫자를 stack에서 pop(-)한다.
4. stack이 비지 않았으며, 입력받은 숫자가 한번도 stack에 저장된 적 없을 경우
- 마지막으로 push한 숫자부터, 현재 입력받은 숫자까지 stack에 push(+)한 후, 해당 숫자를 pop(-) 한다.
5. 위의 모든 과정이 끝난 후, stack이 비었다면 가능한 경우이므로 push와 pop의 결과를 출력한다.
6. stack이 비지 않았다면 불가능한 경우이므로 "NO"를 출력한다.
코드
import sys
input = sys.stdin.readline
stack = []
n = int(input())
result = []
now = 0 # 스택에 넣은 마지막 숫자를 저장
for i in range(1, n+1) :
num = int(input())
if now == 0 and len(stack) == 0 : # 가장 먼저 입력받은 숫자
for j in range(num):
stack.append(j+1)
result.append("+")
now = num
result.append("-")
stack.remove(num)
elif now != 0 and len(stack) == 0 : # 스택이 비었지만, 초기상태는 아닐 때
for j in range(now+1, num+1) :
result.append("+")
stack.append(j)
stack.remove(num)
result.append("-")
now = num
elif len(stack)!= 0 and stack[-1] == num: # 입력받은 숫자와 스택의 top이 일치할 때
stack.remove(num)
result.append("-")
elif len(stack)!= 0 and num > stack[-1] : # 입력받은 숫자가 한번도 stack에 들어온 적 없었을 때
for j in range(now+1, num+1) :
result.append("+")
stack.append(j)
now = num
stack.remove(num)
result.append("-")
if len(stack) == 0 : #스택이 비었을 때는 가능
for i in result:
print(i)
else: #스택에 숫자가 남아있을 경우는 불가능
print("NO")
처음엔 봤을 때 조금 당황스러웠는데 조금만 생각하니까 답이 나왔다.
나 어쩌면 성장한 거일지도
사실 스택이나 자료 구조 문제는 좀 풀기 수월한 것 같다. 실버2를 잘 풀었음에 감사합니다..