알고리즘

[백준/c++] 5397번 키로거 풀이(실버2)

딩보 2024. 1. 8. 22:37

 

문제

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

 

5397번: 키로거

첫째 줄에 테스트 케이스의 개수가 주어진다. 각 테스트 케이스는 한줄로 이루어져 있고, 강산이가 입력한 순서대로 길이가 L인 문자열이 주어진다. (1 ≤ L ≤ 1,000,000) 강산이가 백스페이스를 입

www.acmicpc.net

 

 

풀이

이 문제는 배열의 중간에서 삽입, 삭제가 빈번하게 일어난다. 따라서 vector나 deque보다 list를 사용하는 것이 효율적이다.

c++에서 list는 linked list를 의미한다. 그래서 배열의 중간 부분을 삽입, 삭제할 때 다른 연속적인 메모리 리스트보다 효율적이다.

 

먼저 문자열을 입력받은 뒤, 입력받은 문자열의 모든 요소를 순차적으로 탐색하여 list에 삽입, 삭제한다.

list는 인덱스를 제공하지 않고 iterator 기능만을 제공한다.

 

 

list.eraser 사용 시 주의할 점

list.eraser(iter)     // 오류

iter = list.eraser(iter)

 

eraser은 삭제된 iterator의 다음 iterator를 반환한다. 그 반환값을 저장해주어야 한다.

 

 

 

코드

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

int main()
{
	int T;
	cin >> T;
	
	for (int i = 1; i <= T; i++) {
		string str1;
		cin >> str1;
		list<char> ps;

		list<char>::iterator iter = ps.begin();

		for (int i = 0; i < str1.size(); i++) {
			switch (str1[i])
			{
			case '<':
				if (iter != ps.begin())
					iter--;
				break;
			case '>':
				if (iter != ps.end())
					iter++;
				break;
			case '-':
				if (iter != ps.begin()){
					iter = ps.erase(--iter);
				}
				break;
			default:
				ps.insert(iter, str1[i]);
				break;
			}
		}

		for (iter = ps.begin(); iter != ps.end(); iter++) {
			cout << *iter;
		}
		cout << '\n';
	}

	return 0;
}