문제 - AC
처음에는 [2,1,3,4,5]의 배열을 정수만 추출하여 ArrayList로 넣었다. 그러면서 R인 경우에는 직접 Collections.reverse를 해주면서 뒤집고 D인 경우에는 첫번째 인덱스를 제거하는 식으로 코드를 짰다. 하지만 결과를 보니 16퍼정도에서 시간초과가 나는 걸 확인하고 시간을 줄이는 방법을 좀더 고민을 했다.
String sr[] = arr.substring(1, arr.length() - 1).split(",");
다른 해설지를 보니 StringTokenier와 정규표현식을 이용한 것을 확인했는데 이는 다음번에 생각이 잘안날 수 도 있으니 편한 걸로 사용할 것이다.
import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.util.*;
import java.util.stream.Collectors;
public class Main {
public static void main(String[] args) throws Exception {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
StringTokenizer st = new StringTokenizer(br.readLine());
int T = Integer.parseInt(st.nextToken());
for(int t=0;t<T;t++) {
String s = br.readLine();
int n = Integer.parseInt(br.readLine());
String arr = br.readLine();
Deque<String> deque = new ArrayDeque<>();
if (n > 0) {
String sr[] = arr.substring(1, arr.length() - 1).split(",");
for (String ss : sr)
deque.add(ss);
}
//물리적으로 뒤집지 않고 논리적으로만 뒤집기
boolean reverse = false;
boolean error = false;
StringBuilder sb = new StringBuilder();
//R : 뒤집기 D : 버리기
for (int i = 0; i < s.length(); i++) {
char c = s.charAt(i);
if (c == 'R') {
reverse = !reverse;
} else {
if (deque.isEmpty()) {
//배열이 비어있는 경우 에러
error = true;
break;
}
if (reverse) {
deque.removeLast();
} else {
deque.removeFirst();
}
}
}
if (error) {
System.out.println("error");
} else {
sb.append("[");
while (!deque.isEmpty()) {
if (reverse) {
sb.append(deque.removeLast());
} else {
sb.append(deque.removeFirst());
}
if (!deque.isEmpty())
sb.append(",");
}
sb.append("]");
System.out.println(sb.toString());
}
}
}
}