문제를 풀 때 간과해서는 안되는 것이 시간제한과 연산횟수이다.
이 문제의 주어진 조건을 살펴보면
- 최대 100개의 테스트케이스
- 최대 100000개의 수행 함수 : R이 100000개라면 배열 reverse 연산을 100000번 해야된다
- 배열의 최대 길이 100000
아무 생각없이 R이 나올 때마다 reverse 동작을 수행한다면 시간초과가 난다.
그래서 우리는 R이 나올 때 실제로 배열을 역순으로 바꾸는 것이 아니라 역순처럼 보이도록 해야한다.
즉, 배열의 시작점만 바꾸는 것이다.
이것만 인지하고 푼다면 문제는 맞출 수 있다.
하지만 수행시간에서 좋은 평가를 받지 못 한다. 내가 그랬다ㅜㅜ
if (c >= '0' && c <= '9') {
number = number*10 + (c-'0');
}
package Baekjoon;
import java.io.*;
import java.util.*;
public class BOJ5430 {
public static void main(String[] args) throws IOException {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(System.out));
StringTokenizer st;
int t = Integer.parseInt(br.readLine());
for(int i = 0; i < t; i++){
String p = br.readLine();
int len = p.length();
int n = Integer.parseInt(br.readLine());
boolean isError = false;
List<String> list = new ArrayList<>();
String arr = br.readLine();
st = new StringTokenizer(arr.substring(1, arr.length()-1), ",");
for(int j = 0; j < n; j++){
list.add(st.nextToken());
}
int point = 0;
for(int j = 0; j < len; j++){
char cur = p.charAt(j);
// 배열을 뒤집기 - 뒤집는 것과 같은 효과
if(cur == 'R'){
point = point == 0 ? list.size()-1 : 0;
}
// 배열 앞의 수 버리기
else{
// 배열 길이가 0일 경우 예외처리
if(list.size() == 0){
isError = true;
break;
}
list.remove(point);
point = Math.max(point-1, 0); // 0 이하로 갈 수 있다
}
}
if(point == list.size()-1) Collections.reverse(list);
String answer = String.join(",", list);
bw.write(isError ? "error" + "\n" : "[" + answer + "]\n");
}
bw.flush();
bw.close();
}
}