[백준] P2573

동민·2021년 3월 11일
import java.util.Scanner;

public class P2573 {
	private static int[][] matrix;
	private static boolean[][] visit;
	private static int[] dx = { 0, 0, -1, 1 };
	private static int[] dy = { 1, -1, 0, 0 };
	private static int n, m;

	public static void main(String[] args) {
		Scanner sc = new Scanner(System.in);
		n = sc.nextInt();
		m = sc.nextInt();
		matrix = new int[n][m];
		for (int i = 0; i < n; i++) {
			for (int j = 0; j < m; j++) {
				int ice = sc.nextInt();
				matrix[i][j] = ice;
			}
		}
		System.out.println(solution());
		sc.close();
	}

	private static int solution() {
		int area = -1, year = 1;
		while (area != 0) {
			area = 0;
			visit = new boolean[n][m];
			iceToWater();
			for (int i = 1; i < n - 1; i++) {
				for (int j = 1; j < m - 1; j++) {
					if (!visit[i][j] && matrix[i][j] != 0) {
						area++;
						dfs(i, j);
					}
				}
			}
			if (area >= 2)
				return year;
			if (area == 0)
				return 0;
			year++;
		}
		return 0;
	}

	private static void dfs(int x, int y) {
		if (visit[x][y])
			return;
		for (int i = 0; i < 4; i++) {
			int newX = x + dx[i];
			int newY = y + dy[i];
			if (matrix[newX][newY] != 0) {
				visit[x][y] = true;
				dfs(newX, newY);
			}
		}
	}

	private static void iceToWater() { // 얼음 녹이는 함수
		int[][] toWaterMatrix = new int[n][m];
		for (int i = 1; i < n - 1; i++) {
			for (int j = 1; j < m - 1; j++) {
				if (matrix[i - 1][j] == 0)
					toWaterMatrix[i][j]++;
				if (matrix[i + 1][j] == 0)
					toWaterMatrix[i][j]++;
				if (matrix[i][j - 1] == 0)
					toWaterMatrix[i][j]++;
				if (matrix[i][j + 1] == 0)
					toWaterMatrix[i][j]++;
			}
		}
		for (int i = 1; i < n - 1; i++) {
			for (int j = 1; j < m - 1; j++) {
				matrix[i][j] -= toWaterMatrix[i][j];
				if (matrix[i][j] < 0)
					matrix[i][j] = 0;
			}
		}
	}
}
profile
BE Developer

0개의 댓글