알고리즘

프로그래머스 등굣길 (JAVA)

박카스마시며코딩 2022. 6. 30. 11:56

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

 

코딩테스트 연습 - 등굣길

계속되는 폭우로 일부 지역이 물에 잠겼습니다. 물에 잠기지 않은 지역을 통해 학교를 가려고 합니다. 집에서 학교까지 가는 길은 m x n 크기의 격자모양으로 나타낼 수 있습니다. 아래 그림은 m =

programmers.co.kr

 

저는 해당 문제를 DP를 이용하여 문제를 해결하였습니다.

DP를 통해 이전에 계산한 값을 다시 계산하지 않도록 하였습니다.

혹시 런타임에러가 나오신다면 물이 잠긴 지역의 좌표가 (가로,세로) 입니다.
(저는 이것때문에 계속 런타임에러를 일으켰습니다.)

 

import java.util.*;
class Solution {
    private static final int LIMIT = 1_000_000_007;
    private static final int[] DY = {1,0};
    private static final int[] DX = {0,1};
    private static final boolean EMPTY = false;
    private static final boolean WATER = true;
    private static final int NOT_VALID = -1;
    public int solution(int m, int n, int[][] puddles) {
        int answer = 0;
        boolean[][] map = new boolean[n][m];
        int[][] dp = new int[n][m];
        for(int i = 0  ;i < n ; i++){
            Arrays.fill(dp[i], NOT_VALID);
        }
        for(int[] puddle : puddles){
            int y = puddle[1] -1;
            int x = puddle[0] -1;
            map[y][x] = WATER;
        }
        answer = dfs(0,0,n,m,map,dp);
        return answer;
    }
    private int dfs(int y,int x,int n,int m,boolean[][] map,int[][]dp){
        if(y == n-1 && x == m-1){
            return 1;
        }
        if(map[y][x] == WATER){
            return 0;
        }
        if(dp[y][x] != NOT_VALID){
            return dp[y][x];
        }
        int result = 0;
        for(int i = 0 ; i < 2; i++){
            int ny = y + DY[i];
            int nx = x + DX[i];
            if(checkBound(ny,nx,n,m)){
                result += dfs(ny,nx,n,m,map,dp);
                result %= LIMIT;
            }
        }
        dp[y][x] = result;
        return result;
    }
    private boolean checkBound(int y,int x,int n,int m){
        if(y >= 0 && y < n && x >= 0 && x < m){
            return true;
        }
        return false;
    }
}