Programming/백준
[백준 1874][Stack][파이썬] 스택 수열 - 풀이 및 답안
문제
https://www.acmicpc.net/problem/1874
풀이
목적은 Stack에 입력받는 1 ~ N 까지의 수를 무작위로 중복되지 않게 입력값을 주었을 때 남김없이 Push, Pop 연산을 통해 스택을 비울수 있는를 묻는 문제이다.
(입력 예제 1.) 수열이 성립하는 경우
규칙에 따라 Push 연산과 Pop 연산을 수행 하였을 때, Stack은 모두 비워지고, 1~8까지의 모든 수가 Stack을 걸쳐 나갈 수 있다. 이 때 수열이 성립한다고 이 문제에서 정의한다.
(입력 예제 2.) 수열이 성립하지 않는 경우
아래 경우, Input 3 과정에서, 이미 4라는 숫자가 추가되고 제외되었다. 5라는 숫자까지 진행했기에 4라는 숫자를 입력받았을 때 Pop(-) 연산이 작용되어야 한다. 그러나, Stack은 비워져 있기에 Push(+) 연산을 작용해야 하는데 이는 문제 조건의 오름차순 조건에 위배된다.
답안 코드
import sys
# N 입력받기
N = int(input())
current =0
stack=[0]
answer=[]
# 수열 입력받기
for _ in range(N):
# Boundary Condition (stack, current, target)
target = int(sys.stdin.readline().strip())
# (+) When current < target
while current < target:
current += 1
stack.append(current)
answer.append('+')
# Current = Target 에 도달했을 때 마지막 값을 빼줌
if current ==target:
stack.pop()
answer.append('-')
# Current 값이 Target 값보다 작은 경우
if current > target:
#오름차순 수열에 위반되는 경우 i.e current > target인데, Push(+)가 수행되는 경우
if stack[-1] < target:
stack.append(-1)
break
while stack[-1] >= target:
stack.pop()
answer.append('-')
# 답 출력
if len(stack) !=1:
answer = 'NO'
print(answer)
else:
for method in answer:
print(method)
'Programming > 백준' 카테고리의 다른 글
[백준 11004][정렬][파이썬] K번째 수 구하기 (0) | 2022.08.05 |
---|---|
[백준 2579][DP][파이썬] 계단오르기 - 풀이 및 답안 (0) | 2022.06.05 |
[백준 1912][DP][파이썬] 연속합 (feat. 카데인(Kadane) 알고리즘) (0) | 2022.06.03 |
[백준 24446][BFS][파이썬] 알고리즘 수업 - 너비 우선 탐색 3 (정점 방문 깊이 구현) (0) | 2022.04.17 |
[백준 24444][BFS][파이썬] 알고리즘 수업 - 너비 우선 탐색 1 (정점 방문 순서 구현) (0) | 2022.04.17 |
댓글