Post

[프로그래머스] 등굣길(Java)

문제 풀이

프로그래머스 등굣길 문제입니다. 문제 출처

(1) 문제 파악

1

최단 경로의 개수를 구하는 문제입니다.

(2) 문제 풀이 방법 생각하기

최단 경로 문제이며, 이동은 오른쪽 혹은 아래쪽으로 가능하니 DP를 활용해서 풀 수 있을 것 같은데요! 점화식은

\[dp[i][j] = dp[i-1][j] + dp[i][j-1]\]

로 세웠습니다.

여기서 주의할 점은 물 웅덩이의 좌표가 (m, n)으로 주어진다는 것입니다! (평소처럼 n,m 순서라고 생각했다가 10분동안 멍했네요..ㅎㅎ)

기본적으로 최단 경로의 개수를 구할 때에는 1열과 1행을 모두 1로 만들어놓고 점화식을 수행하는데요. 여기서는 물 웅덩이가 중간에 있을 수 있기 때문에 dp를 수행하기 전에 물 웅덩이 확인을 먼저 해줬습니다.

(4) 구현

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
37
38
39
40
class Solution {
    
    public int solution(int m, int n, int[][] puddles) {
        int[][] dp = new int[n+1][m+1];
        final int MOD = 1_000_000_007;
        
        for(int i=1; i<=m; i++) {
            dp[1][i] = 1;
        }
        
        for(int i=1; i<=n; i++) {
            dp[i][1] = 1;
        }
        
        for(int[] p:puddles) {
            if(p[0] == 1) {
                for(int i=p[1]; i<=n; i++) {
                    dp[i][1] = 0;
                }
            } else if(p[1] == 1) {
                for(int i=p[0]; i<=m; i++) {
                    dp[1][i] = 0;
                }
            } else {
                dp[p[1]][p[0]] = -1;
            }
        }
        
        for(int i=2;i<=n;i++) {
            for(int j=2; j<=m; j++) {
                if(dp[i][j] == -1) {
                    dp[i][j] = 0;
                    continue;
                } 
                dp[i][j] = (dp[i-1][j] + dp[i][j-1])%MOD;
            }
        }
        return dp[n][m]%MOD;
    }
}
This post is licensed under CC BY 4.0 by the author.

Comments