Coding Test/Baekjoon

백준/1406/Java - 에디터

grogu.... 2023. 2. 21. 01:55

문제

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

 

1406번: 에디터

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

www.acmicpc.net


주어진 명령어들을 살펴보면 커서의 위치가 중요하다는 것을 알 수 있다.

커서의 위치에 따라 문자를 어디에 추가하거나, 어떤 문자를 삭제할지 결정되기 때문이다.

dmih라는 문자열이 주어졌을 때 커서의 위치를 '로 표현하면, 처음에는 문제의 조건에 따라 가장 우측에 위치한다.

d m i h '        

만약 명령어 L에 따라 커서를 왼쪽으로 옮긴 뒤 명령어 P x로 x를 입력하면 다음과 같다.

L:

d m i ' h        

P x:

d m i x ' h      

B:

d m i x h '      

만약 커서를 기준으로 좌우를 각각 스택이라고 생각한다면,

커서 기준 좌측은 가장 좌측 문자가 맨위에 있는 스택(이하 스택1)이고

커서 기준 우측은 가장 우측 문자가 맨위에 있는 스택(이하 스택2)이라고 볼 수 있다.

 

즉 다음과 같이 각 명령어를 해석할 수 있다.

 

명령어  L : (좌측 스택이 비어있지 않다면) 스택1의 맨 위 문자를 스택2로 보냄

명령어 D : (우측 스택이 비어있지 않다면) 스택2의 맨 위 문자를 스택1로 보냄

명령어 B : (커서 좌측 문자열을 지우는 것이므로 좌측 스택이 비어있지 않다면) 스택1 맨위 문자 삭제

명령어  P $:(커서 좌측에 추가하는 것이니까)스택1에 문자 $ 추가

 


코드

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

public class Main {

	public static void main(String[] args) throws NumberFormatException, IOException {
		BufferedReader br = new BufferedReader(new InputStreamReader(System.in));		
		StringBuilder sb = new StringBuilder();
		//커서 좌측 문자 스택(커서에 가까울수록 = 뒤에 있는 문자일수록 스택의 상단 위치)
		Stack<Character> stack1 = new Stack<>();
        //커서 우측 문자 스택(커서에 가까울수록 = 앞에 있는 문자일수록 스택의 상단 위치)
		Stack<Character> stack2 = new Stack<>();
		
		String s = br.readLine();
		for(int i=0; i<s.length(); i++) {
			char c = s.charAt(i);
			stack1.push(c);
		}
		int n = Integer.parseInt(br.readLine());
		
		
		String command;
		for(int i=0; i<n; i++) {
			command = br.readLine();
			if(command.equals("L")) {
				if(!stack1.isEmpty()) {
					stack2.push(stack1.pop());
				}
			}
			else if(command.equals("D")) {
				if(!stack2.isEmpty()) {
					stack1.push(stack2.pop());
				}
			}
			else if(command.equals("B")) {
				if(!stack1.isEmpty()) {
					stack1.pop();
				}
			}
			else {
            	//P $의 경우 영어 소문자 1개를 추가하는 명령어임.
				char $ = command.charAt(2);
				stack1.push($);
			}
		}
		/*
            출력 시 커서를 문자열 맨 앞으로 옮겨놓고(=모든 문자를 커서 우측 스택으로 보내놓고)
            StringBuilder에 추가하면 맨 앞 문자부터 추가됨.
        */
		while(!stack1.isEmpty()) {
			stack2.push(stack1.pop());
		}
		while(!stack2.isEmpty()) {
			sb.append(stack2.pop());
		}
		System.out.println(sb);
	}	
}