[백준] 키로거 5397

Su-hyeon B·2022년 10월 6일
0

알고리즘 문제 풀이

목록 보기
30/70
post-custom-banner

문제

키로거는 사용자가 키보드를 누른 명령을 모두 기록한다. 따라서, 강산이가 비밀번호를 입력할 때, 화살표나 백스페이스를 입력해도 정확한 비밀번호를 알아낼 수 있다.

강산이가 비밀번호 창에서 입력한 키가 주어졌을 때, 강산이의 비밀번호를 알아내는 프로그램을 작성하시오. 강산이가 키보드로 입력한 키는 알파벳 대문자, 소문자, 숫자, 백스페이스, 화살표이다.

입력

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

  • 백스페이스 : '-', 커서의 바로 앞에 글자가 존재하면 해당 글자 지우기
  • 화살표 : '<'or'>', 커서의 위치를 움직일 수 있다면 왼쪽, 오른쪽으로 1만큼 이동
  • 나머지 문자: 비밀번호의 일부 (백스페이스를 통해서 지울 수 있음)
  • 커서 : 커서의 위치가 줄의 마지막이 아니라면, 커서 및 커서 오른쪽에 있는 모든 문자는 오른쪽으로 한 칸 이동

출력

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

풀이

풀이 1

#include <iostream>
#include <list>

using namespace std;

int main()
{
    //1. 테스트 케이스 개수 입력받기
    int testCaseNum;
    cin >> testCaseNum;
    
    while(testCaseNum--){
        //2. 비밀번호 입력받기
        list<char> L;
        string init;
        cin >> init;
        
        auto cursor = L.begin(); //begin <<BP<A>>Cd- end
        
        for(auto c:init){
            //3. 백스페이스의 경우 앞에 글자 존재하면 해당 글자 지우기
            if(c == '-'){
                if(cursor != L.begin()){
                    cursor--; //앞으로 이동
                    cursor = L.erase(cursor); //해당 글자 지우고 커서 위치 조정
                }
            }
            else if(c =='<'){
                if(cursor != L.begin()){ //앞으로 이동할 수 있다면
                    cursor--; //커서 위치 앞으로
                }
            }
            
            else if(c =='>'){
                if(cursor != L.end()){ //뒤로 이동할 수 있다면
                    cursor++;
                }
            }
            else{ //문자일 경우
                //커서의 위치에 문자 넣기
                L.insert(cursor, c);
            }
            
            
        }
        
        for(auto c:L) cout << c;
        cout << '\n';
        
        
    }
    
    
    
   
    return 0;
}
profile
ML/AI Engineer
post-custom-banner

0개의 댓글