본문 바로가기
알고리즘/백준

백준 1406번 - 에디터 (Java 8)

by latissimus 2022. 3. 11.

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

 

1406번: 에디터

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

www.acmicpc.net

Stack 활용

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

public class Main {
    static Stack<Character> stackLeft;
    static Stack<Character> stackRight;
    public static void main(String[] args) throws IOException {
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        String input = br.readLine();

        stackLeft = new Stack<Character>();
        stackRight = new Stack<Character>();

        for (Character x : input.toCharArray()) {
            stackLeft.push(x);
        }

        int numOfCommand = Integer.parseInt(br.readLine());

        while (numOfCommand-- > 0) {
            StringTokenizer st = new StringTokenizer(br.readLine());
            switch (st.nextToken()) {
                case "L":
                    L();
                    break;
                case "D":
                    D();
                    break;
                case "B":
                    B();
                    break;
                case "P":
                    P(st.nextToken());
                    break;
            }
        }
        StringBuilder sb = new StringBuilder();
        while(stackLeft.size() > 0){
            stackRight.push(stackLeft.pop());
        }
        while (stackRight.size() >0){
            sb.append(stackRight.pop());
        }
        System.out.println(sb);
    }

    public static void L() {
        if(!stackLeft.isEmpty()){
            stackRight.push(stackLeft.pop());
        }
    }

    public static void D() {
        if(!stackRight.isEmpty()){
            stackLeft.push(stackRight.pop());
        }
    }

    public static void B() {
        if(!stackLeft.isEmpty()){
            stackLeft.pop();
        }
    }

    public static void P(String charSequence) {
        stackLeft.push(charSequence.charAt(0));
    }
}

LinkedList로 풀었는데, 안돼서 stack 두개가 나란히 있다고 생각하고 풀었다. 스스로 생각해낸게 장하긴 했다. stack이 LIFO이라 오른쪽에 몰아넣고 pop해야 한다고 생각했는데, 향상된 for문으로 그냥 출력이 되어버린다.

속도도 더 빠르던데, 이유는 모른다.

 

또 ,풀고나서 권민하님 블로그를 봤는데, listIterator를 사용한 방법도 있었다. 시간복잡도에 대한 고민이 필요함을 절실히 느꼈다.

 

*자료구조, 시간복잡도 공부 필요

댓글