[리트코드] 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.


굉장히 빠른 속도다…ㅠ