개발 지식/알고리즘

[백준] 5397 키로거

트리맨스 2021. 7. 5. 01:06
반응형

 

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

 

5397번: 키로거

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

www.acmicpc.net

문제를 읽어보고 오자.

 

커서를 옮기면서 문자열을 삽입 혹은 제거하는 문제이다. 이 문제는 길이가 최대 100만인 만큼, 동작함에 있어서 최소한의 계산만 있어야 한다. 나의 경우에는 중간에 삽입하는 과정 때문에 list 자료형을 사용하기로 했다.

 

리스트 구조는 내부적으로 링크드 리스트 구조를 가지고 있어서 중간에 삽입하는 구조에 대하여 상당히 유리하다. iterator만 잘 다루면 간단히 풀 수 있다.

 

로직은 '<' 문자에 대하여 iter를 앞으로, '<' 문자에 대하여 iter를 뒤로, '-' 문자에 대하여 삭제연산, 숫자 또는 영어가 나왔을 때 해당 인덱스에 삽입하는 식으로 간단히 로직을 구성했다.

 

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
#include <bits/stdc++.h>
using namespace std;
 
int main()
{
    ios::sync_with_stdio(0);
    cin.tie(0);
    cout.tie(0);
 
    int num;
    string input;
 
    cin >> num;
    while (num--)
    {
        cin >> input;
        list<char> s;
        auto idx = s.begin();
 
        for (auto c : input)
        {
            if (c == '<' && idx != s.begin())
                idx--;
            else if (c == '>' && idx != s.end())
                idx++;
            else if (c == '-' && idx != s.begin())
                idx = s.erase(--idx);
            else if (isalpha(c) || isdigit(c))
                s.insert(idx, c);
        }
        for (auto c : s)
            cout << c;
        cout << "\n";
    }
    return (0);
}
cs

 

요즘들어 드는 생각인데, 문자열 처리에 대해서 내가 너무 힘들어하는 것 같다. C++ 문자열 처리에 대한 연습을 꾸준히 해야겠다.

 

반응형

'개발 지식 > 알고리즘' 카테고리의 다른 글

LeetCode 790. Domino and Tromino Tiling  (0) 2022.12.24
[백준] 5430 AC  (0) 2021.07.05
[백준] 1927 최소 힙  (0) 2021.06.30
[백준] 1406 에디터  (0) 2021.06.21
[백준] 4963 섬의 개수  (0) 2021.06.19