[백준] AC 5430번
나의 풀이
public class AC {
public static void main(String[] args) throws IOException {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
StringBuilder sb = new StringBuilder();
int T = Integer.parseInt(br.readLine());
while(T-- != 0) {
String function = br.readLine();
int N = Integer.parseInt(br.readLine());
String[] items = br.readLine().replaceAll("[\\[\\]]", "").split(",");
LinkedList<Integer> nums = new LinkedList<>();
for(String item : items) {
if(!item.equals("")) {
nums.add(Integer.parseInt(item));
}
}
boolean isError = false;
int rev = 0;
for(int j = 0; j < function.length(); j++) {
char p = function.charAt(j);
if(p == 'R') {
rev++;
continue;
} else if(p == 'D' && !nums.isEmpty()) {
if(rev % 2 == 0) {
nums.pollFirst();
} else {
nums.pollLast();
}
} else {
sb.append("error").append("\n");
isError = true;
break;
}
}
if(isError) {
continue;
} else {
if(!nums.isEmpty()) {
if(rev % 2 == 1) {
Collections.reverse(nums);
}
sb.append("[").append(nums.pollFirst());
while(!nums.isEmpty()) {
sb.append(',').append(nums.pollFirst());
}
sb.append(']').append('\n');
} else {
sb.append("[]").append('\n');
}
}
}
System.out.println(sb);
}
}
- T번을 반복한다.
- 함수와 수의 개수, 정수를 받아준다.
- 정수는 [10,20] 이런 식으로 입력된다. 때문에 replaceAll 에 괄호를 찾아내는 정규식을 대입하여 "" 로 바꿔주면 -> 10,20. 이 형태에서 다시 ',' 를 기준으로 잘라주었다. ->String[] == [10, 20]
- 그리고 해당 숫자는 현재 String 형태이기 때문에, 숫자로 바꿔서 링크드 리스트에 넣어준다. 단, 빈 값이 들어올 수 있기 때문에 빈 문자열을 체크해준다.
- 이제 함수를 체크하면서 함수가 R 인 경우에는 뒤집기를, D 인 경우에는 하나씩 잘라줘야 한다.
- 단, R일 때마다 계속 뒤집으면 오래 걸릴 수 있으니, rev 변수를 두어서 R 이 몇 번 입력됬는지 체크한다.
- 만약 함수가 D이면서 nums 리스트가 비어있지 않다면, rev 변수를 사용하여 R 이 짝수인지 홀수인지 체크한다. 홀수면 뒤집기를 해줘야 하는데, 이는 뒤집고 앞에서부터 제거하는 것과 뒤에서부터 제거하는 것의 제거대상이 같기 때문에 그냥 뒤에서부터 제거하도록 한다. 짝수면 그냥 앞에서부터 제거한다.
- 만약 함수가 D인데 nums 리스트가 비어있다면 더 이상 뺄 수 없으므로 error 를 StringBuilder 에 넣어주고 isError 를 true 로 바꿔주고 반복문을 탈출한다.
- 만약 isError 가 true 라면 continue 를 통해서 다음 연산을 진행하고, 아니라면 nums 리스트가 비어있는지 확인한다. 비어있다면 빈 괄호 [] 를 StringBuilder 에 넣어주고, 아니라면 rev 의 짝, 홀수 여부를 확인하여 홀수면 nums 를 뒤집어준다. 그리고 출력 양식에 맞게 괄호와 컴마를 추가해주면 된다.