[JAVA/1406번] 에디터

고지훈·2021년 9월 11일
1

Algorithm

목록 보기
20/68
post-thumbnail

문제


입력 및 출력


풀이

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

class Main {
    public static void main(String args[]) throws Exception {
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        String[] strArray = br.readLine().split("");
        int N = Integer.parseInt(br.readLine());

        Stack < String > left = new Stack < > ();
        Stack < String > right = new Stack < > ();

        for (int i = 0; i < strArray.length; i++) {
            left.push(strArray[i]); // a, b, c, d	
        }

        while (N-- > 0) {
            String[] input = br.readLine().split(" ");

            switch (input[0]) {
                case "L":
                    if (left.size() != 0) {
                        right.push(left.pop());
                    }
                    break;
                case "D":
                    if (right.size() != 0) {
                        left.push(right.pop());
                    }
                    break;
                case "B":
                    if (left.size() != 0) {
                        left.pop();
                    }
                    break;
                case "P":
                    left.push(input[1]);
                    break;
            }
        }
		
        while(!right.isEmpty()){
			left.push(right.pop());
		}

		StringBuilder sb = new StringBuilder();
		for(int i = 0; i < left.size(); i++){
			sb.append(left.get(i));
		}

		System.out.println(sb);
    }
}

결과 및 해결방법

[결과]

[정리]

해결방법

  • 커서의 이동과 제한 시간까지 걸려있는 문제라 조금 까다로웠다.

    처음에는 배열을 사용하여 구현을 시도하였다. "커서의 이동을 어떻게 표현할까?"가 나의 첫 목표였고, 인덱스 변수를 생성하여 명령을 입력받을 때마다 이동시켜주었다.

    하지만 이와 같은 방식을 적용하니 특정 커서에 문자를 넣을 때, 너무 배열의 원소를 한 칸씩 뒤로 미뤄야 하는 번거로움이 생겼다. 다시 문제를 꼼꼼히 살펴보았고, 스택으로 문제를 해결하였다.

  • 스택은 후입선출(LIFO)의 특징을 갖는 자료구조로, 커서의 위치를 표현하는데 제격이었다.

    가장 먼저 입력받은 문자열을 split 메소드를 사용하여 배열에 넣어준 후, 반복문을 통해 배열에 있는 원소를 left 스택에 넣어주었다.

    사용자로부터 입력받을 명령어의 개수만큼 while 반복문을 수행하였고, input 변수를 통해 명령어를 입력받았다.

  • 명령어 L의 경우, 커서를 왼쪽으로 옮기는 명령어이다. 따라서, 커서를 옮기기 위해 left 스택에 존재하는 원소를 right 스택으로 넣는다.

    커서의 위치가 맨 앞일 경우, 해당 명령어가 수행되어야 하지 않기 때문에, size 메소드를 통해 0이 아닐 경우만 명령어를 수행하도록 설정하였다.

  • 명령어 D의 경우, 커서를 오른쪽으로 옮기는 명령어이다. 따라서, 커서를 오른쪽으로 옮기기 위해 right 스택에 존재하는 원소를 left 스택으로 넣는다.

  • 명령어 B의 경우, 커서의 왼쪽에 위치하는 원소를 제거하는 명령어로 left 스택의 원소 중 가장 마지막에 들어온 원소를 제거해주었다.

  • 명령어 P $의 경우, 커서의 왼쪽에 $문자를 넣는 명령어로 left 스택의 가장 마지막에 $를 넣어주었다.

  • 모든 반복문이 수행된 후 커서의 위치에 따라 left 스택과 right 스택에 쌓인 원소가 있을 것이고, 두 스택은 단순히 커서의 위치를 나타내기 위한 스택이기 때문에 right 스택에 존재하는 모든 원소를 left 스택으로 넣었다.

    처음에는 System.out.print 구문으로 left 스택의 사이즈만큼 원소를 출력하였으나, 시간초과의 문제로 인해 StringBuilder를 사용하였고 문제를 해결할 수 있었다.

profile
"계획에 따르기보다 변화에 대응하기를"

0개의 댓글