기초 알고리즘 - 에디터(5)

Code_Alpacat·2021년 11월 5일
0

기초 알고리즘!

목록 보기
5/19

문자를 기록해 명령어에 해당하는 문자를 편집하는 에디터를 만드는 문제다. 커서를 L이라고 할 때, 문자열의 마지막 위치인 L+1에서 커서가 시작한다.

  • L : 커서를 왼쪽으로 한 칸 옮김 (커서가 문장의 맨 앞이면 무시됨)
  • D : 커서를 오른쪽으로 한 칸 옮김 (커서가 문장의 맨 뒤이면 무시됨)
  • B : 커서 왼쪽에 있는 문자를 삭제함 (커서가 문장의 맨 앞이면 무시됨)
    삭제로 인해 커서는 한 칸 왼쪽으로 이동한 것처럼 나타나지만, 실제로 커서의 오른쪽에 있던 문자는 그대로임
  • P $ : $라는 문자를 커서 왼쪽에 추가함

이와 같다.

나는 stack을 이용해줘야겠다고 생각을 했다. 그러나 왼쪽이나 오른쪽으로 이동할때, 삭제되지 않아야할 문자들을 어떻게 처리해야할지 고민하다 스택을 두 개 생성해야하는 아이디어를 참고했다.

이상하게 내가 스스로 풀때는 이렇게 해야겠다는 생각을 하기가 매우 힘들다.

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

public class Hello_world {
 
	public static void main(String[] args) throws IOException {
		BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
		
		String str = br.readLine();
		
		int N = Integer.parseInt(br.readLine());
		Stack<String> left_stack = new Stack<String>();
		Stack<String> right_stack = new Stack<String>();
		
		String[] list = str.split("");
		//str에서 입력받은 문자열을 문자단위로 분리해서 list 배열에 저장
		for(int i=0; i<list.length; i++) {
			left_stack.push(list[i]);
		}
		//list에 값 저장.
		
		for(int i=0; i<N; i++) {
			String command = br.readLine();
			char c = command.charAt(0);
			
			switch(c) {
			
			case 'L': if(!left_stack.isEmpty()) {
				right_stack.push(left_stack.pop());
			}
			
			case 'D': if(!right_stack.isEmpty()) {
				left_stack.push(right_stack.pop());
				
			}
			
			case 'B': if(!left_stack.isEmpty()) {
				left_stack.pop();
			
			}
			
			case 'P': left_stack.push(String.valueOf(command.charAt(2)));
		}
		
	}
		while(!left_stack.isEmpty()) {
			right_stack.push(left_stack.pop());
		}
		while(!right_stack.isEmpty()) {
			System.out.print(right_stack.pop());
		}
}
}

switch case 문을 이용해줬다. P를 공백단위로 나눠주는게 아니라 P x를 입력받으면 command.charAt(0), command.charAt(1), command.charAt(2)로 나눠주고 첫 글자인 P가 나오면. 마지막 문자를 push 해주는 것은 매우 참신했다.

사실상 stack의 원리를 알고 제대로 활용할줄 아는 사람들은 쉽게 풀 수도 있던 문제다. 구상의 과정이 stack을 두 개를 활용해야하는 것이지만, 경험치가 이런 문제를 푸는 응용력을 길러줄 것이다.

profile
In the future, I'm never gonna regret, cuz I've been trying my best for every single moment.

0개의 댓글