백준/실랜디, 골랜디

[백준] C++ 에디터(1406)

2zreal 2025. 1. 9. 16:32

이 문제는 연결리스트를 활용하는 간단한 문제이다.

연결리스트를 직접 구현해서 문제를 해결해도 상관없지만 나는 라이브러리에 있는 list를 사용해서 문제를 해결하였다.

 

문제해결방법

1. list를 선언한다.

2. iterator(반복자)를 활용해서 요소에 접근한다.

3. L을 입력받았을 때 반복자의 위치가 맨 앞이면 무시한다.

4. D를 입력받았을 때 반복자의 위치가 맨 뒤면 무시한다.

5. B를 입력받았을 때 반복자의 위치가 맨 앞이면 무시한다.

6. P를 입력받으면 문자를 추가한다.

 

 

list <char>::iterator it = l.begin();

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

begin은 맨 앞(첫 번째 요소)을 의미하고 end는 맨 끝(빈 공간)을 의미한다.

만약 반복자가 end를 가리키고 있고 4를 erase로 삭제하게 된다면 이 반복자는 무효화된다.

그래서 다시 it=l.erase(it); 반복자의 위치를 받아와야 한다.

#include <iostream>
#include <list>

using namespace std;

int main(void)
{

	string s = "";
	int M = 0;
	cin >> s >> M;

	list<char>l;
	for (int i = 0; i < s.size(); i++)
	{
		l.push_back(s[i]);
	}

	list<char>::iterator it = l.end();//리스트의 맨끝

	for (int i = 0; i < M; i++)
	{
		char c = ' ';
		cin >> c;
		if (c == 'L')
		{
			if (it != l.begin())
			{
				advance(it, -1);
			}
		}
		else if (c == 'D')
		{
			if (it != l.end())
			{
				advance(it, 1);
			}

		}
		else if (c == 'B')
		{
			if (it != l.begin())
			{
				advance(it, -1);
				it = l.erase(it);
			}
		}
		else if (c == 'P')
		{

			cin >> c;
			l.insert(it, c);
			//그 자리에 c 삽입
		}
	}

	for (char val : l)
	{
		cout << val;
	}

	return 0;
}

advance로 it의 위치를 옮긴다.

'백준 > 실랜디, 골랜디' 카테고리의 다른 글

[백준] 그림(1926)  (0) 2025.01.10
[백준] C++ 스타트와 링크(14889)  (0) 2025.01.09
[백준] 좋다(1253)  (0) 2025.01.08
[백준] C++ 부분합(1806)  (0) 2025.01.08
[백준] 쉬운 최단거리(14940)  (0) 2024.12.29