풀이)
스택은 모든 연산이 O(1)의 시간 복잡도를 가지기 때문에 시간 초과에 걸리지 않는다.
맨 처음 커서는 입력 문자열의 맨 뒤에 위치하기 때문에 문자열을 모두 왼쪽 스택에 넣어준다.
이후 차례로 명령어를 처리하면서 커서가 왼쪽으로 이동하면 왼쪽 스택의 가장 상단 요소를 오른쪽 스택에 pop() 시켜준다.
내 코드)
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 Main2 {
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();
}
}