본문으로 바로가기

[백준 5397] 키로거

category PS/백준 문제풀이 2019. 8. 9. 11:01
336x280(권장), 300x250(권장), 250x250, 200x200 크기의 광고 코드만 넣을 수 있습니다.

 

 

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

 

5397번: 키로거

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

www.acmicpc.net

 

연결리스트를 이용해서 풀었다.

문자열의 시작과 끝을 주의하기 위해서 시작과 끝을 표시하는 빈 노드를 새로 두었다.

이렇게 되면 삭제나 삽입 시 조건을 줄일 수 있어서 좋다.

 

클래스로 짜지 않고 처음에 대충 짜다가 많이 틀렸다.

 

1
<<BP<A>>Cd-

1
>>>ABC->>e<<<<-

1
ABC<<<<<<abc>>-D>>>>-

 

위 반례로 계속 시도하면서 풀었다.

 

 

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

int n;
string str;

struct Node{
    char ch;
    Node *prev = NULL, *next = NULL;
};

class Password{
private:
    // start&end 는 문자열의 시작과 끝. (빈 노드)
    // cursor는 문자열의 오른쪽에 존재한다고 생각.
    // cursor가 가리키고 있는 노드의 오른쪽에 있다고 가정.
    Node *start, *cursor, *end;
    
public:
    Password(){
        start = new Node;
        end = new Node;
        
        start->next = end;
        end->prev = start;
        
        cursor = start;
    }
    
    Node* getStart(){
        return start;
    }
    
    void enterPass(char in){
        Node *newNode = new Node;
        newNode->ch = in;
        
        newNode->prev = cursor;
        newNode->next = cursor->next;
        
        cursor->next->prev = newNode;
        cursor->next = newNode;
    
        cursor = newNode;
    }
    
    void deletePass(){
        // 커서가 문자열의 제일 앞에 와있을 때는 삭제를 할 것이 없다.
        if(cursor != start){
            cursor->prev->next = cursor->next;
            cursor->next->prev = cursor->prev;
            cursor = cursor->prev;
        }
    }
    
    void moveLeft(){
        if(cursor != start)
            cursor = cursor->prev;
    }
    
    void moveRight(){
        if(cursor->next != end)
            cursor = cursor->next;
    }
    
    void printPass(){
        for(Node* temp = start->next; temp != end; temp = temp->next)
            cout << temp->ch;
        cout << '\n';
    }
};

int main(){
    ios_base::sync_with_stdio(false);
    cin.tie(NULL);
    
    cin >> n;
    while(n--){
        Password pw;
        
        cin >> str;
        
        for(int i = 0; i < str.size(); i++){
            if(str[i] == '-'){
                pw.deletePass();
            }else if(str[i] == '<'){
                pw.moveLeft();
            }else if(str[i] == '>'){
                pw.moveRight();
            }else{
                pw.enterPass(str[i]);
            }
        }
        pw.printPass();
    }
    
    return 0;
}

 

 

 

'PS > 백준 문제풀이' 카테고리의 다른 글

[백준 1269] 대칭 차집합  (0) 2019.08.21
[백준 1068] 트리  (0) 2019.08.17
[백준 16507] 어두운 건 무서워  (0) 2019.08.08
[백준 10986] 나머지 합  (0) 2019.08.08
[백준 16139] 인간-컴퓨터 상호작용  (0) 2019.08.07