<연결리스트> 백준 1406 에디터

2025. 3. 6. 00:22원티드_언리얼RPG 2기/자료구조 스터디

작성코드

 

#include <iostream>
#include <list>

using namespace std;

int main()
{
	string abc;
	int M;
	//입력받을 문자열의 개수 N, 명령어의 개수 M
	cin >> abc >> M;

	list<char> alphabets;
	//입력받은 문자열을 리스트에 옮기기
	for (char c : abc)
	{
		alphabets.push_back(c);
	}

	list<char>::iterator it;
	it = alphabets.end();

	for (int i = 0; i < M; i++)
	{
		//명령어 입력받기
		char c;
		cin >> c;
		switch (c)
		{
			//커서를 왼쪽으로 한칸 옮김
		case 'L':
			if (it != alphabets.begin())
			{
				it--;
			}
			break;
		case 'D':
			if (it != alphabets.end())
			{
				it++;
			}
			break;
		case 'B':
			if (it != alphabets.begin())
			{
				it = alphabets.erase(--it);
				//it++;
			}
			break;
		case 'P':
			char d;
			cin >> d;
			alphabets.insert(it, d);
			break;
		default:
			break;
		}
	}

	for (auto it = alphabets.begin(); it != alphabets.end(); it++)
	{
		cout << *it;
	}
}

 

문제점

 

이터레이터의 문법에 대한 이해가 부족했다.

 

입력1,2는 문제가 없었는데 입력3에서 런타임 에러가 발생했다.

 

입력 3 

dmih
11
B
B
P x
L
B
B
B
P y
D
D
P z

출력 3

yxz

 

case 'B':
			if (it != alphabets.begin())
			{
				it = alphabets.erase(it--); //it 가리키는 원소를 삭제하고 it을 감소시킨다         
			}
			break;

switch문의 각 case들에 중단점을 걸어두고 확인해본 결과, erase에서 문제가 발생했다.

 

<이터레이터 무효화 문제>

 

이터레이터가 먼저 삭제되서 정확한 동작을 할 수 없게 되는 문제이다. 후위 감소연산자를 사용하면 삭제후 반환되는 이터레이터값이 불확실해져서 오류가 발생할 가능성이 높다. 따라서 전위 감소연산자 --it 을 사용하자