Deque 덱 사용
Deque : 양방향 입출력이 가능한 큐
D
: 배열의 앞 요소 삭제 ➡️ isReverse
에 따라 pollFirst
/ pollLast
R
: 배열을 뒤집음 ➡️ 뒤집지 않고 isReverse
변수에 뒤집힌 배열인지 아닌지 여부를 저장해줌만약 배열이 뒤집힌 상태 (isReverse = true) 이면 배열을 뒤집어서 출력해야 하는데 잘못 생각해서 오래걸렸다.
예시로 크기가 2인 배열을 뒤집어서 출력한다고 했을때,
[1,2] -> [2,1] 로 출력해야 하는 걸 생각하고 덱을 그대로 쓰고싶어서 '아! 뒤에 있는 요소를 앞으로 넣으면 되겠다' 하고 잘못 접근...
[1,2,3] 의 경우 위와 같이 풀면 [3,1,2] 처럼 돼서 절대 답이 될 수 없다!
이 생각을 안하고 풀어서 결국 하나하나 다시 접근하도록 했다!
(스터디에서 해결사를 담당하고 계시는 스터디원분이 해결해주셨다 ㅠㅠ 감사합니다)
암튼 해결!
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.ArrayDeque;
import java.util.Deque;
import java.util.StringTokenizer;
public class AC {
public static void main(String[] args) throws IOException {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
int num = Integer.parseInt(br.readLine());
String[] result = new String[num];
for (int i = 0; i < num; i++) {
String[] command = br.readLine().split("");
int len = Integer.parseInt(br.readLine());
Deque<Integer> deque = new ArrayDeque<>();
StringTokenizer st = new StringTokenizer(br.readLine(), "[,]");
for (int a = 0; a < len; a++) deque.add(Integer.parseInt(st.nextToken()));
result[i] = ac(deque, command);
}
for (String r : result) System.out.println(r);
}
private static String ac(Deque<Integer> deque, String[] command) {
boolean isReverse = false;
for (String c : command) {
if (c.equals("D")) {
if (deque.isEmpty()) {
return "error";
}
if (!isReverse) deque.pollFirst();
else deque.pollLast();
}
else if (c.equals("R")) {
isReverse = !isReverse;
}
}
if (isReverse) {
Deque<Integer> newDeque = new ArrayDeque<>();
int size = deque.size();
for (int i = 0; i < size; i++) {
newDeque.addLast(deque.pollLast());
}
deque = newDeque;
}
return deque.toString().replaceAll(" ", "");
}
}