[백준] P2468

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

public class P2468 { // Flood-Fill & Brute Force
	private static int N;
	private static int[][] matrix;
	private static boolean[][] visit;
	private static int[] dx = { 0, 0, -1, 1 };
	private static int[] dy = { 1, -1, 0, 0 };

	public static void main(String[] args) {

		Scanner sc = new Scanner(System.in);
		N = sc.nextInt();
		matrix = new int[N][N];

		int highest = 0;
		for (int i = 0; i < N; i++) {
			for (int j = 0; j < N; j++) {
				matrix[i][j] = sc.nextInt();
				highest = matrix[i][j] > highest ? matrix[i][j] : highest;
			}
		}
		System.out.println(solution(highest));
		sc.close();

	}

	private static int solution(int highest) {
		int areaMax = 1, area = 0;

		for (int rain = 1; rain < highest; rain++) {
			visit = new boolean[N][N];
			for (int i = 0; i < N; i++) {
				for (int j = 0; j < N; j++) {
					if (matrix[i][j] != -1 && matrix[i][j] <= rain)
						matrix[i][j] = -1;
				}
			}

			for (int i = 0; i < N; i++) {
				for (int j = 0; j < N; j++) {
					if (!visit[i][j] && matrix[i][j] != -1) {
						area++;
						dfs(i, j);
					}
				}
			}
			areaMax = area > areaMax ? area : areaMax;
			area = 0;
		}
		return areaMax;
	}

	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 (isValid(newX, newY) && matrix[newX][newY] != -1) {
				visit[x][y] = true;
				dfs(newX, newY);
			}
		}
	}

	private static boolean isValid(int x, int y) {
		return x < 0 || x >= N || y < 0 || y >= N ? false : true;
	}
}
profile
BE Developer

0개의 댓글