알고리즘/BOJ

[BOJ] 1406. 에디터

재담 2022. 2. 26. 01:40

문제 원본 : https://www.acmicpc.net/problem/1406

 

1406번: 에디터

첫째 줄에는 초기에 편집기에 입력되어 있는 문자열이 주어진다. 이 문자열은 길이가 N이고, 영어 소문자로만 이루어져 있으며, 길이는 100,000을 넘지 않는다. 둘째 줄에는 입력할 명령어의 개수

www.acmicpc.net

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

public class Main {
    public static void main(String[] args) throws IOException {
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(System.out));

        String str = br.readLine();
        Stack<String> left = new Stack<>();
        Stack<String> right = new Stack<>();

        for (int i = 0; i < str.length(); ++i) {
            left.push(str.substring(i, i + 1));
        }

        String cmd = "";
        int n = Integer.parseInt(br.readLine());

        for (int i = 0; i < n; ++i) {
            cmd = br.readLine();

            if (cmd.equals("L") && !left.empty()) {
                right.push(left.pop());
            } else if (cmd.equals("D") && !right.empty()) {
                left.push(right.pop());
            } else if (cmd.equals("B") && !left.empty()) {
                left.pop();
            } else if (cmd.startsWith("P")) {
                String character = cmd.split(" ")[1];
                left.push(character);
            }
        }

        StringBuilder builder = new StringBuilder();

        while(!left.empty()) {
            builder.append(left.pop());
        }

        builder = builder.reverse();

        while (!right.empty()) {
            builder.append(right.pop());
        }

        bw.write(builder.toString());

        bw.close();
        br.close();
    }
}
  • 실버 3인데 정답 비율이 많이 낮길래(26.753%) 궁금해서 풀어 보았다.
  • 처음엔 그냥 String 썼다가 바로 시간 초과가 떠서 StringBuilder로 바꿨더니 60%쯤에서 시간 초과가 났다.
  • 애초에 접근법이 잘못됐었고, 스택으로 바꿔서 풀었다.
  • 처음에 스택이란 키워드를 보고 이 문제를 어떻게 스택으로 풀지라고 생각했었는데...
  • 어떤 분의 풀이를 보고 왼쪽 스택, 오른쪽 스택으로 나눠서 풀면 된다는 걸 깨닫고 유레카를 외쳤다!