매일 BOJ

(매일 BOJ) C++ 1874번 스택 수열

norepinephrine 2025. 7. 16. 21:19

이번 문제는 실버 2 난이도의 1874번 스택 수열이다.

문제 요약

  • 1부터 N까지 오름차순으로 스택에 숫자를 넣고(push), 뽑아내(pop)면서 원하는 수열을 만들어야 함
  • 만들 수 있는 수열이면 +, - 연산을 출력하고, 불가능하면 NO 출력

접근법

입력 수열을 왼쪽부터 차례로 만들어야 함

  • ex) 입력: 4 3 6 8 7 5 2 1
  • 스택에는 오름차순 숫자만 넣을 수 있음 >> 백터로 입력 수열을 받는다.

"현재 스택의 top"이 목표 수열의 숫자와 일치할 때 pop

  • 아직 목표 숫자가 스택에 없으면 → 숫자를 push하면서 채움
  • 스택 top이 입력 숫자와 같으면 → pop
  • 더 큰 수가 필요하면 계속 push (1부터 N까지 오름차순이기 때문)
  • 더 작은 수인데 이미 pop된 숫자라면? → NO 출력

아래는 작성한 코드이다.

# include <bits/stdc++.h>
using namespace std;


int main(void){
    ios::sync_with_stdio(0); cin.tie(0);
    int N;
    cin >> N;
    vector<int> final;
    stack<int> s;
    vector<char> result;
    int temp = 1;
    for (int i  = 0; i < N; i++){
        int a;
        cin >> a;
        final.push_back(a);
    }

    for(int i = 0; i < N; i++){
        int a = final[i];

        while(temp <= a){
            s.push(temp);
            result.push_back('+');
            temp += 1;
        }

        if(s.top() == a){
            s.pop();
            result.push_back('-');
        }
        else{
            cout << "NO" << '\n';
            return 0;
        }
    }
    for (int i = 0; i < result.size(); i++){
        cout << result[i] << '\n';
    }
}