Publish:

νƒœκ·Έ: , , , , ,

μΉ΄ν…Œκ³ λ¦¬:

img_3.png

문제

문제 링크

img_3.png

μ„€λͺ…

λ‘œλ΄‡μ΄ 격자 μ™Όμͺ½ 상단뢀터 였λ₯Έμͺ½ ν•˜λ‹¨ λκΉŒμ§€ μ΄λ™ν•˜λŠ” 경우의 수λ₯Ό μ°ΎλŠ” 문제. 이전 λ¬Έμ œμ™€ κ΅¬ν˜„ 방식은 κ°™λ‹€. 단, 쀑간에 μž₯애물이 μžˆλŠ” 경우 κ·Έμͺ½μœΌλ‘œλŠ” 갈 수 μ—†λ‹€λŠ” 쑰건이 μžˆλ‹€.

풀이

  1. dp λ°°μ—΄ μ •μ˜ : (i,j) μ˜μ—­μ— λ„λ‹¬ν•˜λŠ” 경둜의 수
    • (i,0) / (0,j) 쀄은 경우의 μˆ˜κ°€ ν•˜λ‚˜λΏμ΄λ―€λ‘œ 미리 μ±„μ›Œ λ†“λŠ”λ‹€.
    • μž₯애물이 μžˆλŠ” 경우 0, μ•„λ‹Œ 경우 1둜 μ„ΈνŒ…ν•œλ‹€.
      • μž₯μ• λ¬Ό μ΄ν›„μ˜ κ²½λ‘œλŠ” λͺ»μ§€λ‚˜κ°€λ―€λ‘œ break
  2. 점화식 λ„μΆœ : λ¬Έμ œμ—μ„œ λ‘œλ΄‡μ€ 였λ₯Έμͺ½ λ˜λŠ” μ•„λž˜ 둜 밖에 움직이지 λͺ»ν•œλ‹€κ³  ν–ˆμœΌλ―€λ‘œ (i, j) μ˜μ—­μ— λ„λ‹¬ν•˜λŠ” 경우의 μˆ˜λŠ” μ™Όμͺ½μ—μ„œ μ˜€λŠ” 경우의 수 + μœ„μ—μ„œ μ˜€λŠ” 경우의 수둜 λ‚˜νƒ€λ‚Ό 수 μžˆλ‹€.
    • dp[i][j] = dp[i][j - 1] + dp[i - 1][j]
    • μž₯애물이 μžˆλŠ” 경우(obstacleGrid[i][j] == 1) κ·Έ κ²½λ‘œμ—” 도달할 수 μ—†μœΌλ―€λ‘œ 0으둜 μ„ΈνŒ…
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
class Solution {
  public int uniquePathsWithObstacles(int[][] obstacleGrid) {
    int m = obstacleGrid.length;
    int n = obstacleGrid[0].length;
    int[][] dp = new int[m][n];

    for (int i = 0; i < m; i++) {
      if (obstacleGrid[i][0] == 1) {
        dp[i][0] = 0;
        break;
      } else {
        dp[i][0] = 1;
      }
    }

    for (int i = 0; i < n; i++) {
      if (obstacleGrid[0][i] == 1) {
        dp[0][i] = 0;
        break;
      } else {
        dp[0][i] = 1;
      }
    }

    for (int i = 1; i < m; i++) {
      for (int j = 1; j < n; j++) {
        if (obstacleGrid[i][j] == 1) {
          dp[i][j] = 0;
        } else {
          dp[i][j] = dp[i - 1][j] + dp[i][j - 1];
        }
      }
    }
    return dp[m - 1][n - 1];
  }
}
λ°©λ¬Έν•΄ μ£Όμ…”μ„œ κ°μ‚¬ν•©λ‹ˆλ‹€! λŒ“κΈ€,지적,ν”Όλ“œλ°± μ–Έμ œλ‚˜ ν™˜μ˜ν•©λ‹ˆλ‹€πŸ˜Š

λŒ“κΈ€λ‚¨κΈ°κΈ°