문자를 기록해 명령어에 해당하는 문자를 편집하는 에디터를 만드는 문제다. 커서를 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을 두 개를 활용해야하는 것이지만, 경험치가 이런 문제를 푸는 응용력을 길러줄 것이다.