본문 바로가기
Algorithms/simulation

1406 에디터

by OKOK 2018. 11. 16.

에디터 한 줄로 된 간단한 에디터 구현. 이 편집기 영어 소문자만 기록할 수 있는 편집기. 최대 600,000 글자까지 입력 가능

커서라는 것 있음. 커서는 문장의 맨 앞, 문장의 맨 뒤, 또는 문장 중간의 임으이 곳에 위치 할 수 있음.

즉 길이가 엘인 문자열이 현재 편집기에 입력되어 있으면, 커서가 위치할 수 있는 곳은 엘+1 가지 경우가 있음

 

편집기가 지원하는 명령어는 다음과 같음

엘 커서를 왼쪽으로 한 칸 옮김

디 커서를 오른쪽으로 한 칸 옮김

비 커서 왼쪽에 있는 문자를 삭제함

피$ 라는 문자를 커서 왼쪽에 추가함

 

초기 편집기에 입력되어 있는 문자열이 주어지고,

그 후 입력한 명령어가 차례로 주어짐

모든 명령어를 수행하고 난 후 편집기에 입력되어 있는 문자열을 구하는 프로그램

명령어가 수행되기 전에 커서는 문장의 맨 뒤에 위치하고 있다고 함 

 

#include <cstdio>
using namespace std;

#define MAX 600000

// 리스트의 각 노드 클래스
class listNode {
public:
    listNode() :data('\0'), prev('\0'), next('\0') {};
    listNode(char d, listNode *p, listNode* n) :data(d), prev(p), next(n) {};
    char data;
    listNode *prev, *next;
};

// 리스트 클래스
class list {
public:
    list() :size(0) {
        front = rear = current = new listNode('\0', '\0', '\0'); //end node
    };
    // 왼쪽으로 한 칸 이동
    void moveLeft() {
        if (current != rear) current = current->prev;
    }
    // 오른쪽으로 한 칸 이동
    void moveRight() {
        if (current != front) current = current->next;
    }
    // 현재 위치 삭제
    void erase() {
        if (current == rear) return;
        listNode *temp = current->prev;
        if (current->prev == rear) {
            rear = current;
            current->prev = '\0';
        }
        else {
            current->prev->prev->next = current;
            current->prev = current->prev->prev;
        }
        delete temp;
        size--;
    }
    // 현재 위치 삽입
    void insert(char ch) {
        if (size == MAX) return;
        listNode *temp = new listNode(ch, current->prev, current);
        if (current == rear) rear = temp;
        else current->prev->next = temp;
        current->prev = temp;
        size++;
    }
    // 글자 개수 리턴
    int getSize() {
        return size;
    }
    // 리스트 전체 출력
    void print() {
        listNode *temp = rear;
        while (temp != front) {
            putchar(temp->data);
            temp = temp->next;
        }
        putchar('\n');
    }
private:
    int size;
    listNode *front, *rear, *current;
};

int main() {
    freopen("text.txt", "r", stdin);
    list text;
    int N;
    char opcode, ch;
    while ((ch = getchar()) != '\n')
        text.insert(ch);
    scanf("%d", &N);

    // 명령에 맞게 함수를 실행함
    for (int i = 0; i<N; i++) {
        getchar();
        opcode = getchar();
        switch (opcode) {
        case 'L':
            text.moveLeft();
            break;
        case 'D':
            text.moveRight();
            break;
        case 'B':
            text.erase();
            break;
        case 'P':
            getchar();
            ch = getchar();
            text.insert(ch);
        }
    }
    // 결과 출력
    text.print();
}

- 벡터를 사용해서 풀 수 없음
- 문제에 맞게 링크드 리스트를 직접 구현해야 함
- 구현해야 하는 함수는 4개임
- 문자를 삭제하고 나서 문자 수가 0개가 되어 에디터 전체가 빈 문자열이 되었을 떄,
  링크드 리스트의 포인터 값들에 대해 잘 처리해 두어야 함
- 커서의 위치를 잘 파악해야 함

https://m.blog.naver.com/PostView.nhn?blogId=kks227&logNo=220557566098&proxyReferer=https%3A%2F%2Fwww.google.co.kr%2F

 

 

 

 

 

'Algorithms > simulation' 카테고리의 다른 글

사람 네트워크2  (0) 2019.01.29
A응실 보급로 / 다이스트라  (0) 2018.12.18
링크드 리스트 백준 조세퍼스  (0) 2018.11.16
user 청소봇  (0) 2018.11.14
온라인 팰린드롬  (0) 2018.11.14

댓글