article thumbnail image
Published 2023. 1. 10. 19:52

문제 설명

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

 

1406번: 에디터

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

www.acmicpc.net

초기에 편집기에 있는 문자열이 주어지고, 명령어가 주어지면 해당 명령어에 맞게 수행 한 후의 문자열을 구하기

 

문제 풀이법

처음에는 vector로 풀었다

예제에 있는 답은 맞았지만 5% 즈음부터 시간초과로 실패하고 말았다

 

vector가 아닌 list로 풀어야 시간초과가 안난다고 한다

그 이유는 vector는 연속적인 배열이기에 중간에 요소가 하나 제거된다면, 당겨야 하는 상황이 발생한다고 한다

따라서 맨 앞과 끝을 제외한 삽입/제거는 느리다고 한다

 

반면에 list는 doubly linked list로 구현되어 있기에, 어느 위치에서도 삽입 제거가 빠르다고 한다

 

처음에 string을 입력 받고 list에 넣어주는 작업을 한다

이때 커서는 맨 뒤의 요소로 정한다

 

총 n번 반복하면서 명령어를 처리해준다

  •  L 
    • 커서가 맨 앞의 요소인지 확인 후, 아니라면 cur-- 해준다
  • D
    • 커서가 맨 뒤의 요소인지 확인 후, 아니라면 cur++ 해준다
  • B
    • 커서가 맨 앞의 요소인지 확인 후, cur--해준 후 그 값을 erase한다 
  • P $
    • P가 들어오면 문자 하나를 입력 받은 후 insert한다

 

소스 코드

#include <iostream>
#include <list>

using namespace std;

int main()
{
    string str;
    int n;
    
    getline(cin, str);
    cin >> n;
    
    list<char> l;
    
    for (int i = 0; i < str.size(); i++)
        l.push_back(str[i]);
        
    auto cur = l.end();
    
    for (int i = 0; i < n; i++)
    {
        char c;
        cin >> c;
        
        if (c == 'L')
        {
            if (cur != l.begin())
                cur--;
        }
        
        else if (c == 'D')
        {
            if (cur != l.end())
                cur++;
        }
        
        else if (c == 'B')
        {
            if (cur != l.begin())
                cur = l.erase(--cur);
        }
        
        else if (c == 'P')
        {
            char tmp;
            cin >> tmp;
            l.insert(cur, tmp);
        }
    }
    
    for (auto i : l)
        printf("%c",i);
    
    
    
    return 0;
}

 

 

vector를 사용해서 풀었지만 시간초과가 난 풀이

#include <iostream>
#include <vector>

using namespace std;

int main()
{
    string str;
    int n;
    int cur = 0;
    
    getline(cin, str);
    cin >> n;
    
    vector<char> v;
    
    while (str[cur])
    {
        v.push_back(str[cur]);
        cur++;
    }
    
    for (int i = 0; i < n; i++)
    {
        char c;
        
        cin >> c;
        
        if (c == 'L')
        {
            if (cur != 0)
                cur--;
        }
        else if (c == 'D')
        {
            if (cur != v.size())
                cur++;
        }
        else if (c == 'B')
        {
            if (cur != 0)
            {
                v.erase(v.begin() + cur - 1);
                cur--;
            }
        }
        else if (c == 'P')
        {
            char tmp;
            
            cin >> tmp;
            v.insert(v.begin() + cur, tmp);
            cur++;
        }
    }
    
    for (int i = 0; i < v.size(); i++)
    {
        printf("%c",v[i]);
    }
    
    
    return 0;
}

'Algorithm Study' 카테고리의 다른 글

[백준] 1158 요세푸스 문제  (0) 2023.01.10
[백준] 5397 키로거  (0) 2023.01.10
[백준] 1919 애너그램 만들기  (0) 2023.01.09
[백준] 11328 Strfry  (0) 2023.01.09
[백준] 13300 방 배정  (0) 2023.01.09
복사했습니다!