문제링크:https://www.acmicpc.net/problem/1874
문제 해석: 일단 문제 자체에서 스택을 사용해, 1부터 n까지를 스택에 넣었다 뽑으면서, 입력으로 주어진 수열을 만들 수 있는지를 확인하고, 입력으로 주어진 수열을 만들 수 있다면, 어떤 순서로 push,pop 연산을 수행햐야 하는지를 출력하고,주어진 주열을 만들 수 없다면 NO를출력하면 된다.
문제 아이디어: 입력으로 주어진 수열을 vectorv 라는 벡터를 선언해 입력을 받고,
for문으로 1~n까지를 스택에 넣으면서 만들어야할 수열의 값이 있다면 스택에서 꺼내도록 풀었습니다.
연산은 수열을 만들 수 있는지 유무 판단 후, 만들 수 있을때, 연산 수행 순서를 출력해야 하기 때문에 큐를 사용해 연산 순서를 저장하도록 했습니다.
해결 코드
#include <iostream>
#include <algorithm>
#include <vector>
#include <stack>
#include <queue>
using namespace std;
int main(){
cin.tie(0);
cout.tie(0);
std::ios::sync_with_stdio(false);
stack<int>s;
int n;
cin>>n;
queue<char> res;
bool ch=true;
//스택에 쌓음
vector<int>v(n);
for(int i=0;i<n;i++){
cin>>v[i];
}
int index=0;
for(int i=1;i<=n;i++){
while(!s.empty()&&v[index]==s.top()){
res.push('-');
s.pop();
index++;
}
s.push(i);
res.push('+');
}
while(!s.empty()){
if(v[index]==s.top()){
res.push('-');
s.pop();
index++;
}else{
ch=false;
break;
}
}
if(ch==true){
while(!res.empty()){
cout<<res.front()<<"\n";
res.pop();
}
}
else{
cout<<"NO"<<"\n";
}
return 0;
}
더 좋은 문제풀이 아이디어가 있다면 공유해주세요!