다리만들기
백준 2146: 다리만들기
풀이
BFS 이용
소스코드
import java.util.LinkedList;
import java.util.Queue;
import java.util.Scanner;
public class Main {
static class Node {
int r, c;
Node(int r, int c) {
this.r = r;
this.c = c;
}
}
static int[] dr = { -1, 1, 0, 0 };
static int[] dc = { 0, 0, -1, 1 };
static int N;
static int[][] map; //입력받는 값의 배열
static int[][] group; //섬을 그룹별로 나눈 배열
static int[][] dist; //거리를 측정할 배열
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
N = sc.nextInt();
map = new int[N][N];
group = new int[N][N];
dist = new int[N][N];
Queue<Node> queue = new LinkedList<>();
for (int i = 0; i < N; i++) {
for (int j = 0; j < N; j++) {
map[i][j] = sc.nextInt();
}
}
// 섬 구분 짓기(하나의 섬마다 같은 숫자 입력)
int num = 0;
for (int i = 0; i < N; i++) {
for (int j = 0; j < N; j++) {
if (map[i][j] == 1 && group[i][j]==0) {
queue = new LinkedList<>();
group[i][j] = ++num;
queue.add(new Node(i, j));
while (!queue.isEmpty()) {
Node node = queue.poll();
for (int d = 0; d < 4; d++) {
int nr = node.r + dr[d];
int nc = node.c + dc[d];
if (nr >= 0 && nc >= 0 && nr < N && nc < N) {
if (map[nr][nc] == 1 && group[nr][nc]==0) {
queue.add(new Node(nr, nc));
group[nr][nc] = num;
}
}
}
}
}
}
}
//바다는 -1, 육지는 0으로 구분
for (int i = 0; i < N; i++) {
for (int j = 0; j < N; j++) {
dist[i][j] = -1;
if (map[i][j] == 1) {
queue.add(new Node(i, j));
dist[i][j] = 0;
}
}
}
//거리 측정(BFS)
while (!queue.isEmpty()) {
Node node = queue.poll();
for (int d = 0; d < 4; d++) {
int nr = node.r + dr[d];
int nc = node.c + dc[d];
if (nr >= 0 && nc >= 0 && nc < N && nr < N) {
if (dist[nr][nc] == -1) {
dist[nr][nc] = dist[node.r][node.c] + 1;
group[nr][nc] = group[node.r][node.c];
queue.add(new Node(nr, nc)) ;
}
}
}
}
//최소 거리 구하기
int min = Integer.MAX_VALUE;
for (int i = 0; i < N; i++) {
for (int j = 0; j < N; j++) {
for (int d = 0; d < 4; d++) {
int nr = i + dr[d];
int nc = j + dc[d];
if (nr >= 0 && nc >= 0 && nr < N && nc < N) {
if (group[i][j] != group[nr][nc]) {
min = Math.min(min, dist[nr][nc] + dist[i][j]);
}
}
}
}
}
System.out.println(min);
}
}