1. 문제

2. 문제 풀이

dp 배열을 먼저 초기화 하는데, 0행과 0열에 물웅덩이가 있으면 그 다음 지역으로는 갈 수 없으므로 0으로 초기화 된 값을 남겨둔다. 그리고 물웅덩이가 없을때가지 1로 초기화를 해준다. dp 배열을 채울때 물웅덩이가 있으면 0으로 바꿔주고, 나머지 경우는 코드를 참고하면 쉽게 이해할 수 있다.

class Solution {

    private static int dp[][];

    public static void calculateDp(int m, int n){

        for(int i=0;i<n;i++){
            for(int j=0;j<m;j++){
                if(i == 0 && j == 0){
                    dp[i][j] = 0;
                } else if(dp[i][j] == -1){
                    dp[i][j] = 0;
                } else if(i != 0 && j != 0){
                    dp[i][j] = (dp[i-1][j] + dp[i][j-1]) % 1000000007;
                }
            }
        }
    }

    public static void initDp(int m, int n, int[][] puddles){

        //물웅덩이 초기화
        for(int i=0;i<puddles.length;i++){
            dp[puddles[i][1]-1][puddles[i][0]-1] = -1;
        }

        //0행 초기화
        for(int i=0;i<m;i++){
            if(dp[0][i] != -1)
                dp[0][i] = 1;
            else {
                break;
            }
        }

        //0열 초기화
        for(int i=0;i<n;i++){
            if(dp[i][0] != -1)
                dp[i][0] = 1;
            else {
                break;
            }
        }

    }

    public static int solution(int m, int n, int[][] puddles) {

        dp = new int[n][m];
        initDp(m,n,puddles);

        calculateDp(m,n);

        int answer = dp[n-1][m-1];

        return answer;
    }

    public static void main(String[] args) throws Exception{
        int m = 4;
        int n = 3;
        int[][] puddles = {{2,2}};
        solution(m,n,puddles);
    }
}
  • 네이버 블러그 공유하기
  • 네이버 밴드에 공유하기
  • 페이스북 공유하기
  • 카카오스토리 공유하기