처음에 Deque를 알지 못해서 List로 입력값을 받아 진짜로 정렬을 했다.
당연히... 시간 초과로 통과하지 못하고 Deque를 이용해야 한다는 걸 검색해서 알았다.
Deque를 사용해도 정말 통과하기 쉽지 않았다.
특히 "error" 출력시 continue 하기 위해 for문에 roof 별칭 부여까지 해서 겨우 통과했다.
아마 메서드를 분리해서 풀었다면 이렇게까지 복잡하진 않았을 것 같아서 리팩터링이
필요해 보인다.
시간 초과 (정렬 사용)
import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.util.*;
public class Main {
public static void main(String[] args) throws Exception {
// 수행 시간 검사
long start = System.currentTimeMillis();
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
int t = Integer.parseInt(br.readLine());
StringBuilder sb = new StringBuilder();
//입력값 배열 저장
for (int i = 0; i < t; i++) {
ArrayList<Integer> list = new ArrayList<>();
String[] s = br.readLine().split("");
int size = Integer.parseInt(br.readLine());
StringTokenizer st = new StringTokenizer(br.readLine(), "[],");
// 입력값 리스트 저장
for (int j = 0; j < size; j++) {
list.add(Integer.parseInt(st.nextToken()));
}
// 검사
int cnt = 0;
for (String value : s) {
if (value.equals("R")) {
if (cnt == 0) {
list.sort(Collections.reverseOrder());
cnt++;
} else {
Collections.sort(list);
cnt = 0;
}
} else {
if (list.size() == 0) {
sb.append("error").append("\n");
} else {
list.remove(0);
}
}
}
// StringBuilder를 이용해서 출력문 만들기
if (!(list.size() == 0)) {
sb.append("[");
for (int p : list) {
sb.append(p).append(",");
}
sb.deleteCharAt(sb.lastIndexOf(","));
sb.append("]");
sb.append("\n");
}
}
System.out.println(sb);
System.out.println((System.currentTimeMillis() - start) / 1000.0);
}
}
최종 코드
import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.util.*;
public class Main {
public static void main(String[] args) throws Exception {
// 수행 시간 검사
// long start = System.currentTimeMillis();
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
int t = Integer.parseInt(br.readLine());
StringBuilder sb = new StringBuilder();
//입력값 배열 저장 ("error" 출력시 continue 하기위해 for문에 roof 별칭 부여)
roof : for (int i = 0; i < t; i++) {
Deque<Integer> deque = new LinkedList<>();
String[] s = br.readLine().split("");
int size = Integer.parseInt(br.readLine());
StringTokenizer st = new StringTokenizer(br.readLine(), "[],");
// 입력값 deque 저장
for (int j = 0; j < size; j++) {
deque.add(Integer.parseInt(st.nextToken()));
}
// 검사
boolean check = true;
for (int j = 0; j < s.length; j++) {
// deque의 접근 방향을 바꾼다
if (s[j].equals("R")) {
check = !check;
continue;
}
// "D"이면서 check가 true 일 때
if (check) {
if (deque.size() == 0) {
sb.append("error").append("\n");
continue roof;
} else {
deque.poll();
}
// check가 false 일 때
} else {
if (deque.size() == 0) {
sb.append("error").append("\n");
continue roof;
} else {
deque.pollLast();
}
}
}
// StringBuilder를 이용해서 출력문 만들기
sb.append("[");
if (deque.size() > 0) {
if (check) {
sb.append(deque.pollFirst());
while (!deque.isEmpty()) {
sb.append(",").append(deque.pollFirst());
}
} else {
sb.append(deque.pollLast());
while (!deque.isEmpty()) {
sb.append(",").append(deque.pollLast());
}
}
}
sb.append("]").append("\n");
}
System.out.println(sb);
// System.out.println((System.currentTimeMillis() - start) / 1000.0);
}
}
'코딩 테스트' 카테고리의 다른 글
(Java) 백준 11279 - 최대 힙 (0) | 2022.06.04 |
---|---|
(Java) 백준 2178 - 미로 탐색 (0) | 2022.06.03 |
(Java) 백준 11724 - 연결 요소의 개수 (0) | 2022.06.01 |
(Java) 백준 1003 - 피보나치 함수 (0) | 2022.05.31 |
(Java) 백준 2166 - 다각형의 면적 (0) | 2022.05.28 |