본문 바로가기

Algorithm

[leetcode 75] 733. Flood Fill

문제해석

m x n 배열의 각 픽셀정보가 들어있는 image가 주어질 때

sr, sc, color가 주어진다.

image[sr][sc]에 위치에 flood fill이라는 동작을 시킨다.

 

flood fill을 하게되면 시작 픽셀이 되어서 해당 픽셀을 주어진 color로 변경하고 인접한 4방향의(위,아래,오른쪽,왼쪽) 픽셀 또한 color로 변경 시킨다. 변경된 4방향의 픽셀과 인접한 동일한 기존 픽셀들 또한 모두 주어진 color로 변경한다.

그리고 변경된 이미지를 반환

 

쉽게 말해서 그림판 색채우기를 떠올리면 될 것 같다.

 

정답 예

public int[][] floodFill(int[][] image, int sr, int sc, int color) {
    int existColor = image[sr][sc];
    change(image, sr, sc, color, existColor);
    return image;
}

public void change(int[][] image, int sr, int sc, int color, int existColor) {
    // 이미지 범위 초과
    if (sr < 0 || sr >= image.length) {
        return;
    }

    // 이미지 범위 초과
    if (sc < 0 || sc >= image[0].length) {
        return;
    }

    // 변경 가능 픽셀인지 체크
    // 바꿀 수 있는 픽셀이 아니거나
    // 이미 변경된 픽셀이거나
    if (existColor != image[sr][sc] || color == image[sr][sc]) {
        return;
    }

    image[sr][sc] = color;

    // 위로 이동
    change(image, sr - 1, sc, color, existColor);

    // 아래로 이동
    change(image, sr + 1, sc, color, existColor);

    // 오른쪽으로 이동
    change(image, sr, sc + 1, color, existColor);

    // 왼쪽으로 이동
    change(image, sr, sc - 1, color, existColor);
}