1406번: 에디터
첫째 줄에는 초기에 편집기에 입력되어 있는 문자열이 주어진다. 이 문자열은 길이가 N이고, 영어 소문자로만 이루어져 있으며, 길이는 100,000을 넘지 않는다. 둘째 줄에는 입력할 명령어의 개수
www.acmicpc.net
- 처음엔 연결 리스트 자체를 직접 구현하려고 하였으나, STL 에 만들어진 좋은 자료구조가 있어서 활용하였다.
- 현재 위치는 이터레이터로써 가지고 있는데, 해당 원소의 앞으로 생각하냐 뒤로 생각하냐에 따라서 구현이 달라진다.
- 뒤로 놓을 경우 이런저런 귀찮은 조건들을 설정해주어야 했기 때문에, 깔끔하게 앞으로 생각하여 풀었다.
- 다른분들의 풀이를 보니, 스택 등을 이용해서 풀면 더 시간적으로 빠르게 동작할 수 있는 듯 하다.
- 양방향 연결 리스트 구현은 [자료구조] 카테고리에서 자바로 해보았다.
#include <iostream>
#include <list>
using namespace std;
int M;
string start;
char input, value;
list<char> dll;
list<char>::iterator cur; // 커서 위치는, 이터레이터의 원소와 앞 원소 사이 위치
int main(void)
{
ios_base::sync_with_stdio(false);
cin.tie(0);
cout.tie(0);
cin >> start;
int N = start.size();
for(int i = 0 ; i < N ; i++)
{
dll.push_back(start[i]); // 처음 입력받는 문자열을 다 넣어준 뒤
}
cur = dll.end(); // 커서를 맨 뒤로 옮김
cin >> M;
for(int i = 0 ; i < M ; i++)
{
cin >> input;
switch (input)
{
case 'L':
if(cur != dll.begin()) cur--; // 맨 앞이 아닐 경우 커서 왼쪽으로 이동
break;
case 'D':
if(cur != dll.end()) cur++; // 맨 뒤가 아닐 경우 커서 오른쪽으로 이동
break;
case 'B':
if(cur != dll.begin()) cur = dll.erase(--cur); // 맨 앞이 아닐 경우, 앞의 원소 삭제 후 위치 갱신
break;
default:
cin >> value;
dll.insert(cur, value); // 현재 위치에 원소 추가
break;
}
}
for(cur = dll.begin() ; cur != dll.end() ; cur++)
{
cout << *cur;
}
cout << endl;
}
'PS > BOJ' 카테고리의 다른 글
[백준] 2841 : 외계인의 기타 연주 (0) | 2021.02.10 |
---|---|
[백준] 14496 : 그대, 그머가 되어 (0) | 2021.01.27 |
[백준] 1374 : 강의실 (0) | 2021.01.22 |
[백준] 3258 : 컴포트 (0) | 2021.01.21 |
[백준] 18352 : 특정 거리의 도시 찾기 (0) | 2021.01.21 |