첫째 줄에 테스트 케이스의 개수 T가 주어진다. T는 최대 100이다.
각 테스트 케이스의 첫째 줄에는 수행할 함수 p가 주어진다. p의 길이는 1보다 크거나 같고, 100,000보다 작거나 같다.
다음 줄에는 배열에 들어있는 수의 개수 n이 주어진다. (0 ≤ n ≤ 100,000)
다음 줄에는 [x1,...,xn]과 같은 형태로 배열에 들어있는 정수가 주어진다. (1 ≤ xi ≤ 100)
전체 테스트 케이스에 주어지는 p의 길이의 합과 n의 합은 70만을 넘지 않는다.
각 테스트 케이스에 대해서, 입력으로 주어진 정수 배열에 함수를 수행한 결과를 출력한다.
만약, 에러가 발생한 경우에는 error를 출력한다.
이건 틀린다면 시간초과로 틀릴게 뻔한 문제
말그대로 배열을 뒤집을라고 했으면 무조건 시간초과 났을 것 같다.
뒤집는 방법 대신 앞뒤로 모두 접근이 가능한 deque
를 이용
isForward
를 이용해서 정방향인지 역방향인지를 확인
그리고 주의해야하는건 배열이 비어있을 때 D
를 실행하려고하면 에러를 출력해야한다는 점이다.
그렇기때문에 매번 비어있는 상태인지 확인해야한다.
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.ArrayDeque;
public class Main {
static StringBuilder sb = new StringBuilder();
static boolean error, isForward;
static ArrayDeque<Integer> deque;
public static void main(String[] args) throws IOException {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
int t = Integer.parseInt(br.readLine());
while (t-- > 0) {
String cmd = br.readLine();
int num = Integer.parseInt(br.readLine());
deque = new ArrayDeque<>();
error = false;
isForward = true;
String input = br.readLine();
String[] inputString = input.substring(1, input.length() - 1).split(",");
for (int i = 0; i < num; i++) {
deque.add(Integer.parseInt(inputString[i]));
}
AC(cmd);
}
System.out.println(sb);
}
static void AC(String cmd) {
for (char c : cmd.toCharArray()) {
switch (c) {
case 'R':
isForward = !isForward;
break;
case 'D':
if (!deque.isEmpty()) {
if (isForward) {
deque.pollFirst();
} else {
deque.pollLast();
}
break;
} else {
error = true;
break;
}
default:
break;
}
if (error) break;
}
if (error) {
sb.append("error").append("\n");
} else {
sb.append("[");
if (isForward) {
while (!deque.isEmpty()) {
sb.append(deque.pollFirst());
if (deque.isEmpty())
break;
sb.append(',');
}
} else {
while (!deque.isEmpty()) {
sb.append(deque.pollLast());
if (deque.isEmpty())
break;
sb.append(',');
}
}
sb.append("]").append("\n");
}
}
}
이전에 파이썬으로 시도했을 때는..
결국 못풀었었다..