BOJ 1406. 에디터

1 minute read

BOJ 1406. 에디터

image image

풀이

커서의 왼쪽과 오른쪽에 각각 Stack으로 관리한다.
먼저 커서는 입력 문장의 끝에 위치하므로  커서 왼쪽 스택에 입력문장을 모두 넣고 시작한다.

입력문자 abcd  image

그 다음 P x를 수행한다.
왼쪽 스택에 x를 push()한다.
image

다음 L 명령을 수행한다.
왼쪽으로 커서를 한 칸 이동하게 되므로
왼쪽 스택에서 pop(), 오른쪽으로 push() image

그다음 P y를 수행한다.
왼쪽 스택에 y를 push()한다.
image

그 다음 출력을 위해 오른쪽 스택으로 모두 이동
image

오른쪽 스택에서 pop() 하여 순서대로 출력

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

class Main {
    public static void main(String[] args) throws IOException {
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        String str = br.readLine();
        int t = Integer.parseInt(br.readLine());
        Stack<Character> leftStack = new Stack<>();
        Stack<Character> rightStack = new Stack<>();
        
        for (int i = 0; i < str.length(); i++) {
            leftStack.push(str.charAt(i));
        }

        while (t-- > 0) {
            String input = br.readLine();
            String[] inputs = input.split(" ");
            if ("L".equals(inputs[0])) {
                if (leftStack.size() > 0) {
                    Character c = leftStack.pop();
                    rightStack.push(c);
                }
            } else if ("D".equals(inputs[0])) {
                if (rightStack.size() > 0) {
                    Character c = rightStack.pop();
                    leftStack.push(c);
                }
            } else if ("B".equals(inputs[0])) {
                if (leftStack.size() > 0) {
                    leftStack.pop();
                }
            } else {
                leftStack.push(inputs[1].charAt(0));
            }
        }

        StringBuilder sb = new StringBuilder();
        while (!leftStack.isEmpty()) {
            rightStack.push(leftStack.pop());
        }

        while (!rightStack.isEmpty()) {
            sb.append(rightStack.pop());
        }

        System.out.print(sb);
    }
}

코틀린 풀이에서는  커서 왼쪽은 Stack 오른쪽은 LinkedList를 이용한다.

fun main() {
    val str = readLine()!!
    val t = readLine()!!.toInt()

    val st = Stack<Char>()
    val q = LinkedList<Char>()

    for (ch in str) {
        st.push(ch)
    }

    repeat(t) {
        when (val input = readLine()!!) {
            "L" -> if (!st.isEmpty()) q.addFirst(st.pop())
            "D" -> if (!q.isEmpty()) st.push(q.poll())
            "B" -> if (!st.isEmpty()) st.pop()
            else -> st.push(input.split(" ")[1][0])
        }
    }
    println("${st.joinToString("")}${q.joinToString("")}")
}

풀이소스

github.com/beomjo/algorithm-study/blob/main/BOJ/java/1406.java github.com/beomjo/algorithm-study/blob/main/BOJ/kotlin/1406.kt