[백준 1406번] 에디터 (Java 풀이)
백준알고리즘 1406번 : 에디터
각 명령어에 맞추어 실행되는 에디터를 만드는 문제이다.
커서를 좌측 우측으로 옮기거나,
문자를 지우거나, 문자를 추가하는 간단한 에디터이다.
그렇지만 문제는 절대 간단하지 않았다. 시간 초과가 더럽게 많이 났기 때문에.
처음엔 커서의 위치를 정수 변수로 지정하여 String값을 subString해서
지지고 볶고 하려고 했는데 시간 초과가 났고,
다음엔 ArrayList를 이용해서 add와 remove를 반복하면서 삭제와 추가를 했는데
역시 시간 초과가 났다. ^^
결국 학습과 검색끝에 Charcter Type의 두 Stack을 이용해서 풀기로했는데,
Scanner로 푸니 시간초과가 났다.
BufferedReader와 Scanner의 차이는 미미할 것이라고 생각했던 나의 생각을 깨주어서 참 고마운 문제이다.
이래서 다들 BufferedReader를 쓰는구나 싶기도하고,, 나도 BufferedReader를 쓰는 습관을 길러야겠다.
Stack 2개를 이용하면 좋은 점이, 커서의 위치 따위를 알 필요가 없다는 것이다.
lStack과 rStack 사이가 자동으로 Cursor의 역할을 한다고 생각하면 되겠다.
즉. 커서를 왼쪽으로 옮긴다면 lStack의 값을 pop하여 rStack으로 push하고,
커서를 오른쪽으로 옮긴다면 rstack의 값을 pop하여 lStack으로 push한다.
삭제를 한다면 lStack을 pop하여 없애주고,
추가 역시 lStack에 push를 통해 값을 넣어준다.
풀이 과정
1. Character type의 Stack을 2개 선언(left, right)하고,
하나의 Stack(left)에 모든 문자를 받아 넣는다.
2. 조건에 맞추어 다른 Stack으로 옮기거나, pop 혹은 push를 통해 값을 추가 및 삭제한다.
L(커서 왼쪽 이동) : left Stack의 문자 하나를 right Stack으로 옮긴다.
D(커서 오른쪽 이동) : right Stack의 문자 하나를 left Stack으로 옮긴다.
B(문자 삭제) : left Stack의 문자 하나를 pop하여 없앤다.
P(문자 추가) : left Stack에 push하여 문자를 추가한다.
3. 2번 작성시 Stack의 빈 여부를 조건문에 포함하여 실행하도록한다.
4. left Stack의 모든 문자를 right Stack에 넣은 뒤, right Stack에 있는 값을 모두 출력한다.
소스 ▽
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.Stack;
public class Main { // 1406번 에디터
static String word;
static int leng;
static int cursorPos;
static Stack<Character> lStack;
static Stack<Character> rStack;
public static void main(String[] args) throws IOException {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
word = br.readLine();
lStack = new Stack<Character>();
rStack = new Stack<Character>();
for (int i = 0; i < word.length(); i++) {
lStack.push(word.charAt(i));
}
int count = Integer.parseInt(br.readLine());
for (int i = 0; i < count; i++) {
String x = br.readLine();
Editor(x);
}
while (!lStack.empty()) {
rStack.push(lStack.pop());
}
while (!rStack.empty()) {
System.out.print(rStack.pop());
}
}
public static void Editor(String x) {
if (x.equals("L")) {// 커서 왼쪽 이동
if (lStack.size() != 0) {
rStack.push(lStack.pop());
}
} else if (x.equals("D")) {// 커서 오른쪽 이동
if (rStack.size() != 0) {
lStack.push(rStack.pop());
}
} else if (x.startsWith("P")) {// 추가
String[] plus = x.split(" ");
char pls = plus[1].toCharArray()[0];
lStack.push(pls);
} else if (x.equals("B")) {// 삭제
if (lStack.size() != 0) {
lStack.pop();
}
}
}
}