4개 명령어를 가진 텍스트 에디터를 구현해야 하는 문제이다.
중간에 삽입, 삭제 등 연산이 빈번히 발생하기 때문에 가장 먼저 LinkedList
를 생각하고 구현했다.
어떤 방법으로도 LinkedList
로는 시간초과를 벗어나지 못했다..
삽입, 삭제에는 효율적인 자료구조이지만 cursor
까지 데이터를 스캔할 때 O(N)
의 성능을 보이는 것이 문제인 것 같다.
시간초과를 해결하기 위해 삽입,삭제,조회 모두 O(1)
의 성능을 갖는 Stack
자료구조를 사용했다.
두 개 Stack
을 사용한다.
leftStack
rightStack
뽀인트
leftStack
의top
을cursor
의 위치와 동일하게 만들어준다.
각 명령어에 대한 동작을 살펴보자.
P
: 삽입
cursor
의 위치와 leftStack
의 top
이 동일해야 하기 때문에 P
에 의해 텍스트가 삽입될 때는 leftStack
에 push
한다.
B
: 삭제
leftStack
의 top
에 값이 있다면 pop
한다.
자연스럽게 커서의 위치에서 데이터를 지우게 된다.
L
: 왼쪽으로 cursor
이동
cursor
와 leftStack
의 top
의 위치는 동일해야 한다.
cursor
가 왼쪽으로 이동하므로 leftStack
의 top
의 위치도 감소시켜줘야 한다.
이 때 leftStack
에서 빠지는 값은 rightStack
으로 넣어준다.
D
오른쪽으로 cursor
이동
rightStack
에서 leftStack
으로 pop
후 push
한다.
모든 명령어를 수행하고 출력할 때에는 스택의 특성상 뒤집어진 문자들을 다시 원복시켜줘야 한다.
남아있는 leftStack
의 모든 값을 rightStack
으로 옮기고 다시 leftStack
으로 옮기면 자연스럽게 원래 상태로 뒤집어진다.
public class Q1406_2 {
public static void main(String[] args) throws IOException {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(System.out));
Stack<Character> leftStack = new Stack<>();
Stack<Character> rightStack = new Stack<>();
String initialStr = br.readLine();
int m = Integer.parseInt(br.readLine());
for (int i=0;i<initialStr.length();i++) {
leftStack.push(initialStr.charAt(i));
}
for (int i=0;i<m;i++) {
String commandLine = br.readLine();
char command = commandLine.charAt(0);
switch (command) {
case 'P':
leftStack.push(commandLine.charAt(2));
break;
case 'B':
if (!leftStack.isEmpty()) leftStack.pop();
break;
case 'L':
if(!leftStack.isEmpty()) rightStack.push(leftStack.pop());
break;
case 'D':
if (!rightStack.empty()) leftStack.push(rightStack.pop());
break;
default: break;
}
}
while(!leftStack.empty()) {
rightStack.push(leftStack.pop());
}
while (!rightStack.empty()) {
bw.write(rightStack.pop());
}
bw.close();
br.close();
}
}