I'm FanJae.

[BOJ] 5397 키로거 (C++) 본문

Algorithm

[BOJ] 5397 키로거 (C++)

FanJae 2024. 10. 28. 15:41

1. 문제 링크

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

 

2. 문제 접근

- 이 문제의 핵심은 키로거에서 화살표나 백스페이스 등의 처리가 중요하다.

- 화살표 처리와 백스페이스 처리상 중간 삽입 / 삭제가 자유로워야 하기 때문에 list 등을 이용한 처리가 적합하다.

 

3. 문제 풀이 

- 1406번 문제와 풀이 방법은 거의 같다.

- std::list와 list에 대한 iterator를 하나 선언한다.

- '<'인 경우, 맨 앞이 아닐때, iterator를 감소시킨다.

- '>'인 경우, 맨 끝이 아닐때, iteartor를 증가시킨다. 

- '-'인 경우, 백스페이스(바로 왼쪽에 있는 값)을 제거해야 하기 때문에 iterator를 감소 시키고, 제거해야 한다.

 

- ABC라는 문자가 있다면, ABC라는 문자가 있다면 커서 값은 C 뒤쪽이다.

- std::list에서 remove는 정확하게 iterator 위치를 기준으로 이뤄지기 때문에 iterator를 한번 앞으로 당기고 제거한다.

- 단, 가장 앞 지점인 경우 iterator를 감소 시키지 않는다.

- 키로거가 비어있는 경우에는 삭제를 하지 않도록 체크도 필요하다.

 

4. 소스 코드(C++)

더보기

 

#include <iostream>
#include <string>
#include <list>
using namespace std;

int main(void)
{
	ios::sync_with_stdio(0);
	cin.tie(0);
	
	string data;
	int T;
	cin >> T;
	while (T--)
	{
		list<char> editor;
		list<char>::iterator cursor = editor.begin();

		cin >> data;
		for (int i = 0; i < data.length(); i++)
		{
			if (data[i] == '<')
			{
				if (cursor != editor.begin()) // 앞으로 이동 가능 여부 체크
				{
					cursor--;
				}
			}
			else if (data[i] == '>')
			{
				if (cursor != editor.end()) // 뒤로 이동 가능 여부 체크
				{
					cursor++;
				}
			}
			else if (data[i] == '-') 
			{
				if(!editor.empty()) // 비어있지 않은 경우.
				{
					if (cursor != editor.begin()) // 커서가 맨 앞인 경우 지울 수 없음.
					{
						cursor--;
						cursor = editor.erase(cursor);
					}
				}
			}
			else
			{
				editor.insert(cursor, data[i]);
			}
		}

		for (auto iter = editor.begin(); iter != editor.end(); iter++)
		{
			cout << *iter;
		}
		cout << "\n";
	}
}

'Algorithm' 카테고리의 다른 글

[BOJ] 2493 탑 (C++)  (0) 2024.10.29
[BOJ] 1874 스택 수열 (C++)  (0) 2024.10.29
[BOJ] 10773 제로 (C++)  (0) 2024.10.28
[BOJ] 1158 요세푸스 문제 (C++)  (0) 2024.10.28
[BOJ] 1406 에디터 (C++)  (0) 2024.10.28
Comments