코딩테스트/BOJ

[BOJ] 5397 키로거 - JAVA

5월._. 2023. 2. 24.
728x90

1. 문제

 

5397번: 키로거

첫째 줄에 테스트 케이스의 개수가 주어진다. 각 테스트 케이스는 한줄로 이루어져 있고, 강산이가 입력한 순서대로 길이가 L인 문자열이 주어진다. (1 ≤ L ≤ 1,000,000) 강산이가 백스페이스를 입

www.acmicpc.net

창영이는 강산이의 비밀번호를 훔치기 위해서 강산이가 사용하는 컴퓨터에 키로거를 설치했다. 며칠을 기다린 끝에 창영이는 강산이가 비밀번호 창에 입력하는 글자를 얻어냈다.

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

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


2. 풀이

커서를 기준으로 앞부분, 뒷부분으로 스택을 두개 운영한다. 

<이면 앞으로 커서를 이동하는 것이므로 앞에서 뺀 문자열을 뒷부분에 더한다.

>이면 뒤에서 뺀 문자열을 앞부분에 더한다.

-이면 앞에서 문자열을 하나 삭제한다.

나머지는 앞에 문자열을 붙인다.

 

연산이 완료되면 front 스택에 있는 문자열들을 모두 sb에 붙였다가 그대로 뒤집는다.(스택의 순서때문)

back스택에 있는 문자열은 그대로 sb에 붙인다.

import java.io.*;
import java.util.*;

public class BOJ_5397_키로거 {
   public static void main(String[] args) throws IOException {
      BufferedReader in = new BufferedReader(new InputStreamReader(System.in));
      int N = Integer.parseInt(in.readLine());
      StringBuilder answer = new StringBuilder();

      Stack<Character> front = new Stack<>();
      Stack<Character> back = new Stack<>();
      for(int i=0;i<N;i++){
         StringBuilder sb = new StringBuilder();

         for(char ch:in.readLine().toCharArray()){
            switch(ch){
               case '<':
                  if(!front.empty())back.push(front.pop());
                  break;
               case '>':
                  if(!back.empty()) front.push(back.pop());
                  break;
               case '-':
                  if(!front.empty()) front.pop();
                  break;
               default:
                  front.push(ch);
                  break;
            }
         }

         while(!front.empty()) sb.append(front.pop());
         sb.reverse();
         while(!back.empty()) sb.append(back.pop());
         answer.append(sb).append('\n');
      }

      System.out.print(answer);
   }
}

3. 결과

StringBulider로 사용해보려다가 시간초과, 런타임에러났다. stack으로 변경 후 성공했다.

'코딩테스트 > BOJ' 카테고리의 다른 글

[BOJ] 1806 부분합 - JAVA  (0) 2023.02.28
[BOJ] 13549 숨바꼭질 3 - JAVA  (0) 2023.02.25
[BOJ] 1713 후보 추천하기 - JAVA  (0) 2023.02.23
[BOJ] 1916 최소비용 구하기 - JAVA  (0) 2023.02.21
[BOJ] 12904 A와 B - JAVA  (0) 2023.02.20

댓글