본문 바로가기
Problem Solving/BOJ

백준 5397번 키로거 - C++ 풀이

by 어멘드 2022. 9. 8.
반응형

 

1. 커서 앞쪽 문자와 뒤쪽 문자를 분리하여 각각 스택에 저장한다.
2. -가 들어오면 앞쪽 스택에서 pop 하고, 알파벳이 들어오면 앞쪽 스택에 push 한다.
3. >가 들어오면 뒤쪽 스택에서 하나를 pop 해 앞쪽 스택에 push 하고, <가 들어오면 앞쪽 스택에서 pop 해 뒤쪽 스택에 push 한다.

 

1. 커서 앞쪽 문자와 뒤쪽 문자를 분리하여 각각 스택에 저장한다.

 문자의 추가와 삭제는 항상 커서 위치에서 발생한다. 따라서 커서를 기준으로 앞쪽 문자들과 뒤쪽 문자들을 분리하여 각각 스택에 저장한다. 이때 커서와 가까운 순으로 push/pop 되므로, 앞쪽 스택의 경우 실제 문자열의 역순으로 운영됨에 유의한다.

 

2. -가 들어오면 앞쪽 스택에서 pop하고, 알파벳이 들어오면 앞쪽 스택에 push 한다.

 백스페이스가 들어오면, 커서 앞에 있는 문자를 하나 지워야 한다. 따라서 앞쪽 스택에서 pop을 해준다. 알파벳이 들어오는 경우, 커서 앞에 문자 하나가 추가되므로 앞쪽 스택에 해당 알파벳을 push 한다.

 

3. >가 들어오면 뒤쪽 스택에서 하나를 pop 해 앞쪽 스택에 push 하고,<가 들어오면 앞쪽 스택에서 pop 해 뒤쪽 스택에 push 한다.

 >가 들어오면 커서가 한 칸 뒤로 이동한다. 커서 바로 뒤에 있던 알파벳이 커서 앞으로 가는 것과 같다. 따라서 뒤쪽 스택에서 하나를 pop해 앞쪽 스택에 push 한다. <의 경우 반대로 커서가 한 칸 앞으로 이동하므로 커서 바로 앞에 있던 문자가 커서 뒤로 가는 것과 같다. 따라서 앞쪽 스택에서 하나를 pop해 뒤쪽 스택에 push 한다.

반응형

#include <iostream>
#include <algorithm>
#include <cstring>
#include <stack>
#include <queue>

using namespace std;

string solution(string keylog) {
    stack<char> forth;  
    stack<char> back;   
    
    for (auto c: keylog) {
        switch (c) {
            case '-':
                if (!forth.empty()) forth.pop();
                break;
            case '<':
                if (!forth.empty()) {
                    back.push(forth.top());
                    forth.pop();
                }
                break;
            case '>':
                if (!back.empty()) {
                    forth.push(back.top());
                    back.pop();
                }
                break;
            default:
                forth.push(c);
                break;
        }
    }
    
    string ret = "";
    
    while (!forth.empty()) {
        ret += forth.top();
        forth.pop();
    }
    
    reverse(ret.begin(), ret.end());
    
    while (!back.empty()) {
        ret += back.top();
        back.pop();
    }
    
    return ret;
}

int main()
{
    ios_base::sync_with_stdio(false);
    cin.tie(NULL); cout.tie(NULL);
    
    int T; cin >> T;
    while (T--) {
        string s;
        cin >> s;
        cout << solution(s) << "\n";
    }

    return 0;
}

 

반응형

댓글