[리트코드] 64. Minimum Path Sum
64. Minimum Path Sum
나의 풀이 (런타임 초과)
/**
* @param {number[][]} grid
* @return {number}
*/
var minPathSum = function (grid) {
let row = grid.length;
let col = grid[0].length;
let [x, y] = [0, 0];
let visited = Array.from(Array(row), () => Array(col).fill(0));
const next = [
[0, 1],
[1, 0],
];
let answer = Infinity;
const dfs = (x, y, visited, acc) => {
acc += grid[x][y];
if (x === row - 1 && y === col - 1) {
answer = answer > acc ? acc : answer;
return;
}
for (let i = 0; i < 2; i++) {
let nx = x + next[i][0];
let ny = y + next[i][1];
if (nx >= 0 && ny >= 0 && nx < row && ny < col && visited[nx][ny] === 0) {
visited[x][y] = 1;
dfs(nx, ny, visited, acc);
visited[x][y] = 0;
}
}
};
dfs(x, y, visited, 0);
return answer;
};
dfs 를 이용하여 최단경로로 갈 수 있는 모든 경우의 수 중 가장 작은 값을 구하려고 했다.
테스트케이스 갯수가 어마무시하게 커지면서 런타임에러가 발생했다.
참고한 코드
/**
* @param {number[][]} grid
* @return {number}
*/
var minPathSum = function (grid) {
const row = grid.length;
const col = grid[0].length;
for (let i = 0; i < row; i++) {
for (let j = 0; j < col; j++) {
if (i == 0 && j == 0) {
continue;
}
if (i == 0) {
grid[i][j] = grid[i][j] + grid[i][j - 1];
continue;
}
if (j == 0) {
grid[i][j] = grid[i][j] + grid[i - 1][j];
continue;
}
grid[i][j] = Math.min(grid[i][j] + grid[i][j - 1], grid[i][j] + grid[i - 1][j]);
}
}
return grid[row - 1][col - 1];
};
dfs/bfs 방식이 아닌 점화식을 통해 최단거리를 구하는 것이었다.
0열은 본인의 왼쪽을 더하고,
0행은 본인의 위쪽을 더하고,
중간은 위와 왼쪽중 작은 값을 택한다.
Runtime: 68 ms, faster than 97.79% of JavaScript online submissions for Minimum Path Sum.
굉장히 빠른 속도다…ㅠ