본문 바로가기
Programming Solve/BOJ

BOJ 1874 - 스택 수열 / C++

by msm1029 2022. 4. 8.
반응형

문제 링크 : 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

 

 

풀이

입력받은 숫자들은 우리가 만들고자하는 숫자들이다.

이를 배열에 저장해두고 스택을 통해 만들어야 하기 때문에 스택도 생성해준다.

 

조건에 따라 스택을 통해 순서대로 만들려면

배열(v)의 idx를 0부터 늘려가며 v[idx]의 수를 만들어 스택에 push해야 한다.

 

테스트 케이스의 예시를 보면,

[4, 3, 6, 8, 7, 5, 2, 1]를 만들어야 하고

스택은 아래와 같이 변한다.
[1, 2, 3, 4] -> 4 pop
[1, 2, 3] -> 3 pop
[1, 2, 5, 6] -> 6 pop
[1, 2, 5, 7, 8] -> 8 pop
[1, 2, 5, 7] -> 7, 5, 2, 1 순으로 pop할 수 있다.
 
다시 알고리즘으로 표현해보면
1. 현재 인덱스의 숫자까지 값(cur)을 늘려준다.
2. 늘렸다면, 스택의 top값은 현재 인덱스의 숫자와 같을 것이고, 이를 pop한다.
3. 다음 인덱스로 넘어가서 같은 작업을 반복한다.
4. 만약 이 과정에서 top값이 현재 인덱스의 숫자와 같지 않거나 스택이 비어있다면 불가능한 경우이므로 NO를 출력한다.
 
 

구현

#include <iostream>
#include <stack>
#include <vector>
using namespace std;

int main(){
    ios_base::sync_with_stdio(false);
    cin.tie(nullptr); cout.tie(nullptr);

    int n;
    cin >> n;

    stack<int> st;
    vector<char> ans;
    vector<int> v;
    bool flag = false; //만들 수 없을 시 true

    for(int i=0; i<n; i++){
        int tmp;
        cin >> tmp;
        v.push_back(tmp);
    }

    int cur = 1, idx = 0;
    while(idx < n){
        if(cur > n + 1){
            flag = true;
            break;
        }

        while(v[idx] >= cur){
            st.push(cur++);
            ans.push_back('+');
        }

        if(!st.empty()){
            if(st.top() == v[idx]){
                st.pop();
                ans.push_back('-');
            }
            else {
                flag = true;
                break;
            }
        }
        else {
            flag = true;
            break;
        }

        idx++;
    }


    if(flag){
        cout << "NO";
    }
    else {
        for(int i=0; i<ans.size(); i++){
            cout << ans[i] << '\n';
        }
    }
}

 

반응형

'Programming Solve > BOJ' 카테고리의 다른 글

BOJ 1157 - 단어 공부 / Swift  (0) 2022.04.08
BOJ 1152 - 단어의 개수 / Swift  (0) 2022.04.08
BOJ 9663 - N-Queen / C++  (0) 2022.03.28
BOJ 14888 - 연산자 끼워넣기 / C++  (0) 2022.03.28
BOJ 1913 - 달팽이 / C++  (0) 2022.03.22