PS-Algorithm/Algorithm

[스택] BOJ-1406 에디터

su8y 2021. 11. 20. 23:03

# 풀이

스택을 생각하면 아주 간단한 구현으로 풀수있는 문제이다. 

하나의 스택을 만들어 주고 그리고 다른 하나를 만들어준다. 

abc를 넣는다고 가정을 해본다면가 될것이다. -> 그리고

c  
b  
a  

커서를 왼쪽으로 옮기면 첫번째 스택에서 값을 빼와서 두번째스택에 넣고 이와 동시에 입력을 하면 첫번째 스택에 들어가게된다.

e  
b  
a c

 

반대로 커서를 오른쪽으로 옮긴다고 치면

c  
e  
b  
a  

이와같이 실행하여서 아래와 같은 값이 들어갔다고 치면

g  
e  
b f
a c

첫번째 스택에다가 두번째 스택의 값을 빼와서 abegfc가 되어서 완료가 되는 것이다.

# 실패

문제 코드에서 보면 반복문은 vStack.size() 만큼 반복을 하는데 동시에 vStack.pop_back()을 하여서 size가 줄어들어 문제가 생겼었다.

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

vector<char> solve(vector<char> answers);

int main(){
    string str;
    cin >> str;
    vector<char> v;
    for(int i = 0; i < str.length(); i++){
        v.push_back(str[i]);
    }
    solve(v);
    return 0;
}
vector<char> solve(vector<char> answers){
    vector<char> result;
    vector<char> vStack;
    char chr;
    int n;
    char chr2;
    cin >> n;
    cin.ignore();

    for(int i = 0 ; i < n; i++){
        cin >> chr;
        cin.ignore();
        switch (chr) {
            case 'L':
                if(!answers.empty()){
                    vStack.push_back(answers.back());
                    answers.pop_back();
                    // answers.erase(answers.end()-1);
                }
                break;
            case 'D':
                if(!vStack.empty()){
                    answers.push_back(vStack.back());
                    vStack.pop_back();
                }
                break;
            case 'B': 
                if(!answers.empty()){
                    answers.pop_back(); 
                }
                break;
            case 'P': 
                cin >> chr2;
                cin.ignore();
                answers.push_back(chr2);
                break;
        }
    }
    // 문제코드
    // for(int i =0; i< vStack.size();i++){
    //     answers.push_back(vStack.back());
    //     vStack.pop_back();
    // }
    while(!vStack.empty()){
        answers.push_back(vStack.back());
        vStack.pop_back();
    }
    vector<char>::iterator it;
    for(it = answers.begin(); it != answers.end(); it++){
        cout << *it;
    }
    return result;
}
반응형