본문 바로가기
문제풀이/백준 문제풀이

[ 알고리즘 ] 코딩 백준 1406 - 에디터 만들기 - Double Stack -.java

by 마늘아빠 2020. 9. 5.
728x90
반응형

백준 1406 - Editor 만들기

* 자바로 구현

* 스택을 2개 사용해야 한다고 한다.

* 현재 커서를 기준으로 왼쪽과 오른쪽 두개의 스택을 운용하면 4개의 연산을 처리하는데 걸리는 시간은 매우 적다

* 알고리즘적 사고를 많이 키워야겠다!!

public class Editor_Double_Stack {

	public static void main(String[] args) throws IOException{
		Editor_Double_Stack ep = new Editor_Double_Stack();
		ep.editor();
	}

	/** 에디터 구현 부*/
	private void editor() throws IOException{
		BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
		String stream = br.readLine();
		
		Stack<Character> left_stack = new Stack<>();
		Stack<Character> right_stack = new Stack<>();
		
		//일단 커서가 가장 오른쪽에 있을 것이기 때문에 초기 문자열은 모두 왼쪽 스택에 쌓자
		for( int i = 0; i < stream.length(); i++){
			left_stack.add(stream.charAt(i));
		}
		
		int command_amount = Integer.parseInt(br.readLine());
		
		for( int i = 0; i < command_amount; i++) {
			String command = br.readLine();
			StringTokenizer stt = new StringTokenizer(command);
			
			switch( stt.nextToken() ) {
			// 왼쪽 이동 명령어가 들어오면 왼쪽 스택은 pop, 오른쪽 스택에 push
			case "L":
				if(!left_stack.isEmpty()) {
					right_stack.push(left_stack.pop());
				}
				
				break;
			// 오른쪽 이동 명령어가 들어오면 오른쪽 스택 pop, 왼쪽 스택 push
			case "D":
				if(!right_stack.isEmpty()) {
					left_stack.push(right_stack.pop());
				}
				break;
			// 커서 왼쪽 삭제이므로 왼쪽 스택 pop
			case "B":
				if(!left_stack.isEmpty()) {
					left_stack.pop();
				}
				break;
			// 커서 왼쪽 부분 삽입이므로 왼쪽 스택에 push
			case "P":
				char txt = stt.nextToken().charAt(0);
				left_stack.push(txt);
				break;
			}
		}
		// 출력. 스택은 FILO 구조이기도 하고, 왼쪽 , 오른쪽 스택의 내용이 순차적으로 나와야 하기 때문에
		// 왼쪽 스택의 내용을 모두 오른쪽 스택으로 옮기고 오른쪽 스택을 출력하자.
		while(!left_stack.isEmpty()) {
			right_stack.push(left_stack.pop());
		}
		while(!right_stack.isEmpty()) {
			System.out.print(right_stack.pop());
		}
	}
}
반응형