알고리즘 문제풀이

[백준 - 1406 Java] 에디터

TutleKing 2023. 3. 14. 21:06

실버 2의 문제로 자료구조를 어떻게 사용하는지를 익힐 수 있는 문제였다. 

주어진 문제에서 문자를 삽입하고, 삭제하는 조건들이 있어 LinkedList를 사용하면 찰떡이라고 생각해서 문제를 풀었다.

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

public class Main {
    static int cursor = 0;
    static List<Character> list = new LinkedList<>();

    public static void main(String[] args) throws Exception {
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        // Scanner scanner = new Scanner(System.in);
        String s = br.readLine();

        for (char c : s.toCharArray()) {
            list.add(c);
        }
        cursor = list.size();

        int cmdCount = Integer.parseInt(br.readLine());
        for (int i = 0; i < cmdCount; i++) {
            String cmd = br.readLine();
            char c = '0';
            if (cmd.length() == 3) {
                c = cmd.charAt(2);
            }
            verifyCommand(cmd.charAt(0), c);
        }
        StringBuilder sb = new StringBuilder();
        for (char ch : list) {
            sb.append(ch);
        }
        System.out.println(sb);
        br.close();
    }

    static void verifyCommand(char cmd, char str) {
        if (cmd == 'L') {
            if (cursor == 0) {
                return;
            }
            cursor--;
        } else if (cmd == 'D') {
            if (cursor == list.size()) {
                return;
            }
            cursor++;
        } else if (cmd == 'B') {
            if (cursor == 0) {
                return;
            }
            list.remove(cursor - 1);
            cursor--;
        } else if (cmd == 'P') {
            list.add(cursor == 0 ? 0 : cursor, str);
            cursor++;
        }
        return;
    }
}

그러나 계속 타임아웃.... C++로 설명하는 강의를 들어서 그런가 언어 특성별로 속도가 많이 차이나는 것을 느꼈다. 

어찌 되었던 수 많은 시도를 해도 해당 코드에서는 해결될 기미가 보이지 않았다. 

 

그리하여 Stack을 사용하고자 하였다.  

커서가 왼쪽으로 가면 오른쪽 스택에 글자를 넣고, 커서가 오른쪽으로 가면 왼쪽 스택에 글자를 넣어 커서 위치 변경에 따라 왼쪽,오른쪽 스택에 글자가 쌓이게 하였다. 

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

public class Main {
    static Stack<Character> rightStack = new Stack<>();
    static Stack<Character> leftStack = new Stack<>();


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

        for (char c : s.toCharArray()) {
            leftStack.add(c);
        }

        int cmdCount = Integer.parseInt(br.readLine());
        for (int i = 0; i < cmdCount; i++) {
            String cmd = br.readLine();
            char c = '0';
            if (cmd.length() == 3) {
                c = cmd.charAt(2);
            }
            verifyCommand(cmd.charAt(0), c);
        }
        StringBuilder sb = new StringBuilder();
        for (char ch : leftStack) {
            sb.append(ch);
        }
        while (!rightStack.isEmpty()) {
            sb.append(rightStack.pop());
        }
        System.out.println(sb);
        br.close();
    }

    static void verifyCommand(char cmd, char str) {
        if (cmd == 'L') {
            if (leftStack.isEmpty()) {
                return;
            }
            rightStack.add(leftStack.pop());
        } else if (cmd == 'D') {
            if (rightStack.isEmpty()) {
                return;
            }
            leftStack.add(rightStack.pop());
        } else if (cmd == 'B') {
            if (leftStack.isEmpty()) {
                return;
            }
            leftStack.pop();
        } else if (cmd == 'P') {
            leftStack.add(str);
        }
        return;
    }
}

그리고는 결과를 프린트 할 때는 왼쪽 스택은 스택 순서의 역방향으로 프린트를 할 필요가 있었고 오른쪽 스택은 pop() 하여 순서를 지켜냈다. (왼쪽 스택은 먼저 넣은 거 부터 프린트를 하게되면, 반대로 프린트 되기 때문에) 

 

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

반응형