Record

BAEK1406. 에디터 본문

Algorithm/BOJ

BAEK1406. 에디터

윤프라이즈 2023. 6. 25. 01:40

2023년 6월 25일

https://www.acmicpc.net/problem/1406

시간 : ❤❤❤❤❤

만족도 : ❤❤❤❤❤


아까 풀었던 키로거 문제와 같은 유형의 문제이다.

옛날에 풀었을 때 틀렸었던 문제였다.

그 당시 코드를 보니 ArrayList 자료 구조를 사용했는데,

아마 지금은 Stack을 사용해서 Stack 에 element를 삽입하고 삭제할 때 시간 복잡도가 O(1)이므로 시간초과 됐던 문제를 해결할 수 있었다.

앞으로 있을 모든 코딩테스트 및 꼭 취득하고 싶은 B형 역량테스트에 있어서 어떤 자료구조의 시간 복잡도가 어떤지 잘 파악하고 활용할 수 있는 것이 중요하다.


  • 코드

      import java.io.BufferedReader;
      import java.io.IOException;
      import java.io.InputStreamReader;
      import java.util.Stack;
      import java.util.StringTokenizer;
    
      public class BAEK1406 {
          static Stack<Character> stack, temp;
          public static void main(String[] args) throws IOException {
              BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
              StringTokenizer st;
              String str = br.readLine();
              StringBuilder sb = new StringBuilder();
              stack = new Stack<>();
              temp = new Stack<>();
              for (int i = 0; i < str.length(); i++) {
                  stack.add(str.charAt(i));
              }
              int N = Integer.parseInt(br.readLine());
    
              for (int i = 0; i < N; i++) {
                  st = new StringTokenizer(br.readLine());
                  String order = st.nextToken();
                  switch (order) {
                      // 왼쪽 키보드를 눌렀을 때, stack에서 temp로 한 개 옮긴다.
                      case "L":
                          if (!stack.isEmpty()) {
                              temp.add(stack.pop());
                          }
                          break;
                      // 오른쪽 키보드를 눌렀을 때, temp에서 stack으로 한 개 옮긴다.
                      case "D":
                          if (!temp.isEmpty()) {
                              stack.add(temp.pop());
                          }
                          break;
                      // 백스페이스를 눌렀을 때, stack에서 한 개 제거한다.
                      case "B":
                          if (!stack.isEmpty()) stack.pop();
                          break;
                      // 문자, 숫자를 눌렀을 때, stack에 삽입한다.
                      default:
                          String s = st.nextToken();
                          stack.add(s.charAt(0));
                          break;
                  }
              }
              // temp로 옮긴 것들을 다 stack으로 옮겨준다.
              while(!temp.isEmpty()) {
                  stack.add(temp.pop());
              }
              // 비밀번호만 담긴 stack에서 StringBuilder에 넣어준다.
              while(!stack.isEmpty()) {
                  sb.append(stack.pop());
              }
              // 현재는 비밀번호가 거꾸로 뒤집어져 있으므로 반대로 뒤집어준다.
              sb.reverse();
              // 출력한 후에, sb를 초기화 시킨다.
              System.out.println(sb.toString());
          }
      }

'Algorithm > BOJ' 카테고리의 다른 글

BAEK3986. 좋은 단어  (0) 2023.06.26
BAEK10799. 쇠막대기  (0) 2023.06.25
BAEK5397. 키로거  (0) 2023.06.24
BAEK16236. 아기 상어  (0) 2023.06.23
BAEK9370. 미확인 도착지  (0) 2023.06.22
Comments