From cc26d3b37983db5c9a96f072b0456a02b4df5731 Mon Sep 17 00:00:00 2001 From: Donew Date: Mon, 3 Feb 2025 20:51:43 +0900 Subject: [PATCH] =?UTF-8?q?[20250203]=20BOJ=20/=20=EA=B3=A8=EB=93=9C5=20/?= =?UTF-8?q?=20=EB=AA=A8=EB=85=B8=ED=86=A4=EA=B8=B8=20/=20=EC=8B=A0?= =?UTF-8?q?=EB=8F=99=EC=9C=A4?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...50\353\205\270\355\206\244\352\270\270.md" | 84 +++++++++++++++++++ 1 file changed, 84 insertions(+) create mode 100644 "03do-new30/202502/03 BOJ G5 \353\252\250\353\205\270\355\206\244\352\270\270.md" diff --git "a/03do-new30/202502/03 BOJ G5 \353\252\250\353\205\270\355\206\244\352\270\270.md" "b/03do-new30/202502/03 BOJ G5 \353\252\250\353\205\270\355\206\244\352\270\270.md" new file mode 100644 index 00000000..6e8e2b5a --- /dev/null +++ "b/03do-new30/202502/03 BOJ G5 \353\252\250\353\205\270\355\206\244\352\270\270.md" @@ -0,0 +1,84 @@ +```java +import java.util.*; +import java.io.*; + +public class Main { + + public static void main(String[] args) throws IOException { + BufferedReader br = new BufferedReader(new InputStreamReader(System.in)); + BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(System.out)); + + int T = Integer.parseInt(br.readLine()); + for (int tc = 1; tc <= T; tc++) { + int n = Integer.parseInt(br.readLine()); + + // TreeMap: 자동정렬(오름차순)을 보장하며, 키 기반 탐색 성능 logN + Map> map = new TreeMap<>(); + map.put(-1, new ArrayList<>(Arrays.asList(0))); + StringTokenizer st; + for (int i = 0; i < n; i++) { + st = new StringTokenizer(br.readLine()); + int x = Integer.parseInt(st.nextToken()); + int y = Integer.parseInt(st.nextToken()); + + if (map.containsKey(x)) { + map.get(x).add(y); + } else { + List val = new ArrayList<>(); + val.add(y); + map.put(x, val); + } + } + + int[] keys = map.keySet().stream().mapToInt(x -> x).toArray(); + for (int i = 0; i < keys.length; i++) { + int key = keys[i]; + + if (key == -1) continue; + + if (map.get(key).size() == 1) { + continue; + } + + // 이전 x좌표의 마지막 y좌표와 비교해서 + // 같은 x좌표를 가진 좌표들 중 가장 먼저 도달하는 y좌표를 구한다. + int prevKey = keys[i-1]; + int lastIndex = map.get(prevKey).size() - 1; + int firstY = map.get(prevKey).get(lastIndex); + + // 현재 x좌표의 y좌표들 중 가장 값이 큰 y좌표를 찾는다 + int maxY = Collections.max(map.get(key)); + + // firstY가 maxY라면 내림차순 정렬 + // firstY가 maxY가 아니라면 오름차순 정렬 + if (firstY == maxY) { + Collections.sort(map.get(key), Collections.reverseOrder()); + } + else { + Collections.sort(map.get(key)); + } + } + List points = new ArrayList<>(n); + for (int x : keys) { + List values = map.get(x); + for (int y : values) { + points.add(x + " " + y); + } + } + + int[] tmp = Arrays.stream(br.readLine().split(" ")) + .mapToInt(x -> Integer.parseInt(x)) + .toArray(); + int total = tmp[0]; + for (int i = 1; i <= total; i++) { + bw.write(points.get(tmp[i]) + "\n"); + } + } + + br.close(); + bw.flush(); + bw.close(); + } +} +``` +- `TreeMap` 사용 \ No newline at end of file