733. Flood Fill 풀이 - js

fgStudy·2022년 6월 5일
0

코딩테스트

목록 보기
42/69
post-thumbnail

해당 포스팅은 릿코드 733번 Flood Fill 풀이를 다룬다. 문제 링크

코드는 Javascript로 작성했고 DFS로 풀이하였다.


문제

An image is represented by an m x n integer grid image where image[i][j] represents the pixel value of the image.

You are also given three integers sr, sc, and newColor. You should perform a flood fill on the image starting from the pixel image[sr][sc].

To perform a flood fill, consider the starting pixel, plus any pixels connected 4-directionally to the starting pixel of the same color as the starting pixel, plus any pixels connected 4-directionally to those pixels (also with the same color), and so on. Replace the color of all of the aforementioned pixels with newColor.

Return the modified image after performing the flood fill.

input으로 m X n grid인 images와 sr, sc, newColor가 주어진다.
image[sr][sc]에서 시작해서 image에 홍수 채우기를 수행하자.
image[sr][sc]를 newColor로 변경하고, 해당 픽셀과 4방향으로 연결된 픽셀이 동일한 색상일 시 newColor로 변경하자.


풀이

좌표 (sr,sc)를 newColor로 변경한 다음, 좌표 (sr,sc)의 상하좌우를 탐색하면서 해당 좌표의 원래 색상(oldColor)과 동일할 시 newColor로 변경해주는 문제이다. 상하좌우에 oldColor인 값이 있는지를 계속 탐색해야 하므로 dfs를 이용하면 된다.

이 때 주의할 점은 oldColor와 newColor가 동일할 시, 좌표 (sr, sc)와 해당 좌표의 상하좌우 중 같은 값이 있는 좌표가 있을 시 재귀호출로 인한 스택오버플로우가 난다. 이는 방문할 노드를 담아둘 visited 배열을 따로 만듦으로서 해결할 수 있지만, 필자는 oldColor와 newColor가 같을 시 return시킴으로서 해결했다.


전체 코드

/**
 * @param {number[][]} image
 * @param {number} sr
 * @param {number} sc
 * @param {number} newColor
 * @return {number[][]}
 */
const dx=[-1, 0, 1, 0];
const dy=[0, 1, 0, -1];

var floodFill = function(image, sr, sc, newColor) {
    const oldColor = image[sr][sc];
    if (oldColor === newColor) return image;
    
    dfs(image, sr, sc, oldColor, newColor);
    return image;
};


function dfs(image, x, y, oldColor, newColor) {    
    image[x][y] = newColor;
    const m = image.length;
    const n = image[0].length;

    for (let k=0; k<4; k++) {
        const nx = x + dx[k];
        const ny = y + dy[k];
        const dfsCondition = nx >= 0 && ny >= 0 && nx < m && ny < n && image[nx][ny] === oldColor;
        
        if (dfsCondition) {
            dfs(image, nx, ny, oldColor, newColor);
        }
    }
}
profile
지식은 누가 origin인지 중요하지 않다.

0개의 댓글