[Baekjoon,1874]스택 수열

최대 1 분 소요

주어진 문제처럼 숫자를 1에서 부터 n까지 스택에 넣는데 이때 주어진 수열의 값이 나온 경우 pop해주면 된다. 만약 n까지의 수를 모두 연산한 후에 스택에 값이 남아있으면 수열을 만들 수 없기 때문에 빈 벡터를 반환하여 예외를 처리했다.

구현 시 스택에 -1을 먼저 넣음으로서 빈 스택의 top() 함수를 호출할 때 일어나는 버그를 잡아내었다. 그리고 입출력 값이 많아 scanf와 printf를 이용하였다.

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

const int MAX_N=100000;

int n,perm[MAX_N];

vector<char> getProcess()
{
    vector<char> ret;
    stack<int> st;
    int idx=0;
    st.push(-1);
    for(int i=1;i<=n;++i)
    {
        st.push(i);
        ret.push_back('+');
        while(idx<n && st.top()==perm[idx])
        {
            st.pop();
            ret.push_back('-');
            ++idx;
        }
    }
    // 스택으로 수열을 만들 수 없는 경우 
    if(st.top()!=-1)
        return vector<char>();
    
    return ret;
}

int main()
{
    cin>>n;
    for(int i=0;i<n;++i)
        scanf("%d",&perm[i]);
    
    vector<char> ret=getProcess();
    
    if(ret.empty())
        cout<<"NO"<<endl;
    for(int i=0;i<ret.size();++i)
        printf("%c\n",ret[i]);
    
    return 0;
}

댓글남기기