다리만들기


백준 2146: 다리만들기

문제보기
Alt text

풀이

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);
	}
}