1. 문제 링크

 

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

 

1406번: 에디터

문제 한 줄로 된 간단한 에디터를 구현하려고 한다. 이 편집기는 영어 소문자만을 기록할 수 있는 편집기로, 최대 600,000글자까지 입력할 수 있다. 이 편집기에는 '커서'라는 것이 있는데, 커서는

www.acmicpc.net

 

 

 

2. 문제 설명

string을 입력받은 후 명령어에 따라 기능을 수행한 후 남아있는 string을 출력하는 문제입니다.

 

 

 

3. 소스코드

BOJ 1406번 에디터 C++ 풀이입니다.

#include <iostream>
#include <list>
using namespace std;

int main(void)
{
	ios::sync_with_stdio(0);
	cin.tie(0); cout.tie(0);

	string s;
	char op;
	int M;
	cin >> s >> M;
	list<char> l(s.begin(), s.end());
	list<char>::iterator t = l.end();
	// auto t = l.end();

	for (int i = 0; i < M; i++) {
		cin >> op;
		if (op == 'L' && t != l.begin()) t--;
		else if (op == 'D' && t != l.end()) t++;
		else if (op == 'B' && t != l.begin()) t = l.erase(--t);
		else if (op == 'P') {
			cin >> op;
			l.insert(t, op);
		}
	}
	for (t = l.begin(); t != l.end(); t++) cout << *t;
	// for (auto c : l) cout << c;

	return 0;
}

연결 리스트를 사용하면 쉽게 풀 수 있는 문제이므로 14번 라인에서 입력받은 문자열을 list<char>에 대입했습니다.

문제에서 커서는 문장의 맨 뒤에 위치하고 있다고 했기 때문에 15번 라인에서 iterator t를 l.end()로 초기화했습니다.

16번 라인처럼 auto를 사용해도 됩니다.

 

명령어가 L이고 커서가 문장의 맨 앞(l.begin())이 아니면 커서를 한칸 앞으로 이동합니다. (t--)

명령어가 D이고 커서가 문장의 맨 뒤(l.end())가 아니면 커서를 한칸 뒤로 이동합니다. (t++)

 

명령어가 B이고 커서가 문장의 맨 앞(l.begin())이 아니면 커서 왼쪽에 있는 문자(--t)를 삭제합니다.

list의 erase함수를 사용할 때 return값은 지운 요소의 다음 요소를 반환하므로 이를 다시 t에 대입해줍니다.

return값을 활용하지 않으려면 t--; l.erase(t++);과 같이 사용하면 됩니다.

 

명령어가 P이면 커서 왼쪽에 문자를 추가하므로 t위치에 insert하면 됩니다.

list의 insert함수는 iterator가 가리키는 곳의 왼쪽에 삽입하고, iterator는 원래 요소를 그대로 가리킵니다.

 

리스트를 출력하는 방법은 28번 라인처럼 for문에 iterator를 사용하면 됩니다.

29번 라인처럼 auto를 사용해도 됩니다. 

'Algorithm > Study' 카테고리의 다른 글

[백준 13300번 C++] 방 배정  (0) 2020.05.13
[백준 11328번 C++] Strfry  (0) 2020.05.13
[백준 10807번 C++] 개수 세기  (0) 2020.05.12
[백준 10808번 C++] 알파벳 개수  (0) 2020.05.12
[백준 2446번 C++] 별 찍기 - 9  (0) 2020.04.30

+ Recent posts