sm 기술 블로그
163. 5430(AC) - 자바 본문
import java.util.*;
import java.io.*;
class Main {
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());
for (int i = 0; i < T; i++) {
String[] p = br.readLine().split("");
int n = Integer.parseInt(br.readLine());
String x = br.readLine();
x = x.replace("[", "");
x = x.replace("]", "");
x = x.replace(",", " ");
String[] tmp = x.split(" ");
// reverse함수를 위해 deque대신 likedList 사용함
LinkedList<String> queue = new LinkedList<>();
int R_cnt = 0;
boolean error = false;
for (int j = 0; j < n; j++) {
queue.add(tmp[j]);
}
for (String val : p) {
if (val.equals("R")) {
R_cnt++;
continue;
}
if (val.equals("D") && queue.size() == 0) {
error = true;
break;
} else {
if (R_cnt % 2 == 0)
queue.pollFirst();
else
queue.pollLast();
}
}
if (error) {
sb.append("error").append("\n");
} else {
if (R_cnt % 2 == 1) {
Collections.reverse(queue);
}
sb.append("[").append(String.join(",", queue)).append("]").append("\n");
}
}
System.out.print(sb);
}
}
문제요약
R은 뒤집기 D는 앞의 자리수 제거 를 진행해라. 만약 D를 했을 때 큐 내에 값이 없다면 "error"를 출력해라.
설명
문제는 크게 어렵지 않으나 트릭이 숨어 있다.
1. 정직하게 R일때 바로바로 뒤집으면 시간 초과가 발생한다.
2. x가 비어있을 때 []를 출력해야한다.
이 두가지를 지키면 크게 어렵지 않다.
String[] p = br.readLine().split("");
int n = Integer.parseInt(br.readLine());
String x = br.readLine();
x = x.replace("[", "");
x = x.replace("]", "");
x = x.replace(",", " ");
String[] tmp = x.split(" ");
// reverse함수를 위해 deque대신 likedList 사용함
LinkedList<String> queue = new LinkedList<>();
int R_cnt = 0;
boolean error = false;
for (int j = 0; j < n; j++) {
queue.add(tmp[j]);
}
입력값들을 처리해 주었다.
링크드리스트를 사용하는 이유는 reverse함수를 사용하기 위해서 이다.
x는 [1,3,4]와 같은 형식으로 들어오기때문에 사전 작업이 필요하다.
if (val.equals("R")) {
R_cnt++;
continue;
}
R인 경우 바로바로 뒤집지 않고 먼저 카운터를 증가시킨다.
나중에 한번에 처리할 것이다.
if (val.equals("D") && queue.size() == 0) {
error = true;
break;
}
D이고 큐 내에 값이 없다면 에러대상이다.
else {
if (R_cnt % 2 == 0)
queue.pollFirst();
else
queue.pollLast();
}
에러 대상이 아니라면 D를 수행할 수 있다는것 따라서 D를 수행하는데 수행하기 앞서 먼저 조건문으로 처리를 해보자.
만약, R_cnt 를 2로 나눈 나머지가 0이라면 뒤집지 않았다는 것이므로 맨 처음 값을 바로 빼준다.
2로 나누어 지지 않으면 뒤집어야 한다는 소리이므로 뒤집어 지면 맨뒤가 처음으로 빠지므로 맨 뒤에 있는 값을 빼준다.
if (error) {
sb.append("error").append("\n");
} else {
if (R_cnt % 2 == 1) {
Collections.reverse(queue);
}
sb.append("[").append(String.join(",", queue)).append("]").append("\n");
}
우리는 값이 없다면, []를 출력해야 하기 때문에 에러를 먼저 조건문으로 처리해준다.
에러가 아니라면 값을 처리해주는데,
여기서 뒤집기를 진행한다.
'문제 > 백준_자바' 카테고리의 다른 글
165. 1992(쿼드트리) - 자바 (0) | 2022.07.30 |
---|---|
164. 2630 (색종이 만들기) - 자바 (0) | 2022.07.30 |
162. 1021(회전하는 큐) - 자바 (0) | 2022.07.27 |
161. 10866(덱) - 자바 (0) | 2022.07.27 |
160. 1966(프린트 큐) - 자바 (0) | 2022.07.26 |
Comments