μ•Œκ³ λ¦¬μ¦˜/ν”„λ‘œκ·Έλž˜λ¨ΈμŠ€

[ ν”„λ‘œκ·Έλž˜λ¨ΈμŠ€ / Programmers Level 3 ] λ³΄ν–‰μž 천ꡭ

KIMHYEYUN 2021. 9. 30. 22:54
λ°˜μ‘ν˜•

https://programmers.co.kr/learn/courses/30/lessons/1832

 

μ½”λ”©ν…ŒμŠ€νŠΈ μ—°μŠ΅ - λ³΄ν–‰μž 천ꡭ

3 3 [[0, 0, 0], [0, 0, 0], [0, 0, 0]] 6 3 6 [[0, 2, 0, 0, 0, 2], [0, 0, 2, 0, 1, 0], [1, 0, 0, 2, 2, 0]] 2

programmers.co.kr

 

문제  μ„€λͺ…


μΉ΄μΉ΄μ˜€λ‚΄λΉ„ 개발자인 μ œμ΄μ§€λŠ” μ‹œλ‚΄ μ€‘μ‹¬κ°€μ˜ 경둜 탐색 μ•Œκ³ λ¦¬μ¦˜ 개발 업무λ₯Ό λ‹΄λ‹Ήν•˜κ³  μžˆλ‹€. 졜근 λ“€μ–΄ λ³΄ν–‰μžκ°€ 자유둭고 νŽΈλ¦¬ν•˜κ²Œ 걸을 수 μžˆλ„λ‘ λ³΄ν–‰μž μ€‘μ‹¬μ˜ ꡐ톡 체계가 λ„μž…λ˜λ©΄μ„œ λ„μ‹¬μ˜ 일뢀 ꡬ역은 μžλ™μ°¨ 톡행이 κΈˆμ§€λ˜κ³ , 일뢀 κ΅μ°¨λ‘œμ—μ„œλŠ” λ³΄ν–‰μž μ•ˆμ „μ„ μœ„ν•΄ μ’ŒνšŒμ „μ΄λ‚˜ μš°νšŒμ „μ΄ κΈˆμ§€λ˜κΈ°λ„ ν–ˆλ‹€. λ³΅μž‘ν•΄μ§„ λ„λ‘œ ν™˜κ²½μœΌλ‘œ 인해 기쑴의 경둜 탐색 μ•Œκ³ λ¦¬μ¦˜μ„ 보완해야 ν•  ν•„μš”κ°€ 생겼닀.

λ„μ‹œ μ€‘μ‹¬κ°€μ˜ μ§€λ„λŠ” m × n ν¬κΈ°μ˜ 격자 λͺ¨μ–‘ λ°°μ—΄ city_map으둜 μ£Όμ–΄μ§„λ‹€. μžλ™μ°¨λŠ” 였λ₯Έμͺ½ λ˜λŠ” μ•„λž˜ λ°©ν–₯으둜 ν•œ μΉΈμ”© 이동 κ°€λŠ₯ν•˜λ‹€.

city_map[i][j]μ—λŠ” λ„λ‘œμ˜ 상황을 λ‚˜νƒ€λ‚΄λŠ” 값이 μ €μž₯λ˜μ–΄ μžˆλ‹€.

  • 0인 κ²½μš°μ—λŠ” μžλ™μ°¨κ°€ 자유둭게 μ§€λ‚˜κ°ˆ 수 μžˆλ‹€.
  • 1인 κ²½μš°μ—λŠ” μžλ™μ°¨ 톡행이 κΈˆμ§€λ˜μ–΄ μ§€λ‚˜κ°ˆ 수 μ—†λ‹€.
  • 2인 κ²½μš°λŠ” λ³΄ν–‰μž μ•ˆμ „μ„ μœ„ν•΄ μ’ŒνšŒμ „μ΄λ‚˜ μš°νšŒμ „μ΄ κΈˆμ§€λœλ‹€. (μ™Όμͺ½μ—μ„œ 였던 μ°¨λŠ” 였λ₯Έμͺ½μœΌλ‘œλ§Œ, μœ„μ—μ„œ 였던 μ°¨λŠ” μ•„λž˜μͺ½μœΌλ‘œλ§Œ μ§„ν–‰ κ°€λŠ₯ν•˜λ‹€)

λ„μ‹œμ˜ λ„λ‘œ μƒνƒœκ°€ μž…λ ₯으둜 μ£Όμ–΄μ‘Œμ„ λ•Œ, μ™Όμͺ½ μœ„μ˜ μΆœλ°œμ μ—μ„œ 였λ₯Έμͺ½ μ•„λž˜ λ„μ°©μ κΉŒμ§€ μžλ™μ°¨λ‘œ 이동 κ°€λŠ₯ν•œ 전체 κ°€λŠ₯ν•œ 경둜 수λ₯Ό 좜λ ₯ν•˜λŠ” ν”„λ‘œκ·Έλž¨μ„ μž‘μ„±ν•˜λΌ. μ΄λ•Œ κ°€λŠ₯ν•œ 경둜의 μˆ˜λŠ” 컴퓨터가 ν‘œν˜„ν•  수 μžˆλŠ” μ •μˆ˜μ˜ λ²”μœ„λ₯Ό λ„˜μ–΄μ„€ 수 μžˆμœΌλ―€λ‘œ, κ°€λŠ₯ν•œ 경둜 수λ₯Ό 20170805둜 λ‚˜λˆˆ λ‚˜λ¨Έμ§€ 값을 좜λ ₯ν•˜λΌ.

μž…λ ₯ ν˜•μ‹


μž…λ ₯은 λ„μ‹œμ˜ 크기λ₯Ό λ‚˜νƒ€λ‚΄λŠ” mκ³Ό n, 그리고 지도λ₯Ό λ‚˜νƒ€λ‚΄λŠ” 2차원 λ°°μ—΄ city_map으둜 μ£Όμ–΄μ§„λ‹€. μ œν•œμ‘°κ±΄μ€ μ•„λž˜μ™€ κ°™λ‹€.

  • 1 <= m, n <= 500
  • city_map의 ν¬κΈ°λŠ” m × n이닀.
  • λ°°μ—΄μ˜ λͺ¨λ“  μ›μ†Œμ˜ 값은 0, 1, 2 μ€‘ ν•˜λ‚˜μ΄λ‹€.
  • 좜발점의 μ’Œν‘œλŠ” (0, 0), λ„μ°©μ μ˜ μ’Œν‘œλŠ” (m - 1, n - 1)이닀.
  • 좜발점과 λ„μ°©μ μ˜ city_map[i][j] κ°’은 0이닀.

좜λ ₯ ν˜•μ‹


μΆœλ°œμ μ—μ„œ λ„μ°©μ κΉŒμ§€ 이동 κ°€λŠ₯ν•œ 전체 경둜의 수λ₯Ό 20170805둜 λ‚˜λˆˆ λ‚˜λ¨Έμ§€λ₯Ό λ¦¬ν„΄ν•œλ‹€.

풀이


DP 둜 해결‼️

3차원 λ°°μ—΄λ‘œ μ„ μ–Έ

πŸ‘‰ dp[i][j][0] = (i, j)에 μœ„ μΉΈμ—μ„œ 올 수 μžˆλŠ” 경둜의 수

πŸ‘‰ dp[i][j][1] = (i, j)에 μ™Όμͺ½ μΉΈμ—μ„œ 올 수 μžˆλŠ” 경둜의 수

 

첫 행은 μžλ™μ°¨ 톡행 κΈˆμ§€ 칸을 μ œμ™Έν•˜κ³ λŠ” μ™Όμͺ½ ➑️ 였λ₯Έμͺ½ 만 κ°€λŠ₯ν•˜κΈ° λ•Œλ¬Έμ— [0][i][1] = 1 둜 μ΄ˆκΈ°ν™”

첫 열은 μžλ™μ°¨ 톡행 κΈˆμ§€ 칸을 μ œμ™Έν•˜κ³ λŠ” μœ„ ➑️ μ•„λž˜ 만 κ°€λŠ₯ν•˜κΈ° λ•Œλ¬Έμ— [i][0][0] = 1 둜 μ΄ˆκΈ°ν™”

 

cityMap[1][1] λΆ€ν„° cityMap[m-1][n-1] κΉŒμ§€ μ§„ν–‰ν•œλ‹€. 

였λ₯Έμͺ½ λ˜λŠ” μ•„λž˜ λ°©ν–₯으둜만 이동할 수 있기 λ•Œλ¬Έμ— [i-1][j] 와 [i][j-1] 을 확인‼️

μ½”λ“œ


    static int MOD = 20170805;
    public static int solution(int m, int n, int[][] cityMap) {

        int[][][] dp = new int[m][n][2];    // 0 : μœ„ 1 : μ™Όμͺ½

        dp[0][0][0] = 1;
        dp[0][0][1] = 1;

        // 첫 ν–‰ μ΄ˆκΈ°ν™” -> μ™Όμͺ½μ—μ„œλ§Œ 올 수 있음
        for(int i = 1; i < n ; i++){
            if(cityMap[0][i] != 1)
                dp[0][i][1] = dp[0][i-1][1];
        }
        // 첫 μ—΄ μ΄ˆκΈ°ν™” -> μœ„μ—μ„œλ§Œ 올 수 있음
        for(int i = 1; i < m ;i++){
            if(cityMap[i][0] != 1)
                dp[i][0][0] = dp[i-1][0][0];
        }

        for(int i = 1; i < m ; i++){
            for(int j = 1; j < n ; j++){
                // μœ— μΉΈ
                if(cityMap[i-1][j] != 1){
                    // 쒌/μš°νšŒμ „ λΆˆκ°€ -> κ·ΈλŒ€λ‘œ μœ— μΉΈ
                    if(cityMap[i-1][j] == 2)
                        dp[i][j][0] = (dp[i-1][j][0] % MOD);
                    // νšŒμ „ κ°€λŠ₯
                    else
                        dp[i][j][0] = (dp[i-1][j][0] + dp[i-1][j][1]) % MOD;
                }

                // μ™Όμͺ½ μΉΈ
                if(cityMap[i][j-1] != 1){
                    if(cityMap[i][j-1] == 2)
                        dp[i][j][1] = dp[i][j-1][1];
                    else
                        dp[i][j][1] = (dp[i][j-1][0] + dp[i][j-1][1]) % MOD;
                }
            }
        }

        return (dp[m-1][n-1][0] + dp[m-1][n-1][1]) % MOD;
    }

 

728x90
λ°˜μ‘ν˜•