백준 > 에디터

jinvicky·2023년 11월 28일
0

ALG

목록 보기
5/62
post-thumbnail

에디터

명령어에 따라 커서를 바꿔가며 문자를 추가 또는 삭제한다.
최종적으로 문자열을 출력한다.

package src.baekjoon;


import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;

public class Main3 {

    public static void main(String[] args) throws IOException {
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        int N = Integer.parseInt(br.readLine());

        StringBuilder bft = new StringBuilder(br.readLine());
        int cursor = bft.length();

        for (int i = 1; i <= N; i++) {
            String line = br.readLine();
            int length = bft.length();
            switch (line.charAt(0)) {
                case 'P':
                    char param = line.charAt(line.length() - 1); //ok

                    String left = bft.substring(0, cursor);
                    String right = bft.substring(cursor, length);

                    bft.setLength(0);
                    bft.append(left).append(param).append(right);
                    cursor++;
                    break;

                case 'L':
                    cursor = cursor == 0 ? cursor : --cursor;
                    break;

                case 'D':
                    cursor = cursor == length ? cursor : ++cursor;
                    break;

                case 'B':
                    if (cursor > 0) {
                        bft.deleteCharAt(--cursor);
                    }
                    else {
                        cursor = 0;
                        continue;
                    }
                    break;
                default:
                    break;
            }
        }
        System.out.println(bft);
    }
}

결과

시간초과로 실패.

추정 원인

  • substring과 StringBuilder 조작을 해서?

더 나은 방법을 찾다가 2개의 스택으로 풀라고 해서 다시 풀었다.

package src.baekjoon;

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

public class Main3_2 {

    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();
        int N = 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));
        }

        for (int i = 1; i <= N; i++) {
            String line = br.readLine();
            switch (line.charAt(0)) {
                case 'P':
                    char param = line.charAt(line.length() - 1); //ok
                    leftStack.push(param);
                    break;

                case 'L':
                    //왼쪽으로 커서를 이동, left top을 right에 push
                    if (!leftStack.isEmpty())
                        rightStack.add(leftStack.pop());
                    break;

                case 'D':
                    //오른쪽으로 커서를 이동, right top을 left에 push
                    if (!rightStack.isEmpty())
                        leftStack.push(rightStack.pop());
                    break;

                case 'B':
                    if (!leftStack.isEmpty())
                        leftStack.pop();
                    break;
                default:
                    break;
            }
        }
        while(!leftStack.isEmpty())
            rightStack.add(leftStack.pop());

        while(!rightStack.isEmpty())
            bw.write(rightStack.pop());

        bw.flush();
        bw.close();
    }
}

훨씬 코드가 간결하다.

leftStack과 rightStack을 각각 출력하면 아래와 같다.

최종 결과값은 yxabc가 되어야 한다.
따라서 leftStack은 앞에서부터, rightStack은 뒤에서부터 가져와야 한다는 것을 알 수 있다.

처음에 rightStack을 queue로 구현할까 생각도 했지만,
더 간단하게 leftStack을 전부 rightStack에 넣고 rightStack을 출력하면 문제가 해결되었다.

결과를 출력하기 위해서는
1. StringBuilder에 append하고 변수를 그대로 출력한다.

StringBuilder result = new StringBuilder(); // 결과문자열
  1. BufferedWriter를 사용해서 bw.flush()를 한다.
BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(System.out));
bw.flush();
bw.close();

문제 풀이 소요 시간

2일

profile
일단 쓰고 본다

0개의 댓글