문제 링크
커서라는 단어가 나오는데 커서는 위에 문제에서 설명하듯 글 작성 시, 현재 입력값이 들어갈 위치에 깜빡이는 곳을 말한다.
이 문제에서는 커서 기준으로 왼쪽에 있는 값을 stack-L에 담고
커서 기준 오른쪽에 있는 값을 stack-R에 담아준다.
즉, 2개의 stack을 사용하여 문제를 해결하였다.
처음 커서는 입력 문자열의 맨 뒤에 위치하기 때문에 문자들을 모두 왼쪽 스택에 넣어준다.
이후 차례로 명령어를 처리하면서 커서가 왼쪽으로 이동 시 왼쪽 스택의 가장 상단 요소를 오른쪽 스택에 pop() 시켜 이동해준다.
그리고 커서가 오른쪽으로 이동하면 위 로직을 반대로 해주면 된다.
마지막으로 모든 명령어를 처리한 후에는 스택이 LIFO 구조이기 때문에 왼쪽의 모든 요소들을 pop() 및 reverse() 해준 뒤 오른쪽 스택의 모든 요소와 합쳐주면 된다.
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));
// 커서 기준 L,R
Stack<Character> stackL = new Stack<>();
Stack<Character> stackR = new Stack<>();
String str = br.readLine();
/* 처음 입력값 stack-L에 담기 */
for(char ch : str.toCharArray()){
stackL.push(ch);
}
int N = Integer.parseInt(br.readLine());
while(N-- > 0){
StringTokenizer st = new StringTokenizer(br.readLine()," ");
String command = st.nextToken();
if(command.equals("L")){
if(stackL.empty()) continue;
char ch = stackL.pop();
stackR.push(ch);
}
else if(command.equals("D")){
if(stackR.empty()) continue;
char ch = stackR.pop();
stackL.push(ch);
}
else if(!stackL.empty() && command.equals("B")){
stackL.pop();
}
else if(command.equals("P")){
char ch = st.nextToken().charAt(0);
stackL.push(ch);
}
}
StringBuilder sb = new StringBuilder();
while(!stackL.empty()){
char ch = stackL.pop();
sb.append(ch);
}
sb.reverse();
while(!stackR.empty()){
char ch = stackR.pop();
sb.append(ch);
}
System.out.println(sb);
br.close();
}
}