백준 1874 스택수열

hyoJeong·2021년 6월 29일
0

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

더 좋은 문제풀이 아이디어가 있다면 공유해주세요!

0개의 댓글