본문 바로가기
PS 문제 풀이/Baekjoon

[BOJ] 백준 1406 에디터

by 까망 하르방 2021. 2. 25.
반응형

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

 Input 

abcd

3

P x

L

P y

 

 Output 

abcdyx

이중연결 리스트를 구현해서 cur 포인터를 통해 커서를 구현할 수 있습니다.

- L 인 경우 이동가능하다면 cur 를 왼쪽으로 이동시킨다

- D 인 경우 이동가능하다면 cur 를 오른쪽으로 이동시킨다

- B 인 경우 지울 수 있다면 cur 의 데이터를 지우고, cur 를 왼쪽 노드로 이동시킨다

- P $ 인 경우 cur 의 next 에 새로운 노드를 추가하고, cur 를 오른쪽 노드로 이동시킨다


#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
#define LM 100050
 
struct Node {
    char data;
    Node *prev, *next;
    void init() {
        data = 0;
        prev = next = NULL;
    }
    Node* alloc(char nd, Node* np) {
        data = nd;
        prev = np, next = np->next;
        prev->next = this; // np->next = this
        if (next) next->prev = this;
        return this;
    }
    Node* erase() {
        prev->next = next;
        if (next) next->prev = prev;
        return prev;
    }
}buf[LM * 6];
int bcnt;
 
struct DoublyLinkedList {
    Node* head;
    Node* cur;
    int size;
    void init() {
        size = 0;
        buf[bcnt].init();
        head = cur = buf + bcnt++; // 더미 노드
    }
    void insert(char data) {
        cur = buf[bcnt++].alloc(data, cur);
        size++;
    }
    void erase() {
        if (cur == head) return;
        cur = cur->erase();
        size--;
    }
    void leftShift() {
        if (cur == head) return;
        cur = cur->prev;
    }
    void rightShift() {
        if (cur->next == NULL) return;
        cur = cur->next;
    }
    void output() {
        Node* p = head->next;
        for (; p; p = p->next) {
            printf("%c", p->data);
        }
        puts("");
    }
}dList;
char str[LM], cmd, ch;
int M;
int main() {
    bcnt = 0;
    dList.init();
 
    scanf("%s", str);
    scanf("%d", &M);
    for (int i = 0; str[i]; ++i) {
        dList.insert(str[i]);
    }
    for (int i = 0; i < M; ++i) {
        scanf(" %c", &cmd);
        switch (cmd){
        case 'L':
            dList.leftShift();
            break;
        case 'D':
            dList.rightShift();
            break;
        case 'B':
            dList.erase();
            break;
        case 'P':
            scanf(" %c", &ch);
            dList.insert(ch);
            break;
        }
    }
 
    dList.output();
}

 

반응형

댓글