본문 바로가기

Algorithm/백준

[백준] 5397번: 키로거

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

 

5397번: 키로거

문제 창영이는 강산이의 비밀번호를 훔치기 위해서 강산이가 사용하는 컴퓨터에 키로거를 설치했다. 며칠을 기다린 끝에 창영이는 강산이가 비밀번호 창에 입력하는 글자를 얻어냈다. 키로거는 사용자가 키보드를 누른 명령을 모두 기록한다. 따라서, 강산이가 비밀번호를 입력할 때, 화살표나 백스페이스를 입력해도 정확한 비밀번호를 알아낼 수 있다. 강산이가 비밀번호 창에서 입력한 키가 주어졌을 때, 강산이의 비밀번호를 알아내는 프로그램을 작성하시오. 입력 첫째 줄에 테

www.acmicpc.net

list로 푸는게 속도가 더 빠를 것이라고 생각했는데 deque으로 푸는게 더 빨랐다.

deque이 list보다 메모리를 덜 잡아먹어서 그런가..?

(vector로 풀면 시간초과가 뜬다)

 

아무튼 풀이방법은 password를 한글자씩 저장하는 deque을 선언한 뒤,

현재 커서의 위치를 cursor라는 포인터에 저장한다.

 

그리고 나서 입력 문자열을 한 글자씩 탐색하면서

< : cursor 감소

> : cursor 증가

- : cursor 바로 앞 요소 삭제

그 외: cursor 위치에 요소 삽입 후 cursor 증가

하면 된다.

 

간단한 구현인데 자꾸 에러가 떠서 왜 그런가 했더니, insert, erase를 하면 iteratar의 위치가 달라지기 때문이었다.

password.erase(--cursor); 이렇게 쓰지 말고 cursor = password.erase(--cursor); 이렇게 써줘야 한다.

(이것도 자료구조별로 달라진다.)

 

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

void keyLogger() {
	string input;
	deque<char> password;
	deque<char>::iterator cursor = password.end();

	cin >> input;

	for (int i = 0; i < input.length(); i++) {
		switch (input[i]) {
		case '<':
			if (cursor != password.begin()) cursor--;
			break;
		case '>':
			if (cursor != password.end()) cursor++;
			break;
		case '-':
			if (cursor != password.begin()) {
				cursor = password.erase(--cursor);
			}
			break;
		default:
			cursor = password.insert(cursor, input[i]);
			cursor++;
		}
	}

	for (cursor = password.begin(); cursor != password.end(); cursor++) {
		cout << *cursor;
	}
	cout << "\n";
	password.clear();
}

int main() {
	int T;
	cin >> T;
	while (T--) {
		keyLogger();
	}
}

'Algorithm > 백준' 카테고리의 다른 글

[백준] 10993번: 별 찍기 - 18  (0) 2020.03.15
[백준] 3190번: 뱀  (0) 2020.03.12
[백준] 1021번: 회전하는 큐  (0) 2020.03.12
[백준] 16500번: 문자열 판별  (0) 2020.03.03
[백준] 12865번: 평범한 배낭  (0) 2020.03.02