[백준 1406] 에디터 (자바)
알고리즘/백준

[백준 1406] 에디터 (자바)

반응형

백준 1406번 에디터  (자바)

 

 

출처

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

 

1406번: 에디터

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

www.acmicpc.net

 

 

문제

한 줄로 된 간단한 에디터를 구현하려고 한다. 이 편집기는 영어 소문자만을 기록할 수 있는 편집기로, 최대 600,000글자까지 입력할 수 있다.

이 편집기에는 '커서'라는 것이 있는데, 커서는 문장의 맨 앞(첫 번째 문자의 왼쪽), 문장의 맨 뒤(마지막 문자의 오른쪽), 또는 문장 중간 임의의 곳(모든 연속된 두 문자 사이)에 위치할 수 있다. 즉 길이가 L인 문자열이 현재 편집기에 입력되어 있으면, 커서가 위치할 수 있는 곳은 L+1가지 경우가 있다.

이 편집기가 지원하는 명령어는 다음과 같다.

 

명령어

 

초기에 편집기에 입력되어 있는 문자열이 주어지고, 그 이후 입력한 명령어가 차례로 주어졌을 때, 모든 명령어를 수행하고 난 후 편집기에 입력되어 있는 문자열을 구하는 프로그램을 작성하시오. 단, 명령어가 수행되기 전에 커서는 문장의 맨 뒤에 위치하고 있다고 한다.

 

 

입력

첫째 줄에는 초기에 편집기에 입력되어 있는 문자열이 주어진다. 이 문자열은 길이가 N이고, 영어 소문자로만 이루어져 있으며, 길이는 100,000을 넘지 않는다. 둘째 줄에는 입력할 명령어의 개수를 나타내는 정수 M(1 ≤ M ≤ 500,000)이 주어진다. 셋째 줄부터 M개의 줄에 걸쳐 입력할 명령어가 순서대로 주어진다. 명령어는 위의 네 가지 중 하나의 형태로만 주어진다.

 

 

출력

첫째 줄에 모든 명령어를 수행하고 난 후 편집기에 입력되어 있는 문자열을 출력한다.

 

 

입출력 예

 

입출력 1

 

입출력 2

 

입출력 3

 

 

 

한 줄 요약

커서는 left스택의 맨뒤라고 가정하고, pop연산 시 마지막 원소를 pop 해 right스택으로 이동시켜 맨뒤를 유지하도록 한다.

 

 

 

내 코드

1. 입력받을 문자열, 연산 개수를 생성한다.

2. left, right 스택을 생성한다.

3. list 배열에 입력받은 문자열을 문자 1개씩 넣고, left 스택에 push 한다.

4. n까지 반복문을 돌려 연산을 입력받는다.

5. P 명령어의 경우 3개의 문자로 나눌 수 있기 때문에 순수 연산 구분 문자인 command.charAt(0)을 문자형 변수 c에 넣는다.

6. 연산이 L이고(왼쪽으로 이동), left스택이 비지 않았을 때, left스택에서 pop 한 원소를 right 스택에 push 한다.

    - 커서가 left스택의 맨뒤여야 하기 때문에 top 원소를 right 함수로 옮긴다.

7. 연산이 D이고(오른쪽으로 이동), right스택이 비지 않았을 때, right스택에서 pop 한 원소를 left 스택에 push 한다.

    - 현재 커서 뒤에 원소가 없기 때문에 right스택에서 이전에 pop 한 원소를 가져온다.

8. 연산이 B이고(삭제), left스택이 비지 않았을 때, left스택에서 pop 한다.

9. 연산이 P일 때(원소 추가), left스택에 command.charAt(2)를 push 한다.

 

- left스택은 출력 순서가 반대이기 때문에 right스택에 옮겨서 출력한다.

10. left스택이 빌 때까지 pop 한 값을 right스택에 push 한다.

11. right스택을 출력한다.

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

public class Stack_1406 {
	public static void main(String[] args) throws NumberFormatException, IOException {
		
		BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
		
		//문자열
		String input = br.readLine();
		
		//연산 개수
		int n = Integer.parseInt(br.readLine());
		
		//왼쪽(기존 문자)
		Stack<String> left = new Stack<String>();
		//오른쪽(pop시 활용)
		Stack<String> right = new Stack<String>();
		
		String[] list = input.split("");
		//left에 기존 문자열 순서대로 넣기
		for (int i=0; i<list.length; i++) {
			left.push(list[i]);
		}
		
		for (int i=0; i<n; i++) {
			String command = br.readLine();
			char c = command.charAt(0);
			
			if (c == 'L' && !left.isEmpty()) {
				//왼쪽으로 이동시 하나 오른쪽으로 이동
				right.push(left.pop());
			} else if (c == 'D' && !right.isEmpty()) {
				//오른쪽으로 이동시 하나 왼쪽으로 이동
				left.push(right.pop());
			} else if (c == 'B' && !left.isEmpty()) {
				//삭제
				left.pop();
			} else if (c == 'P') {
				//추가
				left.push(String.valueOf(command.charAt(2)));
			}
		}
		
		while (!left.isEmpty()) {
			right.push(left.pop());
		}
		while (!right.isEmpty()) {
			System.out.print(right.pop());
		}
		
	}
}

 

 

고려할 점

1. 스택을 2개 사용하는 것

2. 연산을 0번째와 2번째로 나눠 사용하는 것

3. left스택에서 원소가 반대로 나오는 것을 고려해 right스택에 옮겨 출력하는 것

 

 

 

반응형