반응형
출처: 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();
}
반응형
'PS 문제 풀이 > Baekjoon' 카테고리의 다른 글
[BOJ] 백준 1158 요세푸스 문제 (0) | 2021.02.25 |
---|---|
[BOJ] 백준 2458 키 순서 (0) | 2021.02.25 |
[BOJ] 백준 3033 가장 긴 문자열 (0) | 2021.02.25 |
[BOJ] 백준 7453 합이 0인 네 정수 (0) | 2021.02.25 |
[BOJ] 백준 17619 개구리 점프 (0) | 2021.02.25 |
댓글