[Programmers] 카카오프렌즈 컬러링북 - 2017 카카오코드 예선 (Flood Fill 알고리즘)

동민·2021년 3월 11일
// 카카오프렌즈 컬러링북 - 2017 카카오코드 예선 (Flood Fill 알고리즘)
public class KakaoFriendsColoringBook {
	private static boolean[][] visit;
	private static int[] dx = new int[] { 0, 0, -1, 1 }; // 상하좌우
	private static int[] dy = new int[] { 1, -1, 0, 0 }; // 상하좌우

	public int[] solution(int m, int n, int[][] picture) { // 해당 문제는 전역변수를 지역변수로 선언해야 통과 가능 함 
		int numberOfArea = 0, maxSizeOfOneArea = 0;
		visit = new boolean[m][n];

		for (int i = 0; i < m; i++) {
			for (int j = 0; j < n; j++) {
				if (!visit[i][j] && picture[i][j] != 0) { // 0은 영역에서 제외
					numberOfArea++; // 영역의 수를 계산
					maxSizeOfOneArea = Math.max(maxSizeOfOneArea, dfs(picture, i, j, picture[i][j])); // 영역 넓이의 최대값을 저장
				}
			}
		}
		return new int[] { numberOfArea, maxSizeOfOneArea };
	}

	private static int dfs(int[][] picture, int x, int y, int current) {
		int cnt = 1;
		if (visit[x][y]) // StackOverFlow 방지
			return 0;
		for (int i = 0; i < 4; i++) { // 상하좌우 체크
			int newX = x + dx[i];
			int newY = y + dy[i];
			if (newX >= 0 & newX < picture.length && newY >= 0 && newY < picture[0].length
					&& current == picture[newX][newY]) {
				visit[x][y] = true;
				cnt += dfs(picture, newX, newY, current);
			}
		}
		return cnt; // 영역의 넓이를 반환
	}
}
  • Flood Fill 알고리즘 - 영역 등을 구하는 알고리즘
profile
BE Developer

0개의 댓글