BOJ

[BOJ 1406 // C++] 에디터

measurezero 2021. 3. 9. 10:00

※ 글쓴이는 취미로 코딩을 익혀보는 사람이라 정확하지 않은 내용을 담고 있을 수 있다 ※

 

이번에 볼 문제는 백준 1406번 문제인 에디터이다.
문제는 아래 링크를 확인하자.

www.acmicpc.net/problem/1406

 

1406번: 에디터

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

www.acmicpc.net

이 문제에서는 문자열에서 커서를 한 칸씩 옮기기, 문자를 삽입하기, 지우기를 반복한다.

deque를 두개 이용하여 커서 앞쪽 문자열과 뒤쪽 문자열을 관리하면 이와 같은 문제를 간단히 해결할 수 있다.

 

단, deque가 비어있을 때 값을 읽거나 pop을 하려고 시도하면 안 되므로 작업을 하기 전 deque가 비어있는지 확인하는 것을 잊지 말아야 한다.

 

아래는 제출한 소스코드이다.

#include <iostream>
#include <string>
#include <deque>
using std::string;
using std::deque;
using std::cin; using std::cout;

deque<char> left;
deque<char> right;

int main()
{
    std::ios::sync_with_stdio(0);
    cin.tie(0);

    string s; cin >> s; int slen = s.length();
    for (int i = 0;i < slen;i++) left.push_back(s[i]);
    char oper; char letter;
    int N; cin >> N;
    for (int i = 0;i < N;i++) {
        cin >> oper;
        if ((oper == 'L') and (!left.empty())) {
            right.push_front(left.back());
            left.pop_back();
        }
        else if ((oper == 'D') and (!right.empty())) {
            left.push_back(right.front());
            right.pop_front();
        }
        else if ((oper == 'B') and !left.empty()) left.pop_back();
        else if (oper == 'P') {
            cin >> letter;
            left.push_back(letter);
        }
    }
    while (!left.empty()) {
        cout << left.front(); left.pop_front();
    }
    while (!right.empty()) {
        cout << right.front(); right.pop_front();
    }
    return 0;
}
728x90