Skip to content

Commit cc26d3b

Browse files
committed
[20250203] BOJ / 골드5 / 모노톤길 / 신동윤
1 parent ceeb5aa commit cc26d3b

File tree

1 file changed

+84
-0
lines changed

1 file changed

+84
-0
lines changed
Lines changed: 84 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,84 @@
1+
```java
2+
import java.util.*;
3+
import java.io.*;
4+
5+
public class Main {
6+
7+
public static void main(String[] args) throws IOException {
8+
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
9+
BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(System.out));
10+
11+
int T = Integer.parseInt(br.readLine());
12+
for (int tc = 1; tc <= T; tc++) {
13+
int n = Integer.parseInt(br.readLine());
14+
15+
// TreeMap: 자동정렬(오름차순)을 보장하며, 키 기반 탐색 성능 logN
16+
Map<Integer, List<Integer>> map = new TreeMap<>();
17+
map.put(-1, new ArrayList<>(Arrays.asList(0)));
18+
StringTokenizer st;
19+
for (int i = 0; i < n; i++) {
20+
st = new StringTokenizer(br.readLine());
21+
int x = Integer.parseInt(st.nextToken());
22+
int y = Integer.parseInt(st.nextToken());
23+
24+
if (map.containsKey(x)) {
25+
map.get(x).add(y);
26+
} else {
27+
List<Integer> val = new ArrayList<>();
28+
val.add(y);
29+
map.put(x, val);
30+
}
31+
}
32+
33+
int[] keys = map.keySet().stream().mapToInt(x -> x).toArray();
34+
for (int i = 0; i < keys.length; i++) {
35+
int key = keys[i];
36+
37+
if (key == -1) continue;
38+
39+
if (map.get(key).size() == 1) {
40+
continue;
41+
}
42+
43+
// 이전 x좌표의 마지막 y좌표와 비교해서
44+
// 같은 x좌표를 가진 좌표들 중 가장 먼저 도달하는 y좌표를 구한다.
45+
int prevKey = keys[i-1];
46+
int lastIndex = map.get(prevKey).size() - 1;
47+
int firstY = map.get(prevKey).get(lastIndex);
48+
49+
// 현재 x좌표의 y좌표들 중 가장 값이 큰 y좌표를 찾는다
50+
int maxY = Collections.max(map.get(key));
51+
52+
// firstY가 maxY라면 내림차순 정렬
53+
// firstY가 maxY가 아니라면 오름차순 정렬
54+
if (firstY == maxY) {
55+
Collections.sort(map.get(key), Collections.reverseOrder());
56+
}
57+
else {
58+
Collections.sort(map.get(key));
59+
}
60+
}
61+
List<String> points = new ArrayList<>(n);
62+
for (int x : keys) {
63+
List<Integer> values = map.get(x);
64+
for (int y : values) {
65+
points.add(x + " " + y);
66+
}
67+
}
68+
69+
int[] tmp = Arrays.stream(br.readLine().split(" "))
70+
.mapToInt(x -> Integer.parseInt(x))
71+
.toArray();
72+
int total = tmp[0];
73+
for (int i = 1; i <= total; i++) {
74+
bw.write(points.get(tmp[i]) + "\n");
75+
}
76+
}
77+
78+
br.close();
79+
bw.flush();
80+
bw.close();
81+
}
82+
}
83+
```
84+
- `TreeMap` 사용

0 commit comments

Comments
 (0)