본문 바로가기

Coding Test

백준 5397 키로거

https://www.acmicpc.net/problem/5397

#include <iostream>
#include <stack>

using namespace std;

int main() {

    ios::sync_with_stdio(false);
    cin.tie(NULL);
    cout.tie(NULL);

    int t;

    cin >> t;

    for (int test = 0; test < t; test++) {
        string s;
        string ans;

        cin >> s;


        stack<char> st;
        for (int i = 0; i < s.size(); i++) {

            if (s[i] == '<') {
                if (!ans.empty()) {
                    st.push(ans.back());
                    ans.pop_back();
                }
            }
            else if (s[i] == '>') {
                if (!st.empty()) {
                    ans.push_back(st.top());
                    st.pop();
                }
            }
            else if (s[i] == '-') {
                if (!ans.empty()) {
                    ans.pop_back();
                }
            } else {
                ans.push_back(s[i]);
            }

        }

        while (!st.empty()) {
            ans.push_back(st.top());
            st.pop();
        }

        cout << ans << "\n";

    }

    return 0;
}

1. 문제

테스트 케이스의 수 t와 그 수만큼의 문자열이 주어진다. <는 키보드의 왼쪽, >는 오른쪽, -는 백스페이스라 할 때, 실제로 작성되는 문자를 출력하는 문제이다.

2. 풀이

if (s[i] == '<') {
    if (!ans.empty()) {
        st.push(ans.back());
        ans.pop_back();
    }
}

 왼쪽 방향키를 입력했을 경우 뒤에서부터 적용되고, 오른쪽 방향키를 누를 경우 앞에서부터 적용되므로 스택을 이용한다. 왼쪽 방향키를 입력했을 경우 이를 스택에 저장한다. 그 후, 순서를 위해 ans 배열의 맨 뒤를 없앤다. 

else if (s[i] == '>') {
    if (!st.empty()) {
        ans.push_back(st.top());
        st.pop();
    }
}

 오른쪽 방향키를 입력했을 경우 왼쪽 방향키를 눌러서 스택에 넣은 것을 다시 꺼내어 ans 배열에 넣는다.

else if (s[i] == '-') {
    if (!ans.empty()) {
        ans.pop_back();
    }
}

 백스페이스를 입력받았을 경우 해당 문자(커서 바로 앞의 문자)를 지운다.

else {
    ans.push_back(s[i]);
}

 문자를 입력받았을 경우 이를 추가한다.

 

while (!st.empty()) {
    ans.push_back(st.top());
    st.pop();
}

 

 

 연산이 끝난 후 커서 뒤의 문자는 지워진 것이 아니므로 이를 차례로 꺼내어 ans 배열에 저장한다. 이를 출력하면 정답을 구할 수 있다.

'Coding Test' 카테고리의 다른 글

백준 1927 최소 힙  (0) 2024.06.20
백준 5430 AC  (0) 2024.06.19
백준 22942 데이터 체커  (0) 2024.06.17
백준 2493 탑  (1) 2024.06.16
백준 2504 괄호의 값  (1) 2024.06.15