본문 바로가기

Coding

[C++]백준 1406번: 에디터

728x90
문제

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

 

1406번: 에디터

첫째 줄에는 초기에 편집기에 입력되어 있는 문자열이 주어진다. 이 문자열은 길이가 N이고, 영어 소문자로만 이루어져 있으며, 길이는 100,000을 넘지 않는다. 둘째 줄에는 입력할 명령어의 개수

www.acmicpc.net

 

문제이해

  • 첫째 줄에 편집하고자 하는 문장이 주어진다. 영어 소문자로만 이루어져 있으며 길이는 100,000을 넘지 않는다.
  • 둘째 줄에는 입력할 명령어의 개수(N)가 주어진다.
  • 셋째 줄부터 N개 만큼의 명령어가 주어진다.
    명령어의 종류는 다음과 같다.
    L | 커서를 왼쪽으로 한 칸 옮긴다.(다만 커서가 문장 맨 앞일 경우 무시한다.)
    D |  커서를 오른쪽으로 한 칸 옮긴다.(다만 커서가 문장 맨 뒤일 경우 무시한다.)
    B | 커서의 왼쪽에 있는 문자를 삭제한다.(다만 커서가 문장 맨 앞일 경우 무시한다.)
    P $ | $라는 문자를 커서 왼쪽에 추가한다. 
  • 명령어를 실행한 후의 문장을 출력한다.

시간 제한이 0.3초이며 문장의 중간에 문자를 제거하거나 추가하는 경우가 있을 수 있기 때문에 vector를 사용하기보단 list를 사용하는게 적절하다. 커서iterator로 표현하기만 하면 된다. 다만 문제에서 커서는 문자와 문자 사이에 있기때문에 그 점만 조심해주면 된다.

 

문제해결
#include <iostream>
#include <string>
#include <list>
using namespace std;

list<char> text;

int main() {
	string str, com;
	char inp;
	cin >> str;
	int N;
	cin >> N;
	for (char c : str) {
		text.push_back(c);
	}
	list<char>::iterator iter = text.end();
	for (int i{ 1 }; i <= N; i++) {
		list<char>::iterator test = text.begin();
		cin >> com;
		if (com == "L") {
			if (iter != text.begin()) {
				iter--;
			}
		}
		else if (com == "D") {
			if (iter != text.end()) {
				iter++;
			}
		}
		else if (com == "B") {
			if (iter != text.begin()) {
				iter--;
				iter = text.erase(iter);
			}
		}
		else if (com == "P") {
			cin >> inp;
			text.insert(iter, inp);
		}
	}
	iter = text.begin();
	for (iter; iter != text.end(); iter++) {
		cout << *iter;
	}
}

문장을 list<char> text에 한 글자씩 저장하고 list<char>::iterator iter로 커서를 구현하였다.

 

문제후기

list를 사용할 줄만 안다면 구현하는데 어려움이 있는 문제는 아니였다.

728x90

'Coding' 카테고리의 다른 글

[C++]백준 2075번: N번째 큰 수  (0) 2023.07.13
[C++]백준 1655번: 가운데를 말해요  (0) 2023.07.13
[C++]백준 5430번: AC  (0) 2023.07.11
[C++]백준 2258번: 정육점  (0) 2023.07.11
[C++]백준 18185번: 라면 사기 (Small)  (0) 2023.07.10