본문 바로가기

코딩테스트/c++

[백준] 1406번 에디터

728x90

 

문자를 계속해서 수정하므로 배열보다는 연결 리스트로 구현하는 것이 낫다고 생각했다.

 

리스트를 선언한 후 커서 위치를 설정했다.

위에서 커서 위치에 따른 iterator는 커서의 오른쪽에 위치한다.

 

예를 들어, abcd를 입력한 후 L을 입력하면 커서는 왼쪽으로 간다. 이때 iterator는 d를 가리키고 있다.

따라서 명령을 수행할 때 커서의 오른쪽에 있는 iterator를 기준으로 코드를 작성하면 된다.

 

명령어 'L'의 경우 커서가 문장의 맨 앞에 위치할 경우 continue를 했다. 커서가 문장의 맨 앞에 있으면 iterator는 editor.begin() 보다 한 칸 뒤에 있으므로 조건문을 위와 같이 설정했다.

나머지 명령어도 위와 같은 개념으로 구현하면 된다.

 

 

전체 코드

#include <bits/stdc++.h>

using namespace std;


int main() {
	// list 선언
	list<char> editor;

	// 문자열 선언
	string str;
	cin >> str;

	// 에디터에 문자열 입력
	for (int i = 0; i < str.length(); i++) {
		editor.push_back(str[i]);
	}

	// 에디터 맨 뒤로 커서 위치 설정
	// iterator는 커서의 오른쪽으로 설정
	list<char>::iterator cursor = editor.end();

	int M;
	cin >> M;
	
	for (int i = 0; i < M; i++) {
		// 명령어 입력
		char command;
		cin >> command;

		switch (command) {
			case 'L': 
				if (cursor == editor.begin()++)
					continue;
				cursor--;
				break;
			
			case 'D': 
				if (cursor == editor.end())
					continue;
				cursor++;
				break;

			case 'B':
				if (cursor == editor.begin()++)
					continue;
				else {
					// 커서의 왼쪽에 있는 걸 지워야 하므로 현재 iterator의 한 칸 앞에 있는 걸 지운다.
					cursor--;
					editor.erase(cursor++);
				}
				break;
			case 'P':
				char text;
				cin >> text;

				// 해당 iterator의 앞에 삽입
				editor.insert(cursor, text);
		}
	}
	

	for (cursor = editor.begin(); cursor != editor.end(); cursor++) {
		cout << *cursor;
	}
	cout << "\n";
	return 0;
}
728x90
반응형

'코딩테스트 > c++' 카테고리의 다른 글

[프로그래머스] 오픈채팅방  (3) 2021.07.06
[백준] 3273번 두 수의 합  (2) 2021.06.30
백준 c++ 1697번  (2) 2021.01.22
백준 c++ 2178번  (0) 2021.01.19
백준 c++ 1926번  (0) 2021.01.19