기초 알고리즘 - 에디터(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개의 댓글

관련 채용 정보