문제 https://www.acmicpc.net/problem/1406
1406번: 에디터
첫째 줄에는 초기에 편집기에 입력되어 있는 문자열이 주어진다. 이 문자열은 길이가 N이고, 영어 소문자로만 이루어져 있으며, 길이는 100,000을 넘지 않는다. 둘째 줄에는 입력할 명령어의 개수
www.acmicpc.net
풀이
DLL을 이용하여 풀 수 있는 문제이다.
포인트는,
첫 번째로 현재 커서의 위치를 나타내는 cur 포인터가 연산이 끝나고 제자리를 잘 가리키도록 해야 한다는 것이다.
추가 연산을 한 후에는 새로 생성된 노드를 가리키고, 삭제 연산을 한 후에는 가리키던 노드의 이전 노드를 가리키도록 한다. 왼쪽이나 오른쪽으로 이동하는 연산을 할 때는 연결리스트의 범위를 넘어가지 않도록 한다.
두 번째는 연결리스트를 만들 때, head 부분에 노드를 생성하고 시작한다.
커서의 위치가 맨 앞일 경우가 있으므로, 이 경우를 잘 처리하지 않으면 null pointer에 접근할 수도 있다.
head 부분에 내용물이 없는 노드를 생성했으므로, 출력할 때 head의 다음부터 출력하면 된다.
코드
#include <iostream>
#include <string>
using namespace std;
typedef struct node
{
char i;
struct node*next;
struct node*prev;
}node;
node*head = 0;
node*cur = 0;
void add(char c)
{
node*newnode = (node*)malloc(sizeof(node));
newnode->i=c;
newnode->next=newnode->prev=0;
if(head->next==0)
{
head->next=newnode;
newnode->prev=head;
cur=newnode;
}
else if(cur->next==0)
{
newnode->prev=cur;
cur->next=newnode;
cur=newnode;
}
else if(cur->next!=0)
{
cur->next->prev=newnode;
newnode->next=cur->next;
newnode->prev=cur;
cur->next=newnode;
cur=newnode;
}
}
void Left()
{
if(cur->prev!=0) cur=cur->prev;
}
void Right()
{
if(cur->next!=0) cur=cur->next;
}
void delnode()
{
node*del = cur;
if(del!=head)
{
del->prev->next=del->next;
if(del->next!=0)
{
del->next->prev=del->prev;
free(del);
}
else cur->next=0;
cur=cur->prev;
}
}
void printstring()
{
node*tmp=head->next;
while(tmp!=0)
{
cout<<tmp->i;
tmp=tmp->next;
}
}
int main()
{
head = (node*)malloc(sizeof(node));
head->next=head->prev=0;
string s;
cin>>s;
int len=s.length();
for(int i=0; i<len; i++)
{
add(s[i]);
}
int n;
cin>>n;
for(int i=0; i<n; i++)
{
char c;
cin>>c;
if(c=='L') Left();
else if(c=='D') Right();
else if(c=='B') delnode();
else
{
char d;
cin>>d;
add(d);
}
}
printstring();
}
'알고리즘 > 문제 풀이' 카테고리의 다른 글
SWEA - 공통조상 (C++) (0) | 2022.08.04 |
---|---|
백준 10825 - 국영수(C++) (0) | 2022.07.17 |
백준 10819 - 차이를 최대로(C++) (0) | 2022.07.13 |
백준 5430 - AC(C++) (0) | 2022.07.11 |
백준 4358 - 생태학(C++) (0) | 2022.07.03 |