일단, 문제를 풀 때 꼭 scanf 와 printf를 써야함을 다시금 깨닫게 만들어준 문제다. 귀찮더라도 적어도 알고리즘 문제를 풀 때는 scanf & printf를 사용해야겠다. 문제 자체의 원리는 간단했다. 스택을 사용하면 간단하게 해결되는 문제였다.
// 스택 수열
#include <iostream>
#include <cstdio>
#include <stack>
#include <vector>
using namespace std;
int n;
int arr[100001];
vector<char> sarr;
stack<int> st;
int main()
{
cin >> n;
for (int i = 1; i <= n; i++)
scanf("%d", &arr[i]);
int pushVal = 1; //넣어야 되는 수
for (int i = 1; i <= n; i++)
{
// 이번에 만들어야 하는 수열의 수 = t
int t = arr[i];
// 넣어야 되는 수보다 만들어야 하는 수가 크면 더 push 를 해야 한다.
// 만약에 넣어야 되는 수가 더 크면 이미 스택 top에 위치하고 있어야한다.
// 그렇지 않으면 error
if (pushVal <= t)
{
for (int j = pushVal; j <= t; j++)
{
st.push(j);
sarr.push_back('+');
}
pushVal = t + 1;
st.pop();
sarr.push_back('-');
}
else
{
if (st.empty())
{
cout << "NO" << endl;
return 0;
}
else
{
if (t != st.top())
{
cout << "NO" << endl;
return 0;
}
st.pop();
sarr.push_back('-');
}
}
}
for (int i = 0; i < sarr.size(); i++)
{
printf("%c\n", sarr[i]);
}
return 0;
}