Programming/JAVA

[백준] 5397: 키로거

gayeon_ 2024. 1. 24. 00:40

 

 

 

 

 

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.LinkedList;
import java.util.ListIterator;

public class Main {

    public static void main(String[] args) throws IOException {
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));

        int T = Integer.parseInt(br.readLine());

        for (int t = 0; t < T; t++) {
            String input = br.readLine();
            String result = getPassword(input);
            System.out.println(result);
        }
    }

    private static String getPassword(String input) {
        LinkedList<Character> password = new LinkedList<>();
        ListIterator<Character> iterator = password.listIterator();

        for (char c : input.toCharArray()) {
            switch (c) {
                case '<':
                    if (iterator.hasPrevious()) {
                        iterator.previous();
                    }
                    break;
                case '>':
                    if (iterator.hasNext()) {
                        iterator.next();
                    }
                    break;
                case '-':
                    if (iterator.hasPrevious()) {
                        iterator.previous();
                        iterator.remove();
                    }
                    break;
                default:
                    iterator.add(c);
                    break;
            }
        }

        StringBuilder sb = new StringBuilder();
        for (char c : password) {
            sb.append(c);
        }

        return sb.toString();
    }
}

 

키로거가 기록한 입력을 통해 강산이의 비밀번호를 복원하는 프로그램이다. 

 


getPassword메서드는 주어진 문자열을 순회하면서 키로거의 동작에 따라 비밀번호를 조작한다.

LinkedList를 사용하여 비밀번호를 저장하고

ListIterator를 이용하여 현재 커서 위치를 관리한다.

'<'가 나오면 이전 위치로 커서를 이동하고, '>'가 나오면 다음 위치로 커서를 이동한다.

 '-'가 나오면 현재 커서 위치의 이전 문자를 삭제한다. 이때 커서를 이동한 후에 삭제를 해야 하므로 iterator.previous()를 사용했다.

그 외의 문자는 현재 커서 위치에 추가한다.

마지막으로 StringBuilder를 사용하여 비밀번호를 구성하고 반환한다.