Leetcode Java Minimum Path Sum
업데이트:
문제
코드
class Solution {
public int minPathSum(int[][] grid) {
int[] dp = this.getDp(grid);
for (int i = 1; i < grid.length; i++) {
for (int j = 0; j < grid[i].length; j++) {
if (j == 0) {
dp[j] += grid[i][j];
} else {
dp[j] = grid[i][j] + Math.min(dp[j - 1], dp[j]);
}
}
}
return dp[grid[0].length - 1];
}
private int[] getDp(int[][] grid) {
int[] dp = new int[grid[0].length];
dp[0] = grid[0][0];
for (int j = 1; j < grid[0].length; j++) {
dp[j] = dp[j - 1] + grid[0][j];
}
return dp;
}
}
결과
설명
-
좌측 상단에서 시작해서 우측 하단으로 이동하기까지 배열 내 값의 합이 낮은 값을 탐색하는 문제이다.
- 누적 합을 구하기 위해 DP를 주어진 2차원 배열 grid의 열 길이만큼 정의한다.
- 각 이동 간 합을 순차적으로 보기 위해서는 grid와 동일 크기로 정의해도 되나, 최소 이동 횟수만 구하면 되므로 grid의 열 길이만큼 정의하여 이동 값의 합을 구한다.
-
정의한 DP에 첫 행을 반복하여 순차적으로 누계를 저장한다.
- 주어진 2차원 배열 grid를 반복하여 우측 하단 마지막 셀에 도달하기 까지 최소 합을 구한다.
- DP를 주어진 배열 grid의 첫 행으로 초기화 하였으므로, 다음 행부터 반복을 수행한다.
- 첫 열의 경우, DP의 같은 열에 배열의 값을 누적시킨다.
- 점진적으로 우측 하단으로 이동하므로, 첫 열은 하단으로 이동하는 경우로 판단한다.
- 그 외의 경우, DP의 같은 열에 배열의 값과 DP[$j - 1$]과 DP[j]의 값 중 작은 값을 더한다.
- 우측 하단으로 점진적으로 이동하면서 바로 아래칸으로 이동하는 경우와, 옆칸으로 이동하는 경우의 최소 값을 더하여 목적지에 도착하기 위한 최소 합을 구한다.
- 반복이 완료되면, DP의 마지막 열 값을 주어진 문제의 결과로 반환한다.
소스
Sample Code는 여기에서 확인 가능합니다.
댓글남기기