931. Minimum Falling Path Sum

  • 행렬이 μ£Όμ–΄μ‘Œμ„ λ•Œ κ°€μž₯ μœ„μͺ½ ν–‰μœΌλ‘œ λΆ€ν„° κ°€μž₯ μ•„λž˜ ν–‰κΉŒμ§€ νƒμƒ‰ν•œλ‹€. 이 λ•Œ νƒμƒ‰ν•œ 경둜의 숫자 ν•© 쀑 κ°€μž₯ μž‘μ€ 숫자λ₯Ό κ΅¬ν•˜λŠ” 문제.
    • 탐색은 ν˜„μž¬ μœ„μΉ˜λ‘œ λΆ€ν„° λ°”λ‘œ μ•„λž˜, λŒ€κ°μ„ μœΌλ‘œ μ™Όμͺ½/였λ₯Έμͺ½ μ•„λž˜μ— μžˆλŠ” 칸으둜 μ΄λ™ν•˜μ—¬ 이루어진닀.
  • λ‘λ²ˆμ§Έ ν–‰ λΆ€ν„° 각 μ—΄μ˜ ν•­λͺ©μ„ νƒμƒ‰ν•˜λ©° 경둜의 숫자 합을 κ΅¬ν•œλ‹€.
    • ν˜„μž¬ μΉΈ (i, j)에 도달할 수 μžˆλŠ” μœ„μΉ˜λŠ” λ°”λ‘œ μœ„ (i-1, j), μ™Όμͺ½ λŒ€κ°μ„  μœ„ (i-1, j-1), 였λ₯Έμͺ½ λŒ€κ°μ„  μœ„ (i-1, j+1)에 ν•΄λ‹Ήλœλ‹€.
    • λ”°λΌμ„œ ν˜„μž¬ 칸의 κ°’ matrix[i][j] κ³Ό 이전 μœ„μΉ˜μ˜ κ°’ matrix[i-1][k] (k = j-1 ~ j+1) 을 λ”ν•œ κ°’ 쀑 μ΅œμ†Œκ°’μ„ ν˜„μž¬ 칸의 κ°’ matrix[i][j]으둜 ν•œλ‹€.
  • λ§ˆμ§€λ§‰ ν–‰μ˜ κ°’ 쀑 μ΅œμ†Œ 값을 κ²°κ³Ό κ°’μœΌλ‘œ ν•œλ‹€.
class Solution { public int minFallingPathSum(int[][] matrix) { int N = matrix.length; for (int i = 1; i < N; ++i) { for (int j = 0; j < N; ++j) { int curr = matrix[i][j]; matrix[i][j] = Integer.MAX_VALUE; for (int k = Math.max(j - 1, 0); k <= Math.min(j + 1, N - 1); ++k) { matrix[i][j] = Math.min(matrix[i][j], curr + matrix[i - 1][k]); } } } int result = matrix[N - 1][0]; for (int i = 1; i < N; ++i) { result = Math.min(result, matrix[N - 1][i]); } return result; } }