

-Code
import java.io.*;
import java.util.*;
public class BOJ1406 {
public static void main(String[] args) throws Exception {
BufferedReader br =
new BufferedReader(new InputStreamReader(System.in));
String words = br.readLine();
int n = Integer.parseInt(br.readLine());
// 커서 위치를 left와 right 덱의 가운대로 잡음
Deque<Character> left = new ArrayDeque<>();
Deque<Character> right = new ArrayDeque<>();
// 처음 커서가 left의 맨 뒤이기 때문에 저장
for (char word : words.toCharArray()) {
left.addLast(word);
}
// 입력 받기
for (int i = 0; i < n; i++) {
StringTokenizer st = new StringTokenizer(br.readLine());
char comm = st.nextToken().charAt(0);
if (comm == 'P') {
char w = st.nextToken().charAt(0);
left.addLast(w);
} else if (comm == 'L' && !left.isEmpty()) {
// 커서가 왼쪽으로 이동이므로 비어있지 않으면
// 왼쪽 덱의 맨 뒷값을 오른쪽 덱의 맨앞으로 넣기
right.addFirst(left.pollLast());
} else if (comm == 'D' && !right.isEmpty()) {
// 커서가 오른쪽으로 이동이므로 비어있지 않으면
// 왼쪽 오른쪽의 맨 앞값을 왼쪽 덱의 맨뒤로 넣기
left.addLast(right.pollFirst());
} else if (comm == 'B' && !left.isEmpty()) {
// 비어있지 않으면 커서의 왼쪽값을 삭제
left.pollLast();
}
}
StringBuilder answer = new StringBuilder();
// 왼쪽 덱 앞부터 값을 뽑아서 출력
while (!left.isEmpty()) answer.append(left.pollFirst());
// 오른쪽 덱 앞부터 값을 뽑아서 출력
while (!right.isEmpty()) answer.append(right.pollFirst());
System.out.println(answer);
}
}
이전에는 idx를 따로 두고 이동하면서 List의 add(idx, val)을 사용하려 했으나 시간이 너무 많이 걸리고 값 삽입이 이상하게 되어서 좀 찾아보니 stack같은 자료구조를 2개 두고 하면 속도나 여러 면에서 편하다는 것을 알게 되고 덱을 통해서 해결했습니다.
'Beakjoon&프로그래머스 > Java' 카테고리의 다른 글
| [백준/Java] 9184번 신나는 함수 실행 (0) | 2025.12.29 |
|---|---|
| [백준/Java] 14889번 스타트와 링크 (0) | 2025.12.29 |
| [백준/Java] 15649번 N과 M (1) (0) | 2025.12.29 |
| [백준/Java] 10828번 스택 (0) | 2025.12.29 |
| [백준/Java] 34980번 생수병 놓기 (0) | 2025.12.29 |