ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • 백준 1406 - 에디터
    백준 algorithm 2020. 2. 25. 21:56

    문제 설명

     

     

     

    stack을 사용하여 풀 수 있는 문제이다. 

     

    stack 두 개를 사용하여 커서를 표현 할 수 있다. 
    커서는 언제나 leftStack과 rightStack 사이에 있다. 

    L : leftStack.top을 rightStack으로 옮긴다. 
    D: rightStack.top을 leftStack으로 옮긴다. 
    B: leftStack.top을 삭제한다. 

    P : leftStack에 해당하는 char를 추가한다. 

     

    Print () : rightStack은 pop하는 순서대로 뽑아도 무방하다. 하지만 leftStack은 pop하는 반대 순서로 print해야 한다. 본인은 vector를 사용하여 간단하게 활용하였다. leftStack을 deque 를 사용하였다면 더 간단히 해결할 수 있을 듯 하다.

     

     

     

    #include <iostream>
    #include <stack>
    #include <string>
    #include <vector>
    
    using namespace std;
    
    stack<char> leftStack, rightStack;
    
    
    void Lcursor()
    {
        if(leftStack.empty())return;
        else{
            rightStack.push(leftStack.top());
            leftStack.pop();
        }
    }
    
    void Dcursor()
    {
        if(rightStack.empty())return;
        else{
            leftStack.push(rightStack.top());
            rightStack.pop();
        }
    }
    
    void Delete()
    {
        if(leftStack.empty())return;
        else{
            leftStack.pop();
        }
    }
    
    void Add()
    {
        char addChar;
        cin >> addChar;
        leftStack.push(addChar);
    }
    
    void Print()
    {
        vector<char> leftStackVector;
        while(!leftStack.empty())
        {
            leftStackVector.push_back(leftStack.top());
            leftStack.pop();
        }
        for(int i=leftStackVector.size()-1; i>=0; --i)
        {
            cout<<leftStackVector[i];
        }
        
        while(!rightStack.empty())
        {
            cout<<rightStack.top();
            rightStack.pop();
        }
        cout<<'\n';
    }
    int main()
    {
        ios_base::sync_with_stdio(false);
        cin.tie(nullptr);
        cout.tie(nullptr);
        
        string first;
        cin>>first;
        
        int N;
        cin>> N;
        
        for(int i=0; i<first.length(); ++i)//pushing elements into leftStack
        {
            char c= first[i];
            leftStack.push(c);
        }
        
        for(int j=0; j<N; ++j)
        {
            char c;
            cin>> c;
            if(c=='L')Lcursor();
            else if(c=='D')Dcursor();
            else if(c=='B')Delete();
            else
            {
                Add();
            }
        }
        
        Print(); //print all elements of stacks
        return 0;
    }
    
    

    '백준 algorithm' 카테고리의 다른 글

    백준 - 17413 단어 뒤집기 2  (0) 2020.03.02
    백준 1158 - 요세푸스 문제  (0) 2020.02.26
    백준 1874 - 스택 수열  (0) 2020.02.21
    백준 9012 - 괄호  (0) 2020.02.21
    백준 9093 - 단어 뒤집기  (0) 2020.02.20

    댓글

Designed by Who.