알고리즘/백준
5430번 - AC
fleur75
2023. 6. 17. 14:53
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.StringTokenizer;
public class Main {
public static void main(String[] args) throws IOException {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
int T = Integer.parseInt(br.readLine());
String command;
int N;
int[] list;
String str;
StringBuilder sb = new StringBuilder();
StringTokenizer st;
for(int i=0;i<T;i++) {
command = br.readLine();
N = Integer.parseInt(br.readLine());
str = br.readLine();
st = new StringTokenizer(str.substring(1, str.length()-1), ",");
list = new int[N];
boolean reversed = false;
boolean isError = false;
for(int j=0;j<N;j++) {
list[j] = Integer.parseInt(st.nextToken());
}
int front = 0;
int back = N-1;
for(int j=0;j<command.length();j++) {
if(command.charAt(j) == 'R') {
reversed = !reversed;
} else {
if(reversed) {
back--;
} else {
front++;
}
if(front > back + 1) {
isError = true;
break;
}
}
}
if(isError) {
sb.append("error\n");
} else {
if(reversed) {
sb.append("[");
for(int j=back;j>front;j--) {
sb.append(list[j]+",");
}
if(front != back + 1) {
sb.append(list[front]);
}
sb.append("]");
sb.append("\n");
}
else {
sb.append("[");
for(int j=front;j<back;j++) {
sb.append(list[j]+",");
}
if(back != front - 1) {
sb.append(list[back]);
}
sb.append("]");
sb.append("\n");
}
}
}
System.out.print(sb);
br.close();
}
}
구현 문제입니다. 주의할 점은 R을 수행한다고 실제로 배열을 뒤집으면 시간이 너무 많이 소모된다는 것입니다.
대신하여 R이 나타나면 현재가 정방향인지 역방향인지만 boolean 변수를 이용해 저장한 이후 D가 나타나면 정방향일 경우 앞에서, 역방향일 경우 뒤에서 하나의 원소를 지우면 됩니다.
덱을 이용하면 간단하다는 점을 나중에 알았는데 위에서는 원소를 따로 삭제하지 않고 인덱스만 계산하는 방법을 사용했습니다. 정방향일 때는 front에 1이 더해지고 역방향일 때는 back이 1 감소합니다.
그리고 front가 back을 넘어간 경우는 원소가 0개인 상태이고(같으면 하나입니다.) 차이가 2이상이면 에러가 됩니다. 이 때는 error 여부를 저장하는 boolean값을 설정하고 루프문을 탈출합니다.