#include <iostream>
#include <vector>
#include <stack>
using namespace std;
int main()
{
int num;
vector<int> OrderStack; // 입력스택
vector<int> NumQueue; // 기준 큐
stack<int> TmpStack; // 임시스택
vector<string> answer; // 정답스택
cin >> num;
for(int i=1; i <= num; i++)
{
int tmp;
cin >> tmp;
// 4 3 6 8 7 5 2 1
OrderStack.push_back(tmp);
// 1 2 3 4 5 6 7 8
NumQueue.push_back(i);
}
for(int i=0; i < OrderStack.size(); i++)
{
while(1)
{ // 스택의 상단과 인풋값이 맞을때 까지
if(TmpStack.empty() || TmpStack.top() != OrderStack[i])
{
TmpStack.push(NumQueue[0]);
if(!NumQueue.empty())
NumQueue.erase(NumQueue.begin());
else
break;
answer.push_back("+");
}
else if(TmpStack.top() == OrderStack[i])
{
TmpStack.pop();
answer.push_back("-");
break;
}
}
}
if(!TmpStack.empty())
{
answer.clear();
answer.push_back("NO");
}
for(auto el : answer)
cout << el << '\n';
}
#include <iostream>
#include <vector>
#include <stack>
#include <queue>
using namespace std;
// 입력 저장 스택
// 기본 N까지의 수열스택
// 임시로 담아둘 스택
// 정답에 입력할 스택
int main()
{
int num;
queue<int> OrderQueue; // 입력 큐
queue<int> NumQueue; // 기준 큐
stack<int> TmpStack; // 임시스택
vector<string> answer; // 정답스택
// 수열 스택 입력
cin >> num;
for(int i=1; i <= num; i++)
{
int tmp;
cin >> tmp;
// 4 3 6 8 7 5 2 1
OrderQueue.push(tmp);
// 1 2 3 4 5 6 7 8
NumQueue.push(i);
}
for(int i=0; i < num; i++)
{
while(!OrderQueue.empty())
{ // 임시스택이 비어있을경우나 스택의 상단과 인풋값이 맞을때 까지
if(TmpStack.empty() || TmpStack.top() != OrderQueue.front())
{ // TmpStack : 1 2 3 4
TmpStack.push(NumQueue.front());
// NumQueue : 5 6 7 8
if(!NumQueue.empty())
NumQueue.pop();
else
break;
answer.push_back("+");
}
else if(TmpStack.top() == OrderQueue.front())
{ // TmpStack : 1 2 3 [4].. pop
TmpStack.pop();
answer.push_back("-");
OrderQueue.pop();
break;
}
}
}
if(!TmpStack.empty())
{
answer.clear();
answer.push_back("NO");
}
for(auto el : answer)
cout << el << '\n';
}
정답 스택 입력 ... ‘ - ‘
즉. ‘ - ‘ 는 임의의 수열의 원소가 처리 되었다는 뜻 !
n = 8
임의의 수열 : [ 4 3 6 8 7 5 2 1 ]
기준 수열 : [ 1 2 3 4 5 6 7 8 ]
임시 수열 : [ ]
vector로 stack이나 queue를 구현하는 것 보다 라이브러리를 이용하는게 훨씬 계산 속도가 빠르다.