에디터 한 줄로 된 간단한 에디터 구현. 이 편집기 영어 소문자만 기록할 수 있는 편집기. 최대 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 |
댓글