www.acmicpc.net/problem/1406

 

1406번: 에디터

첫째 줄에는 초기에 편집기에 입력되어 있는 문자열이 주어진다. 이 문자열은 길이가 N이고, 영어 소문자로만 이루어져 있으며, 길이는 100,000을 넘지 않는다. 둘째 줄에는 입력할 명령어의 개수

www.acmicpc.net


  • 처음엔 연결 리스트 자체를 직접 구현하려고 하였으나, STL 에 만들어진 좋은 자료구조가 있어서 활용하였다.
  • 현재 위치는 이터레이터로써 가지고 있는데, 해당 원소의 앞으로 생각하냐 뒤로 생각하냐에 따라서 구현이 달라진다.
  • 뒤로 놓을 경우 이런저런 귀찮은 조건들을 설정해주어야 했기 때문에, 깔끔하게 앞으로 생각하여 풀었다.
  • 다른분들의 풀이를 보니, 스택 등을 이용해서 풀면 더 시간적으로 빠르게 동작할 수 있는 듯 하다.
  • 양방향 연결 리스트 구현은 [자료구조] 카테고리에서 자바로 해보았다.

#include <iostream>
#include <list>

using namespace std;

int M;
string start;
char input, value;
list<char> dll;
list<char>::iterator cur;                   // 커서 위치는, 이터레이터의 원소와 앞 원소 사이 위치

int main(void)
{
    ios_base::sync_with_stdio(false);
    cin.tie(0);
    cout.tie(0);

    cin >> start;
    int N = start.size();
    for(int i = 0 ; i < N ; i++)
    {
        dll.push_back(start[i]);            // 처음 입력받는 문자열을 다 넣어준 뒤
    }
    cur = dll.end();                        // 커서를 맨 뒤로 옮김

    cin >> M;
    for(int i = 0 ; i < M ; i++)
    {
        cin >> input;
        switch (input)
        {
        case 'L':
            if(cur != dll.begin()) cur--;   // 맨 앞이 아닐 경우 커서 왼쪽으로 이동
            break;
        case 'D':
            if(cur != dll.end()) cur++;     // 맨 뒤가 아닐 경우 커서 오른쪽으로 이동
            break;
        case 'B':
            if(cur != dll.begin()) cur = dll.erase(--cur);  // 맨 앞이 아닐 경우, 앞의 원소 삭제 후 위치 갱신
            break;
        default:
            cin >> value;
            dll.insert(cur, value);         // 현재 위치에 원소 추가
            break;
        }
    }

    for(cur = dll.begin() ; cur != dll.end() ; cur++)
    {
        cout << *cur;
    }
    cout << endl;
}

'PS > BOJ' 카테고리의 다른 글

[백준] 2841 : 외계인의 기타 연주  (0) 2021.02.10
[백준] 14496 : 그대, 그머가 되어  (0) 2021.01.27
[백준] 1374 : 강의실  (0) 2021.01.22
[백준] 3258 : 컴포트  (0) 2021.01.21
[백준] 18352 : 특정 거리의 도시 찾기  (0) 2021.01.21

+ Recent posts