보글보글 개발일지
article thumbnail
Published 2021. 1. 25. 16:56
[백준/1406번][C++] 에디터 알고리즘
반응형

www.acmicpc.net/problem/1406

 

1406번: 에디터

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

www.acmicpc.net

 

 

문자열을 list에 저장한다. auto형으로 cursor변수를 선언해 커서의 위치를 맨 뒤로 보낸다.

명령어를 입력받아 각 명령어에 따라 명령을 수행한다.

L: 커서를 왼쪽으로 한 칸 옮김 (커서가 문장의 맨 앞이면 무시됨)
D: 커서를 오른쪽으로 한 칸 옮김 (커서가 문장의 맨 뒤이면 무시됨)
B:커서 왼쪽에 있는 문자를 삭제함 (커서가 문장의 맨 앞이면 무시됨)
삭제로 인해 커서는 한 칸 왼쪽으로 이동한 것처럼 나타나지만, 실제로 커서의 오른쪽에 있던 문자는 그대로임
P: $라는 문자를 커서 왼쪽에 추가함

위 표를 보면, L,D,B의 경우 무시되는 경우가 있다.

커서가 맨 앞인 경우, if(cursor!=l.begin())으로 명령어를 무시해줘야한다.

커서가 맨 뒤인 경우, if(cursor!=l.end())으로 명령어를 무시해줘야한다.

list만 좀 활용하면 된다.

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

int main(void)
{
    ios_base::sync_with_stdio;
    cin.tie(0);
    /*문자열 입력받음*/
    string str;
    cin>>str;
    /*입력받은 문자열 list에 저장*/
    list <char> l;
    for(auto c:str)
        l.push_back(c);
    auto cursor=l.end();//커서의 위치를 맨 뒤로 보낸다.
    int num;
    cin>>num;

    for(int i=0; i<num;i++)
    {
        //명령어 입력받기
        char op;
        cin>>op;
        if(op=='L')
        {
            if(cursor!=l.begin()) 
                cursor--;
        }
        else if(op=='D')
        {
            if(cursor!=l.end()) 
                cursor++;
        }
        else if(op=='B')
        {
            if(cursor!=l.begin())
            {
                cursor--;
                cursor=l.erase(cursor);
            }  
        }
        else
        {
            char c;
            cin>>c;
            l.insert(cursor,c);
        }
    }
    for(auto i:l) cout<<i;
    return 0;
}
반응형

'알고리즘' 카테고리의 다른 글

[백준/10773번][C++] 제로  (0) 2021.01.25
[백준/5397번][C++] 키로거  (0) 2021.01.25
[백준/11328번][C++] Strfry  (0) 2021.01.25
[백준/1919번][C++] 에너그램 만들기  (0) 2021.01.25
[백준/10171번][C++] 고양이  (0) 2021.01.25
profile

보글보글 개발일지

@보글

포스팅이 좋았다면 "좋아요❤️" 또는 "구독👍🏻" 해주세요!