μΉ΄ν…Œκ³ λ¦¬ μ—†μŒ

[Programmers] λ“±κ΅£κΈΈ - 동적 ν”„λ‘œκ·Έλž˜λ°

JKROH 2023. 9. 20. 17:12
λ°˜μ‘ν˜•

πŸ”— Link

https://school.programmers.co.kr/learn/courses/30/lessons/42898

 

πŸ€” Think

μš°μ•„ν•œν…Œν¬μΊ ν”„ μ½”λ”©ν…ŒμŠ€νŠΈ 문제 쀑 거의 λ˜‘κ°™μ€ ν˜•νƒœμ˜ 문제λ₯Ό ν’€μ—ˆλ˜ 기얡이 μžˆμ–΄μ„œ 풀이법을 μ‰½κ²Œ λ– μ˜¬λ¦΄ 수 μžˆμ—ˆμŠ΅λ‹ˆλ‹€.

 

μ•„λž˜ λ˜λŠ” 였λ₯Έμͺ½μœΌλ‘œλ§Œ μ΄λ™ν•˜κΈ° λ•Œλ¬Έμ— ꡉμž₯히 μ‰½κ²Œ 풀이가 κ°€λŠ₯ν•©λ‹ˆλ‹€.

 

[a , b]에 λ„λ‹¬ν•˜λŠ” μ΅œλ‹¨κ±°λ¦¬λŠ” [a-1 , b]κΉŒμ§€ λ„λ‹¬ν•˜λŠ” μ΅œλ‹¨ 거리의 수 + [a , b-1]κΉŒμ§€ λ„λ‹¬ν•˜λŠ” μ΅œλ‹¨ 거리의 수 μž…λ‹ˆλ‹€.

 

μ΅œλ‹¨κ±°λ¦¬λ‘œ 도달할 수 μ—†λŠ” 지역은 -1둜 μ²˜λ¦¬ν–ˆμŠ΅λ‹ˆλ‹€. 0으둜 μ²˜λ¦¬ν•˜λ©΄ μ΄ˆκΈ°ν™” ν•œ 이차원 λ°°μ—΄μ—μ„œ μ΄ˆκΉƒκ°’κ³Ό κ΅¬λΆ„ν•˜κΈ° μœ„ν•΄μ„œμž…λ‹ˆλ‹€.

 

이후 2차원 배열을 μ±„μ›Œλ‚˜κ°‘λ‹ˆλ‹€. O(N^2)만큼의 μ‹œκ°„λ³΅μž‘λ„κ°€ λ°œμƒν•©λ‹ˆλ‹€.

πŸ”Ž Solve

  • nν–‰ mμ—΄ 크기의 2차원 배열을 μƒμ„±ν•˜κ³  1ν–‰κ³Ό 1열을 1둜 μ±„μ›Œμ€λ‹ˆλ‹€. 
  • μ΅œλ‹¨κ±°λ¦¬λ‘œ 도달할 수 μ—†λŠ” 지역은 -1둜 μ²˜λ¦¬ν•©λ‹ˆλ‹€.
    • 이 λ•Œ, 1ν–‰κ³Ό 1열을 λ‹€μ‹œ 돌며 만일 [n-1 , 0] λ˜λŠ” [0 , n-1] 번 칸이 -1이면 이후 칸은 μ „λΆ€ -1둜 μ²˜λ¦¬ν•©λ‹ˆλ‹€. μ΅œλ‹¨κ±°λ¦¬λ‘œ 도달할 수 μžˆλŠ” κ²½λ‘œκ°€ 사라진 것이기 λ•Œλ¬Έμž…λ‹ˆλ‹€.
  • 2차원 배열을 돌며 [2,1] μ›μ†ŒλΆ€ν„° μˆœμ„œλŒ€λ‘œ 배열을 μ±„μ›Œκ°‘λ‹ˆλ‹€.
  • 만일 μ΅œμ’… λͺ©μ μ§€μ— λ„μ°©ν•˜λŠ” μ΅œμ†Œ 경둜의 μˆ˜κ°€ μ—†μœΌλ©΄ 0을 λ”°λ‘œ λ°˜ν™˜ν•©λ‹ˆλ‹€.
    • 도착할 수 μ—†λŠ” κ²½μš°μ—λŠ” -1이 μ €μž₯λ˜μ–΄ 있기 λ•Œλ¬Έμž…λ‹ˆλ‹€.

πŸ’» Code

class Solution {
    public int solution(int m, int n, int[][] puddles) {
        int[][] map = new int[n][m];

        // 1ν–‰ 및 1μ—΄ μ΄ˆκΈ°ν™”
        for (int i = 0; i < n; i++) {
            map[i][0] = 1;
        }
        for (int i = 0; i < m; i++) {
            map[0][i] = 1;
        }

        // 갈 수 μ—†λŠ” μœ„μΉ˜λŠ” -1둜 처리
        for (int[] puddle : puddles) {
            map[puddle[1] - 1][puddle[0] - 1] = -1;
        }

        // 만일 1μ—΄ 및 1ν–‰μ—μ„œ 갈 수 μ—†λŠ” 지역이 있으면 μ΄ν›„λ‘œλ„ 갈 수 μžˆλŠ” μ΅œμ†Œ κ²½λ‘œλŠ” μ—†μŒ
        for (int i = 1; i < n; i++) {
            if (map[i - 1][0] == -1) {
                map[i][0] = -1;
            }
        }
        for (int i = 1; i < m; i++) {
            if (map[0][i - 1] == -1) {
                map[0][i] = -1;
            }
        }

        // λ°”λ‘œ μœ„ λ˜λŠ” λ°”λ‘œ μ™Όμͺ½ κΉŒμ§€ 갈 수 μžˆλŠ” 졜적 경둜의 합이 νŠΉμ • μœ„μΉ˜κΉŒμ§€ 갈 수 μžˆλŠ” 졜적 경둜 수
        for (int i = 1; i < n; i++) {
            for (int j = 1; j < m; j++) {
                if (map[i][j] == 0) {
                    if (map[i - 1][j] == -1) {
                        map[i][j] = map[i][j - 1];
                        continue;
                    }
                    if (map[i][j - 1] == -1) {
                        map[i][j] = map[i - 1][j];
                        continue;
                    }
                    map[i][j] = (map[i - 1][j] + map[i][j - 1]) % 1000000007;
                }
            }
        }

        // 만일 갈 수 μ—†μœΌλ©΄ 0 λ°˜ν™˜
        if (map[n - 1][m - 1] == -1) {
            return 0;
        }
        return map[n - 1][m - 1];
    }
}
λ°˜μ‘ν˜•