[문제]
https://www.acmicpc.net/problem/1874
[풀이]
재밌는 문제였다. (내가 한 번에 풀면 재밌는 문제 아니면 재미없는 문제 ^^~)
stack은 숫자 값을, result는 '+' 혹은 '-' 값을 담을 리스트이다.
next_turn은 pop한 뒤 다시 숫자를 쌓기 시작할 때 어느 수부터 쌓는지 기억하는 변수이다.
예를 들어 1, 2, 3, 4를 append 한 후 차례대로 4를 pop, 3을 pop 했다. 그 후 다시 숫자를 쌓아야 할 때는 5부터 쌓기 시작한다. next_turn은 숫자 5를 저장하는 변수이다. 숫자는 1부터 쌓기 시작하니 1로 초기화해주었다.
flag는 예제대로 나오기 불가능한 경우에 False값이 된다.
- 순서대로 나와야하는 수열을 sequence 리스트로 만들어놓는다.
- 첫 번째 줄에서 받은 입력값 n을 기준으로, sequence를 차례대로 돈다.
- stack이 비어있거나 sequence[i] 보다 stack의 마지막 값이 작은 경우
- 쌓아야 하는 숫자부터 현재 차례인 sequence값+1 만큼 stack에 추가한다.
- result에는 '+'를 추가한다.
- next_turn를 sequence+1 값으로 덮어씀
- stack의 마지막 값이 sequence[i] 보다 큰 경우
- flag를 False로 변경
- 반복문 탈출
- stack의 마지막 값과 sequence[i]가 같은 경우
- stack의 마지막 값을 꺼낸다.
- result에는 '-' 추가
- flag가 True면 결과 출력, False면 "NO"출력
[코드]
import sys
if __name__ == '__main__':
n = int(sys.stdin.readline())
sequence = [int(sys.stdin.readline()) for _ in range(n)]
stack = []
result = []
next_turn = 1
flag = True
for i in range(n):
# 스택에 아무 값도 없을 때 혹은
# 스택 마지막 값이 현재 pop 되어야 할 값보다 작을 때
if len(stack) == 0 or stack[-1] < sequence[i]:
for j in range(next_turn, sequence[i] + 1):
stack.append(j)
result.append("+")
next_turn = sequence[i] + 1
# 스택 마지막 값이 현재 pop 되어야 할 값보다 클 때
elif stack[-1] > sequence[i]:
flag = False
break
# 스택 마지막 값 == 현재 pop 되어야 할 값
if stack[-1] == sequence[i]:
stack.pop()
result.append("-")
if flag:
print("\n".join(result))
else:
print("NO")
'문제풀이 > BOJ' 카테고리의 다른 글
[Python] BOJ/백준 1436번 영화감독 숌 (0) | 2021.08.03 |
---|---|
[Python] BOJ/백준 2231번 분해합 (0) | 2021.08.03 |
[Python] BOJ/백준 10816번 숫자 카드 2 (2) | 2021.07.28 |
[Python] BOJ/백준 1237번 정ㅋ벅ㅋ (0) | 2021.07.28 |
[Python] BOJ/백준 11650번 좌표 정렬하기 (0) | 2021.07.28 |