본문 바로가기
ALGORITHM/C++ - 백준

[백준 5397] 키로거

by DDongYeop 2023. 11. 14.
728x90

문제

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

 

5397번: 키로거

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

www.acmicpc.net

 

 

문제 분석

문자열이 주어지고, 그 안에 <, >, -들이 섞여 있다. 

 

커서가 존재하고, '<'면 오른쪽으로, '>'면 왼쪽으로 움직인다. '-'가 입려되면 바로 앞에 있는 값을 지운다. 

 

하나의 커서가 있다고 생각하면 편하다. 

 

 

알고리즘 설계

입력받을 문자열 str과 몇개의 문자열을 받을지 알려줄 정수형 변수 num을 선언한다. 

 

num을 입력 받고 그 수 만큼 반복문을 돌린다. 

반복문 안에서 char 인수로 가지는 연결 리스트 li과 그의 iterator iter를 선언하고, str을 입력 받는다. 

 

str의 size만큼 반복문을 돌리고 그 중 <, >이 있다면 iter를 하나 빼주거나 올리고, -라면 해당 iter의 위치에 있는 값을 지운다. 

다른 문자라면 해당 iter에 추가한다. 

 

 

유의점

연결리스트, iterator에 대한 이해가 필요하다. 

 

 

코드

#include<iostream>
#include<list>
#include<algorithm>
using namespace std;

int main()
{
    cin.tie(nullptr);
    cout.tie(nullptr);
    ios::sync_with_stdio(false);

    string str;
    int num, index;
    cin >> num;

    for (int i = 0; i < num; ++i)
    {
        list<char> li;
        list<char>::iterator iter = li.begin();
        cin >> str;
        for (int j = 0; j < str.size(); ++j)
        {
            switch (str[j])
            {
            case '<':
                if (iter != li.end())
                    ++iter;
                break;
            case '>':
                if (iter != li.begin())
                    --iter;
                break;
            case '-':
                if (iter != li.end())
                    iter = li.erase(iter);
                break;
            default:
                iter = li.insert(iter, str[j]);
                break;
            }
        }
        li.reverse();

        for (auto l : li)
            cout << l;
        cout << '\n';
    }

    return 0;
}
728x90

'ALGORITHM > C++ - 백준' 카테고리의 다른 글

[백준 1654] 랜선 자르기  (1) 2023.11.24
[백준 2805] 나무 자르기  (1) 2023.11.22
[백준 1920] 수 찾기  (1) 2023.11.13
[백준 25192] 인사성 밝은 곰곰이  (1) 2023.11.13
[백준 11004] K번째 수  (0) 2023.11.13

댓글