1406번: 에디터
첫째 줄에는 초기에 편집기에 입력되어 있는 문자열이 주어진다. 이 문자열은 길이가 N이고, 영어 소문자로만 이루어져 있으며, 길이는 100,000을 넘지 않는다. 둘째 줄에는 입력할 명령어의 개수
www.acmicpc.net
배열 하나를 이용했더니 시간 초과가 떴다.
스택 두 개를 이용하여 커서의 위치를 기준으로 두 스택으로 나뉘어 데이터를 이동시켰다.
위 그림과 같이 L(커서를 왼쪽으로 이동)일 경우에는 왼쪽 스택에서 pop하여 오른쪽 스택에 push 해줬다.
마찬가지로 D(커서를 오른쪽으로 이동)일 경우에는 오른쪽 스택에서 pop하여 왼쪽 스택에 push 해줬다.
B(커서 왼쪽 문자 제거)일 경우에는 왼쪽 스택에서 pop 해주었다.
P 5(커서 왼쪽에 문자 추가)일 경우에는 왼쪽 스택에 push 해주었다.
import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.OutputStreamWriter;
import java.util.Stack;
public class Main {
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> stack1 = new Stack<>();
Stack<Character> stack2 = new Stack<>();
String str = br.readLine();
for (int i = 0; i < str.length(); i++) {
stack1.add(str.charAt(i));
}
int T = Integer.parseInt(br.readLine());
for (int i = 0; i < T; i++) {
String input = br.readLine();
switch (input.charAt(0)) {
case 'L':
if (stack1.size() != 0) {
stack2.push(stack1.pop());
}
break;
case 'D':
if (stack2.size() != 0) {
stack1.push(stack2.pop());
}
break;
case 'B':
if (stack1.size() != 0) {
stack1.pop();
}
break;
case 'P':
stack1.push(input.charAt(2));
break;
}
}
for (int i = 0; i < stack1.size(); i++) {
bw.write(stack1.get(i));
}
for (int i = stack2.size() - 1; i >= 0; i--) {
bw.write(stack2.get(i));
}
bw.flush();
bw.close();
}
}