본문 바로가기
알고리즘

[백준/C++] 5397번 키로거 List

by heyh0 2021. 12. 3.

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

 

5397번: 키로거

첫째 줄에 테스트 케이스의 개수가 주어진다. 각 테스트 케이스는 한줄로 이루어져 있고, 강산이가 입력한 순서대로 길이가 L인 문자열이 주어진다. (1 ≤ L ≤ 1,000,000) 강산이가 백스페이스를 입

www.acmicpc.net

// 코드

#include <bits/stdc++.h>
using namespace std;

int main(){
    ios_base::sync_with_stdio(0);
    cin.tie(0);
    int N;
    cin >> N;

    for(int i = 0; i < N; i++){
        list<char> l;
        string s;
        list<char>::iterator t = l.begin(); 
        // t에 list 시작 주소를 저장

        cin >> s; // 문자열 입력
        for(auto c : s){
            if(c == '<'){
                if(t != l.begin()) t--; 
                // t가 시작 주소가 아니라면 주소 -1
            }
            else if(c == '>'){
                if(t != l.end()) t++; 
                // t가 끝 주소가 아니라면 주소 +1
            }
            else if(c == '-'){
                if(t != l.begin()){
                t--;
                t = l.erase(t);
                } // t가 끝주소가 아니라면 - 앞에 있는 문자 삭제
            }
            else l.insert(t, c);
            // t 주소에 문자 c 삽입
        }
        //출력
        for(auto r : l) cout << r;
        if(i != N-1) cout << "\n";
    }
    return 0;
}

// 리뷰

List를 활용해서 풀었는데 전체적으로 보면 문자만 List에 저장해놓고

주소 값을 '<' 와 '>' 이면 주소를 움직이고 '-'는 바로 앞의 주소를 삭제한다.

List iterator에 대해서 조금씩 익숙해지는 느낌이다.