양수로 이루어진 m x n
그리드를 인자로 드립니다.
상단 왼쪽에서 시작하여, 하단 오른쪽까지 가는 길의 요소를 다 더했을 때,
가장 작은 합을 찾아서 return 해주세요.
한 지점에서 우측이나 아래로만 이동할 수 있습니다.
Input: grid = [[1,3,1],[1,5,1],[4,2,1]]
Output: 7
Explanation: Because the path 1 → 3 → 1 → 1 → 1 minimizes the sum.
Input: grid = [[1,2,3],[4,5,6]]
Output: 12
DFS 방식으로 풀어야 할 것 같았다. 재귀이면서 갈 수 있는 레벨이 정해져 있으니까.
처음에는 x가 배열의 끝으로 갈 때 (x === m-1)
이 부분을 else if로 하지 않고 if로만 했더니 아래부분까지 돌면서 에러가 났다.
이 에러 찾는데 한참 걸렸다 .. !
2시간반 정도 걸렸다.
const minPathSum = grid => {
let m = grid.length;
let n = grid[0].length;
let min_sum = 10000;
function D(L, x, y, t_sum) {
if (L >= (m+n-2)) {
if (min_sum > t_sum) {
min_sum = t_sum;
return
}
return
} else if (x === m-1) {
D(L+1, x, y+1, t_sum + grid[x][y+1])
} else if (y === n-1) {
D(L+1, x+1, y, t_sum + grid[x+1][y])
} else {
D(L+1, x+1, y, t_sum+grid[x+1][y]);
D(L+1, x, y+1, t_sum+grid[x][y+1])
}
return min_sum
}
return D(0,0,0, grid[0][0])
};
var minPathSum = function(grid) {
// Get the two dimensions of the grid
const n = grid.length;
const m = grid[0].length;
// Calculate the distance travelled within the first column
// This is because each square depends on the one above
// And the one to the left. However there is nothing left
// of the first column so we can calculate it by adding
// the current square to the square above it
for(let i=1; i<n; i++) {
grid[i][0] += grid[i-1][0];
}
// The same goes for the first row. There is nothing above the
// first row. So we just calculate the distance by what is to the left
// of it
for(let j=1; j<m; j++) {
grid[0][j] += grid[0][j-1];
}
// Start one row and one column in because we've precomputed
// those above
for(let i=1; i<n; i++) {
for(let j=1; j<m; j++) {
// The distance to the grid at i,j is equal to itself plus the minimum
// of the two grid spaces (one above, one to the left)
grid[i][j] += Math.min(grid[i-1][j], grid[i][j-1]);
}
}
// Return the distance bottom right corner
return grid[n-1][m-1];
};
[0,0]에서 행, 열로 가면서 그 배열의 수의 합을 누적시킨다.
아래 output 으로 바뀐다.
아래 배열에서 [1,1], [2,1]은 변함이 없다.
// input
[[1,2],
[1,3],
[1,4]]
// output
[[1,3],
[2,3],
[3,4]]
[1,1]에서 위와 왼쪽 중 작은 수를 택해서 자신과 합한다.
[2,1]에서 위와 왼쪽 중 작은 수를 택해서 자신과 합한다.
최종배열의 모양은 이렇다.
[[1,3],
[2,5],
[3,7]]
성공하셨군요!!!!!!!!! 존멋탱💛