๐ŸšŒํ”„๋กœ๊ทธ๋ž˜๋จธ์Šค : ๋“ฑ๊ตฃ๊ธธ

๊ธ๊ธยท2025๋…„ 11์›” 16์ผ

์•Œ๊ณ ๋ฆฌ์ฆ˜

๋ชฉ๋ก ๋ณด๊ธฐ
25/31

๐ŸŠ๋ฌธ์ œ

ํ”„๋กœ๊ทธ๋ž˜๋จธ์Šค : ๋“ฑ๊ตฃ๊นƒ

๊ณ„์†๋˜๋Š” ํญ์šฐ๋กœ ์ผ๋ถ€ ์ง€์—ญ์ด ๋ฌผ์— ์ž ๊ฒผ์Šต๋‹ˆ๋‹ค. ๋ฌผ์— ์ž ๊ธฐ์ง€ ์•Š์€ ์ง€์—ญ์„ ํ†ตํ•ด ํ•™๊ต๋ฅผ ๊ฐ€๋ ค๊ณ  ํ•ฉ๋‹ˆ๋‹ค. ์ง‘์—์„œ ํ•™๊ต๊นŒ์ง€ ๊ฐ€๋Š” ๊ธธ์€ m x n ํฌ๊ธฐ์˜ ๊ฒฉ์ž๋ชจ์–‘์œผ๋กœ ๋‚˜ํƒ€๋‚ผ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

์•„๋ž˜ ๊ทธ๋ฆผ์€ m = 4, n = 3 ์ธ ๊ฒฝ์šฐ์ž…๋‹ˆ๋‹ค.
๊ฐ€์žฅ ์™ผ์ชฝ ์œ„, ์ฆ‰ ์ง‘์ด ์žˆ๋Š” ๊ณณ์˜ ์ขŒํ‘œ๋Š” (1, 1)๋กœ ๋‚˜ํƒ€๋‚ด๊ณ  ๊ฐ€์žฅ ์˜ค๋ฅธ์ชฝ ์•„๋ž˜, ์ฆ‰ ํ•™๊ต๊ฐ€ ์žˆ๋Š” ๊ณณ์˜ ์ขŒํ‘œ๋Š” (m, n)์œผ๋กœ ๋‚˜ํƒ€๋ƒ…๋‹ˆ๋‹ค.

๊ฒฉ์ž์˜ ํฌ๊ธฐ m, n๊ณผ ๋ฌผ์ด ์ž ๊ธด ์ง€์—ญ์˜ ์ขŒํ‘œ๋ฅผ ๋‹ด์€ 2์ฐจ์› ๋ฐฐ์—ด puddles์ด ๋งค๊ฐœ๋ณ€์ˆ˜๋กœ ์ฃผ์–ด์ง‘๋‹ˆ๋‹ค. ์˜ค๋ฅธ์ชฝ๊ณผ ์•„๋ž˜์ชฝ์œผ๋กœ๋งŒ ์›€์ง์—ฌ ์ง‘์—์„œ ํ•™๊ต๊นŒ์ง€ ๊ฐˆ ์ˆ˜ ์žˆ๋Š” ์ตœ๋‹จ๊ฒฝ๋กœ์˜ ๊ฐœ์ˆ˜๋ฅผ 1,000,000,007๋กœ ๋‚˜๋ˆˆ ๋‚˜๋จธ์ง€๋ฅผ return ํ•˜๋„๋ก solution ํ•จ์ˆ˜๋ฅผ ์ž‘์„ฑํ•ด์ฃผ์„ธ์š”.

์ž…์ถœ๋ ฅ ์˜ˆ

m : 4
n : 3
puddles : [[2, 2]]
return : 4

๐ŸŠํ’€์ด

์ดˆ๊ธฐ ์ ‘๊ทผ

์ฒ˜์Œ์—๋Š” ์ตœ์†Œ ๊ฒฝ๋กœ๋ฅผ ๊ตฌํ•˜๋Š” ๋ฌธ์ œ๋‹ˆ๊นŒ bfs๋กœ ํ’€์–ด์•ผํ•˜๋‚˜..? ํ–ˆ๋‹ค.
๊ทผ๋ฐ ๋ฌธ์ œ์˜ ์š”๊ตฌ์‚ฌํ•ญ์ด '์ตœ์†Œ๊ฒฝ๋กœ'๊ฐ€ ์•„๋‹ˆ๋ผ '์ตœ๋‹จ๊ฒฝ๋กœ์˜ ๊ฐœ์ˆ˜'์ด๊ธฐ ๋•Œ๋ฌธ์—, ๊ฒฝ๋กœ์˜ ์ˆ˜๋ฅผ ๋ˆ„์ ํ•ด์„œ ๊ณ„์‚ฐํ•˜๋Š” DP๋กœ ํ’€์–ด์•ผ ํ•จ์Œ ์•Œ์•˜๋‹ค.

๋ฌธ์ œ ๋ถ„์„

์ด ๋ฌธ์ œ๋Š” ๋‹ค๋ฅธ dp ๋ฌธ์ œ์™€ ๋‹ค๋ฅธ ์ ์ด ๋ช‡ ๊ฐ€์ง€ ์žˆ๋‹ค.

1. ์žฅ์• ๋ฌผ '์šฐ๋ฌผ'๐Ÿ’ฆ

์ค‘๊ฐ„์— ์ง€๋‚˜๊ฐˆ ์ˆ˜ ์—†๋Š” ๊ธธ์ธ '์šฐ๋ฌผ'์ด ์กด์žฌํ•œ๋‹ค. ๋”ฐ๋ผ์„œ ๊ฒฝ๋กœ์˜ ์ˆ˜๋ฅผ ๊ตฌํ•  ๋•Œ, ํ•ด๋‹น ์šฐ๋ฌผ์„ ์ง€๋‚˜๊ฐ€๋Š” ๊ฒฝ๋กœ๋Š” ์นด์šดํŠธํ•˜์ง€ ์•Š๋„๋ก ์ฒ˜๋ฆฌํ•œ๋‹ค.

2. ์˜ค๋ฅธ์ชฝ๊ณผ ์•„๋ž˜์ชฝ์œผ๋กœ๋งŒ ์›€์ง์ผ ์ˆ˜ ์žˆ๋‹ค.

๋ณดํ†ต์€ 4๋ฐฉํ–ฅ ํƒ์ƒ‰, 8๋ฐฉํ–ฅ ํƒ์ƒ‰์ด ์ผ๋ฐ˜์ ์ด์ง€๋งŒ ์ด ๋ฌธ์ œ๋Š” ์˜ค๋ฅธ์ชฝ๊ณผ ์•„๋ž˜์ชฝ์œผ๋กœ๋งŒ ์ด๋™ํ•  ์ˆ˜ ์žˆ๋‹ค.
๊ทธ๋Ÿฌ๋ฏ€๋กœ, ํ˜„์žฌ์œ„์น˜๊นŒ์ง€์˜ ๊ฒฝ๋กœ์˜ ์ˆ˜๋Š” ํ˜„์žฌ์œ„์น˜์—์„œ ํ•œ์นธ ์™ผ์ชฝ์˜ ๊ฒฝ๋กœ์˜ ์ˆ˜ + ํ˜„์žฌ์œ„์น˜์—์„œ ํ•œ์นธ ์œ„์ชฝ์˜ ๊ฒฝ๋กœ์ˆ˜๊ฐ€ ๋œ๋‹ค.

3. ์ถœ๋ ฅ์š”๊ตฌ

"์ตœ๋‹จ๊ฒฝ๋กœ์˜ ๊ฐœ์ˆ˜๋ฅผ 1,000,000,007๋กœ ๋‚˜๋ˆˆ ๋‚˜๋จธ์ง€๋ฅผ returnํ•ด์•ผ ํ•œ๋‹ค."

์ž์นซํ•˜๋ฉด ์ด ๊ณผ์ •์—์„œ ๋ฒ”์œ„ ์ดˆ๊ณผ๊ฐ€ ๋‚  ์ˆ˜ ์žˆ์œผ๋‹ˆ ์ด ๋ถ€๋ถ„์„ ์ž˜ ๊ณ ๋ คํ•ด์•ผ ํ•œ๋‹ค.

ํ’€์ด ๊ณผ์ •

1. MOD ๋ณ€์ˆ˜ ์ƒ์„ฑ, dp ๋ฐฐ์—ด ์ƒ์„ฑ

		//returnํ•  ๋•Œ ํ•„์š”ํ•œ ๋ณ€์ˆ˜ ์ƒ์„ฑ
        int MOD = 1_000_000_007;
        
        //์ง‘๊นŒ์ง€ ๊ฐˆ ์ˆ˜ ์žˆ๋Š” ๊ฒฝ๋กœ์˜ ์ˆ˜๋ฅผ ์ €์žฅํ•˜๋Š” dp๋ฐฐ์—ด ๋งŒ๋“ค๊ธฐ
        //๋„์ฐฉ์ง€์ ์ด (m, n)์ด๊ธฐ ๋•Œ๋ฌธ์— ๋ฒ”์œ„๋ฅผ +1์”ฉ ์ง€์ •ํ•˜๊ธฐ
        int[][] dp = new int[n+1][m+1];
      

2. ์šฐ๋ฌผ์ด ์žˆ๋Š” ๊ณณ ํ‘œ์‹œ

  
        //์šฐ๋ฌผ์ด ์žˆ๋Š” ๊ณณ์€ ๊ฒฝ๋กœ๋ฅผ ๊ณ„์‚ฐํ•  ์ˆ˜ ์—†์œผ๋ฏ€๋กœ -1๋กœ ์ฑ„์šฐ๊ธฐ
        for (int i = 0 ; i < puddles.length; i++) {
            int x = puddles[i][0];
            int y = puddles[i][1];
            
            dp[y][x] = -1; //์ธ๋ฑ์Šค ์ˆœ์„œ ์ฃผ์˜! [x][y]๋กœ ํ•˜๋ฉด ํ‹€๋ฆผ
        }

๐Ÿšจ์—ฌ๊ธฐ์„œ ์ฃผ์˜ํ•  ์ 
๋ฌธ์ œ์—์„œ ์œ„์น˜ ํ‘œ์‹œ๋ฅผ 2์ฐจ์› ๊ฒฉ์ž ์œ„์— ํ‘œ์‹œํ•˜๊ณ  ์žˆ๋Š”๋ฐ, ์ด๋Š” ์ฝ”๋”ฉํ•  ๋•Œ 2์ฐจ์› ๋ฐฐ์—ด๊ณผ์˜ x, y ์ขŒ๋ฃŒ๊ฐ€ ๋ฐ˜๋Œ€์ด๊ธฐ ๋•Œ๋ฌธ์— ์ด ๋ถ€๋ถ„์„ ์กฐ์‹ฌํ•˜๋„๋ก ํ•˜์ž

๋นจ๊ฐ„์ƒ‰ ๋ถ€๋ถ„์€ 2์ฐจ์› ๋ฐฐ์—ด์—์„œ๋Š” [1, 2]๋กœ ๋‚˜ํƒ€๋‚ด์ง€๋งŒ ๋ฌธ์ œ์—์„œ๋Š” [2, 1] ๊ฐ™์ด ๋ฐ˜๋Œ€๋กœ ๋‚˜ํƒ€๋‚ด๊ธฐ ๋•Œ๋ฌธ์— ์กฐ์‹ฌํ•  ๊ฒƒ

3. ๋ฐฐ์—ด์„ ๋Œ๋ฉด์„œ ๊ฒฝ๋กœ์˜ ์ˆ˜ ํƒ์ƒ‰ํ•˜๊ธฐ

        //์‹œ์ž‘์ง€์ ์€ ๊ฒฝ๋กœ์˜ ๊ฐœ์ˆ˜๊ฐ€ 1์ด๋ฏ€๋กœ 1๋กœ ์ฒ˜๋ฆฌ
        dp[1][1] = 1;
        
        //2์ฐจ์› ๋ฐฐ์—ด ๋Œ๊ธฐ
        for (int i = 1;  i < n +1; i++) {
            for (int j = 1; j < m + 1; j++) {
                //์‹œ์ž‘์ง€์ ์ด๋ผ๋ฉด ๋„˜์–ด๊ฐ€๊ธฐ
                if (i == 1 && j == 1) continue;
                //์šฐ๋ฌผ์„ ๋งŒ๋‚ฌ๋‹ค๋ฉด ๋„˜์–ด๊ฐ€๊ธฐ
                if (dp[i][j] == -1) continue;
            
                int down_path = dp[i - 1][j];
                int right_path = dp[i][j-1];
                
                //์šฐ๋ฌผ์„ ๋งŒ๋‚ฌ์„ ๋•Œ์˜ ์ฒ˜๋ฆฌ๋ฐฉ์‹
                if (down_path == -1) {
                    down_path = 0;
                } else if (right_path == -1){
                    right_path = 0;
                }
                
                //ํ˜„์žฌ ์œ„์น˜์˜ ๊ฒฝ๋กœ์˜ ์ˆ˜๋Š” ์™ผ์ชฝ ๊ฒฝ๋กœ์˜ ์ˆ˜ + ์œ„์ชฝ ๊ฒฝ๋กœ์˜ ์ˆ˜ 
                dp[i][j] = (down_path + right_path) % MOD;
            }
        }

โญ๏ธ์ค‘์š”ํ•œ ์ง€์ 
๋ฌธ์ œ์—์„œ ๋„์ฐฉ์ง€์ ์˜ ๊ฒฝ๋กœ์˜ ์ˆ˜์—์„œ 1_000_000_007์„ ๋‚˜๋ˆˆ ๋‚˜๋จธ์ง€๋ฅผ ์ถœ๋ ฅํ•˜๋ผ๊ณ  ํ–ˆ๋‹ค.
๋งŒ์•ฝ dp ๋ฐฐ์—ด์„ ๋‹ค ๋Œ๊ณ  ๋„์ฐฉ์ง€์ ์—์„œ MOD๋ฅผ ๋‚˜๋ˆ„๋ฉด int ๋ฒ”์œ„๋ฅผ ๋ฒ—์–ด๋‚  ์ˆ˜ ์žˆ๊ธฐ ๋•Œ๋ฌธ์— ๋งค ๊ฒฝ๋กœ๋ฅผ ๊ตฌํ•  ๋•Œ๋งˆ๋‹ค MOD๋ฅผ ๋‚˜๋ˆ„์–ด ์ €์žฅํ•ด์ฃผ๋Š” ๊ฒŒ ์•ˆ์ „ํ•˜๋‹ค.

4. return ํ•˜๊ธฐ

๋„์ฐฉ์ง€์ ์˜ dp์˜ ๊ฐ’์„ return ํ•˜๋ฉด ์ตœ๋‹จ๊ฒฝ๋กœ์˜ ๊ฐœ์ˆ˜๋ฅผ ๊ตฌํ•  ์ˆ˜ ์žˆ๋‹ค!

        answer = dp[n][m];
        
        
        return answer;

๐ŸŠ์ „์ฒด์ฝ”๋“œ

class Solution {
    public int solution(int m, int n, int[][] puddles) {
        int answer = 0;
        int MOD = 1_000_000_007;
        
        //์˜ค๋ฅธ์ชฝ๊ณผ ์•„๋ž˜์ชฝ์œผ๋กœ๋งŒ ์›€์ง์ผ ์ˆ˜ ์žˆ๋‹ค.
        //์ง‘๊นŒ์ง€ ๊ฐˆ ์ˆ˜ ์žˆ๋Š” ๊ฒฝ๋กœ์˜ ์ˆ˜๋ฅผ ์ €์žฅํ•˜๋Š” dp๋ฐฐ์—ด ๋งŒ๋“ค๊ธฐ
        int[][] dp = new int[n+1][m+1];
        //์šฐ๋ฌผ์ด ์žˆ๋Š” ๊ณณ์€ ๊ฒฝ๋กœ๋ฅผ ๊ณ„์‚ฐํ•  ์ˆ˜ ์—†์œผ๋ฏ€๋กœ -1๋กœ ์ฑ„์šฐ๊ธฐ
        for (int i = 0 ; i < puddles.length; i++) {
            int x = puddles[i][0];
            int y = puddles[i][1];
            
            dp[y][x] = -1; //์ธ๋ฑ์Šค ์ˆœ์„œ ์ฃผ์˜! [x][y]๋กœ ํ•˜๋ฉด ํ‹€๋ฆผ
        }
        //์ฒซ๋ฒˆ์งธ ๊ฒฝ๋กœ 1์ฒ˜๋ฆฌ
        dp[1][1] = 1;
        
        //ํ˜„์žฌ๊นŒ์ง€์˜ ๊ฒฝ๋กœ์˜ ์ˆ˜๋Š”, ์™ผ์ชฝ ๊ฒฝ๋กœ ์ˆ˜์˜ + 1, ์œ„์˜ ๊ฒฝ๋กœ ์ˆ˜์˜ +1 ์ด๋‹ค.
        for (int i = 1;  i < n +1; i++) {
            for (int j = 1; j < m + 1; j++) {
                //์‹œ์ž‘์ง€์ ์ด๋ผ๋ฉด ๋„˜์–ด๊ฐ€๊ธฐ
                if (i == 1 && j == 1) continue;
                //์šฐ๋ฌผ์„ ๋งŒ๋‚ฌ๋‹ค๋ฉด ๋„˜์–ด๊ฐ€๊ธฐ
                if (dp[i][j] == -1) continue;
            
                int down_path = dp[i - 1][j];
                int right_path = dp[i][j-1];
                //์šฐ๋ฌผ์„ ๋งŒ๋‚ฌ์„ ๋•Œ์˜ ์ฒ˜๋ฆฌ๋ฐฉ์‹
                if (down_path == -1) {
                    down_path = 0;
                } else if (right_path == -1){
                    right_path = 0;
                }
                
                dp[i][j] = (down_path + right_path) % MOD;
            }
        }
        answer = dp[n][m];
        
        
        return answer;
    }
}

0๊ฐœ์˜ ๋Œ“๊ธ€