From c74248cdcf0c169a209906bc9a4b054b6a164746 Mon Sep 17 00:00:00 2001 From: JHLEE325 <82587652+JHLEE325@users.noreply.github.com> Date: Sun, 26 Oct 2025 20:53:53 +0900 Subject: [PATCH] =?UTF-8?q?[20251026]=20BOJ=20/=20G1=20/=20=EB=8B=A4?= =?UTF-8?q?=EB=A6=AC=20=EB=A7=8C=EB=93=A4=EA=B8=B0=202=20/=20=EC=9D=B4?= =?UTF-8?q?=EC=A4=80=ED=9D=AC?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...\353\247\214\353\223\244\352\270\260 2.md" | 142 ++++++++++++++++++ 1 file changed, 142 insertions(+) create mode 100644 "JHLEE325/202510/26 BOJ G1 \353\213\244\353\246\254 \353\247\214\353\223\244\352\270\260 2.md" diff --git "a/JHLEE325/202510/26 BOJ G1 \353\213\244\353\246\254 \353\247\214\353\223\244\352\270\260 2.md" "b/JHLEE325/202510/26 BOJ G1 \353\213\244\353\246\254 \353\247\214\353\223\244\352\270\260 2.md" new file mode 100644 index 00000000..f73a1131 --- /dev/null +++ "b/JHLEE325/202510/26 BOJ G1 \353\213\244\353\246\254 \353\247\214\353\223\244\352\270\260 2.md" @@ -0,0 +1,142 @@ +```java +import java.io.*; +import java.util.*; + +public class Main { + static int n, m; + static int[][] map; + static boolean[][] visited; + static int[] dx = {-1, 1, 0, 0}; + static int[] dy = {0, 0, -1, 1}; + static int islandnum = 0; + static List edges = new ArrayList<>(); + + static class Edge implements Comparable { + int from, to, dist; + Edge(int f, int t, int d) { + from = f; to = t; dist = d; + } + public int compareTo(Edge o) { + return this.dist - o.dist; + } + } + + static int[] parent; + + public static void main(String[] args) throws IOException { + BufferedReader br = new BufferedReader(new InputStreamReader(System.in)); + StringTokenizer st = new StringTokenizer(br.readLine()); + n = Integer.parseInt(st.nextToken()); + m = Integer.parseInt(st.nextToken()); + + map = new int[n][m]; + visited = new boolean[n][m]; + + for (int i = 0; i < n; i++) { + st = new StringTokenizer(br.readLine()); + for (int j = 0; j < m; j++) { + map[i][j] = Integer.parseInt(st.nextToken()); + } + } + + int id = 2; + for (int i = 0; i < n; i++) { + for (int j = 0; j < m; j++) { + if (map[i][j] == 1 && !visited[i][j]) { + findisland(i, j, id); + id++; + } + } + } + islandnum = id - 2; + + bridge(); + + parent = new int[islandnum + 2]; + for (int i = 0; i <= islandnum + 1; i++) parent[i] = i; + Collections.sort(edges); + + int used = 0; + int total = 0; + + for (Edge e : edges) { + if (union(e.from, e.to)) { + total += e.dist; + used++; + if (used == islandnum - 1) break; + } + } + + if (used == islandnum - 1) + System.out.println(total); + else + System.out.println(-1); + } + + static void findisland(int x, int y, int id) { + Queue q = new LinkedList<>(); + q.add(new int[]{x, y}); + visited[x][y] = true; + map[x][y] = id; + + while (!q.isEmpty()) { + int[] now = q.poll(); + for (int d = 0; d < 4; d++) { + int nx = now[0] + dx[d]; + int ny = now[1] + dy[d]; + if (nx < 0 || ny < 0 || nx >= n || ny >= m) continue; + if (map[nx][ny] == 1 && !visited[nx][ny]) { + visited[nx][ny] = true; + map[nx][ny] = id; + q.add(new int[]{nx, ny}); + } + } + } + } + + static void bridge() { + for (int i = 0; i < n; i++) { + for (int j = 0; j < m; j++) { + if (map[i][j] >= 2) { + int from = map[i][j]; + for (int d = 0; d < 4; d++) { + int nx = i; + int ny = j; + int dist = 0; + + while (true) { + nx += dx[d]; + ny += dy[d]; + if (nx < 0 || ny < 0 || nx >= n || ny >= m) break; + if (map[nx][ny] == from) break; + if (map[nx][ny] == 0) { + dist++; + continue; + } + if (map[nx][ny] >= 2) { + if (dist >= 2) { + edges.add(new Edge(from, map[nx][ny], dist)); + } + break; + } + } + } + } + } + } + } + + static int find(int x) { + if (x == parent[x]) return x; + return parent[x] = find(parent[x]); + } + + static boolean union(int a, int b) { + a = find(a); + b = find(b); + if (a == b) return false; + parent[b] = a; + return true; + } +} +```