백준1406(에디터)

jh Seo·2022년 10월 19일
0

백준

목록 보기
55/180

개요

백준 1406번: 에디터

  • 입력
    첫째 줄에는 초기에 편집기에 입력되어 있는 문자열이 주어진다. 이 문자열은 길이가 N이고, 영어 소문자로만 이루어져 있으며, 길이는 100,000을 넘지 않는다. 둘째 줄에는 입력할 명령어의 개수를 나타내는 정수 M(1 ≤ M ≤ 500,000)이 주어진다. 셋째 줄부터 M개의 줄에 걸쳐 입력할 명령어가 순서대로 주어진다. 명령어는 위의 네 가지 중 하나의 형태로만 주어진다.

  • 출력
    첫째 줄에 모든 명령어를 수행하고 난 후 편집기에 입력되어 있는 문자열을 출력한다.

접근 방식

  1. STL 라이브러리의 List를 이용해 구현해봤다.

  2. 사실 list의 함수에서 이미 P,B를 insert(), erase()함수로 제공해주기에
    사용법만 숙지하면 쉽다.

  3. 한가지 몰랐던 부분은 erase(iterator)함수가 작동하는 방법을 잘못 알고 있었다.
    erase(iterator)함수를 실행하면 매개변수로 들어간 iterator가 가리키는 원소를 제거한 후,
    iterator가 지운 원소의 다음 원소를 가리키게 되고 끝인 줄 알았다.

    하지만 erase(iterator)은 반환값이 iterator으로 다음 원소를 가리키는 iterator을 반환해서
    난 그냥 erase(iterator)하면 해당 iterator에 다음원소의 주소를 넣어주는 줄 알았으나
    iterator= erase(iterator) 이런식으로 작성해야했다.

코드

#include<iostream>
#include<list>
#include<vector>

using namespace std;

//입력 문자열
list<char> editor;
//명령어 갯수
int M;
//명령어 문자열
vector <char> inputArr;
//입력문자열 커서
list<char>::iterator Cursor;

void input() {
	//각각 L,P,B정하는 변수, P 다음에 들어올 변수
	char tmp = ' ', tmpXy = ' ';
	//처음에 입력받을 문자열
	string inputStr = "";
	cin >> inputStr;
	//입력받은 문자열 editor리스트에 넣어줌
	for (int i = 0; i < inputStr.length(); i++) {
		editor.push_back(inputStr[i]);
	}
	cin >> M;
	//inputArr에 L,P,B 함수 넣는과정
	for (int i = 0; i < M; i++) {
		cin >> tmp;
		inputArr.push_back(tmp);
		//P라면 그다음 원소 넣어줌
		if (tmp == 'P') {
			cin >> tmpXy;
			inputArr.push_back(tmpXy);
		}
	}
	//커서 
	Cursor=editor.end();
}

void solution() {
	//inputArr.size()가 아니라 그냥 M으로 했더니 P들어왔을때 i++을 해줘서 처리하는 과정에서 i를 소모해 연산이 씹힌다. 
	for (int i = 0; i < inputArr.size(); i++) {
		if (inputArr[i] == 'L') {
			//맨앞이면 무시
			if (Cursor == editor.begin()) continue;
			else Cursor--;
		}
		else if (inputArr[i] =='D') {
			//맨뒤면 무시
			if (Cursor == editor.end()) {
				continue;
			}
			else Cursor++;
		}
		else if (inputArr[i] == 'B') {
			if (Cursor == editor.begin()) continue;
			else
			{
				//editor.erase하면 들어간 iterator위치가 자동으로 바뀌는거로생각했었는데 
				//다시 찾아보니 지우고 다음 iterator를 반환하는거였다.
				Cursor=editor.erase(--Cursor);
			}
		}
		else {
			//P 다음 값 찾기위해
			i++;
			editor.insert(Cursor,inputArr[i]);
			
			}
	}
	for (auto iter = editor.begin(); iter != editor.end(); ++iter) {
		cout << *iter;
	}
}

int main() {
	ios_base::sync_with_stdio(0);
	cin.tie(0);
	input();
	solution();
}

문풀후생

사실 vector만 주구장창 써왔지, list는 잘 사용을 안 했었다.
이전 List문제들도 필요한 이중연결리스트나, 원형연결리스트를 직접 구현해서 풀었었지
STL list는 사용을 안 했었는데, 이 문제에서 확실히 사용해보니 list의 내장 함수들을 잘 모른다는걸
깨달았고 공부하게 되는 계기가 되었다.

profile
코딩 창고!

0개의 댓글