풀이)
스택은 모든 연산이 O(1)의 시간 복잡도를 가지기 때문에 시간 초과에 걸리지 않는다.
입력 문자열의 맨 뒤에 위치하기 때문에 문자열을 모두 왼쪽 스택에 넣어준다.
이후 차례로 명령어를 처리하면서 커서가 왼쪽으로 이동하면 왼쪽 스택의 가장 상단 요소를 오른쪽 스택에 pop() 시켜준다.
그리고 커서가 오른쪽으로 이동하면 오른쪽 스택의 가장 상단 요소를 왼쪽 스택에 pop() 시켜주며 마치 커서가 이동하는 것처럼 구현한다.
내 코드)
import java.io.*;
import java.util.*;
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));
String str = br.readLine();
int M = Integer.parseInt(br.readLine());
Stack<String> leftSt = new Stack<String>();
Stack<String> rightSt = new Stack<String>();
//처음 커서는 문장의 맨 뒤에서 시작하기 때문에 왼쪽 스택에 초기 문자를 모두 넣어줌 (ex. abc|)
String[] arr = str.split("");
for(String s : arr) { //Enhanced For Loop 사용
leftSt.push(s);
}
for(int i = 0; i < M; i++) {
String command = br.readLine();
char c = command.charAt(0);
//StringTokenizer st = new StringTokenizer(reader.readLine());
//String c = st.nextToken();
switch(c) {
case 'L':
if(!leftSt.isEmpty())
rightSt.push(leftSt.pop());
break;
case 'D':
if(!rightSt.isEmpty())
leftSt.push(rightSt.pop());
break;
case 'B':
if(!leftSt.isEmpty()) {
leftSt.pop();
}
break;
case 'P':
char t = command.charAt(2);
leftSt.push(String.valueOf(t));
//leftSt.push(st.nextToken());
break;
default:
break;
}
}
//Stack은 LIFO 구조이기 때문에
//왼쪽 스택에 있는 데이터들을 모두 오른쪽으로 옮긴 뒤에 오른쪽에 있는 모든 내용을 출력한다.
while(!leftSt.isEmpty())
rightSt.push(leftSt.pop());
while(!rightSt.isEmpty())
bw.write(rightSt.pop());
bw.flush();
bw.close();
}
}