BOJ

[BOJ] 1874. 스택 수열

rubato.dev 2025. 7. 17. 11:55

📌 문제 제목

문제 링크: BOJ 1874

🗒️ 문제 설명

임의의 수열이 주어졌을 때, 스택을 이용해 그 수열을 만들 수 있는지 없는지, 있다면 어떤 순서로 push와 pop연산을 수행해야 하는지 알아내는 프로그램

스택에 push 하는 순서는 반드시 오름차순.

시간 제한: 2초

메모리 제한: 128MB

1 <= n <= 100,000

같은 정수가 두 번 나오는 일은 없다.


💡 문제 해결 아이디어

  • push 하는 값을 저장하는 스택 필요
  • 입력된 수열을 순회하며 수열에 push 해야할 값과 비교
    • push 해야할 값이 수열의 i번째 값보다 작거나 같을 때까지 값을 증가
    • push 해야할 값이 수열의 i번째 값보다 크다면 스택의 마지막 원소와 i번째 값 비교
      • 같으면 pop
      • 다르면 NO

⌛️ 시간 복잡도

  • O(N)

✅ 최종 코드

import sys
input = sys.stdin.readline

n = int(input().strip())
seq = [int(input().strip()) for _ in range(n)]

result = []  # 스택
answer = []  # bool이 저장되는 배열 (True: push, False: pop)
x = 1

for s in seq:
    while x <= s:
        result.append(x)
        x += 1
        answer.append(True)

    if result[-1] == s:
        result.pop()
        answer.append(False)
    else:
        print("NO")
        exit(0)

for b in answer:
    print("+" if b else "-")