백준5397(키로거)

jh Seo·2022년 10월 20일
1

백준

목록 보기
56/194
post-custom-banner

개요

백준 5397번: 키로거

  • 입력
    첫째 줄에 테스트 케이스의 개수가 주어진다. 각 테스트 케이스는 한줄로 이루어져 있고, 강산이가 입력한 순서대로 길이가 L인 문자열이 주어진다. (1 ≤ L ≤ 1,000,000) 강산이가 백스페이스를 입력했다면, '-'가 주어진다. 이때 커서의 바로 앞에 글자가 존재한다면, 그 글자를 지운다. 화살표의 입력은 '<'와 '>'로 주어진다. 이때는 커서의 위치를 움직일 수 있다면, 왼쪽 또는 오른쪽으로 1만큼 움직인다. 나머지 문자는 비밀번호의 일부이다. 물론, 나중에 백스페이스를 통해서 지울 수는 있다. 만약 커서의 위치가 줄의 마지막이 아니라면, 커서 및 커서 오른쪽에 있는 모든 문자는 오른쪽으로 한 칸 이동한다.

  • 출력
    각 테스트 케이스에 대해서, 강산이의 비밀번호를 출력한다. 비밀번호의 길이는 항상 0보다 크다.

접근방식

  1. string 값으로 입력값을 받아오고 vector< string >에 저장을 미리 다 하고,
    나중에 벡터 각각의 string 값에 대해서 char원소 하나씩 가져와서 어떤 문자인지 분석했다.

  2. vector[index]값의 문자열을 한 글자 씩 분석해서 커서를 옮겨가며 해당 문자열의 답을 알아내는 solvePassword(int index)함수를 구현하였다.

  3. 커서가 맨앞일땐 <,-가 작동을 안하게 만들고, 맨 뒤일땐 >가 작동을 안하게 해야한다.

코드

#include<iostream>
#include<list>
#include<vector>

using namespace std;
int N;
//각 문자열에서 비밀번호를 출력하는 list
list<char> passWord;
//입력값 받는 문자열
vector<string> testCases;
//비밀번호 출력 list인 passWord에서 사용되는 커서
list<char>::iterator passWordCursor;

void input() {
	string abc;
	cin >> N;
	for (int i = 0; i < N; i++) {
		cin >> abc;
		testCases.push_back(abc);
	}
	//커서 초기화
	passWordCursor = passWord.end();
}
/// <summary>
/// index번째의 입력 문자열의 각 char형 원소를 분석해 passWordCursor을 움직이며 passWord 리스트에 적고 지우고 하기 
/// </summary>
/// <param name="index"></param>
void solvePassword(int index) {
	//password 리스트 초기화
	passWord.clear();
	passWordCursor = passWord.end();
	for (int i = 0; i < testCases[index].length(); i++) {
		//다음이 -면 커서 전값 지우기
		if (testCases[index][i] == '-') {
			//사이즈 없다면
			if (passWord.size() == 0) {
				continue;
			}
			//커서가 첫 값이라면 전값 없으므로
			if (passWordCursor == passWord.begin()) { 
				//패스
				continue;
			}
			passWordCursor=passWord.erase(--passWordCursor);
		}
		//다음 <일 때
		else if (testCases[index][i] == '<') {
			//사이즈 없다면
			if (passWord.size() == 0) {
				continue;
			}
			//커서 하나 옆이 첫 값이라면
			if (passWordCursor == passWord.begin()) {
				//패스
				continue;
			}
			passWordCursor--;
		}
		//다음 >일 때
		else if (testCases[index][i] == '>') {
			//사이즈 없다면
			if (passWord.size() == 0) {
				continue;
			}
			//커서 하나 옆이 첫 값이라면
			if (passWordCursor == passWord.end()) {
				//패스
				continue;
			}
			passWordCursor++;

		}
		//그냥 문자 입력시
		else {
			//passWord에 넣어주기
			passWord.insert(passWordCursor,testCases[index][i]);
			
		}
	}
	//출력하기
	for (auto iter = passWord.begin(); iter != passWord.end(); ++iter) {
		cout << *iter;
	}
}

void solution() {
	for (int i = 0; i < N; i++) {
		solvePassword(i);
		cout << '\n';
	}

}

int main() {
	ios_base::sync_with_stdio(0);
	cin.tie(0);
	input();
	solution();
}

문풀후생

백준 1406번: 에디터 문제와 비슷하다. STL라이브러리의 list를 안다면 무난하게 풀 수 있는 문제다.

profile
코딩 창고!
post-custom-banner

0개의 댓글