[Programmers]등굣길(java/lv3)

Mijeong Ryu·2023년 6월 17일
0

Programmers

목록 보기
31/50

문제

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

아래 그림은 m = 4, n = 3 인 경우입니다.

가장 왼쪽 위, 즉 집이 있는 곳의 좌표는 (1, 1)로 나타내고 가장 오른쪽 아래, 즉 학교가 있는 곳의 좌표는 (m, n)으로 나타냅니다.

격자의 크기 m, n과 물이 잠긴 지역의 좌표를 담은 2차원 배열 puddles이 매개변수로 주어집니다. 오른쪽과 아래쪽으로만 움직여 집에서 학교까지 갈 수 있는 최단경로의 개수를 1,000,000,007로 나눈 나머지를 return 하도록 solution 함수를 작성해주세요.

제한사항
격자의 크기 m, n은 1 이상 100 이하인 자연수입니다.
m과 n이 모두 1인 경우는 입력으로 주어지지 않습니다.
물에 잠긴 지역은 0개 이상 10개 이하입니다.
집과 학교가 물에 잠긴 경우는 입력으로 주어지지 않습니다.
입출력 예
m n puddles return
4 3 [[2, 2]] 4
입출력 예 설명

코드

import java.util.*;
class Solution {
    public int solution(int m, int n, int[][] puddles) {
        int answer = 0;
        int[][] dp = new int [n][m];
        

       int x =0; int y= 0;
        for(int i=0; i<puddles.length; i++){
               x =  puddles[i][0] -1;
               y =  puddles[i][1] -1;
               dp[y][x] = -1;            
        }
        
        for(int i=0; i<n; i++){
            for(int j=0; j<m; j++){
                if(dp[i][j] == -1){
                    dp[i][j] = 0;
                    continue;
                }
                else if(i==0 && j ==0){
                    dp[0][0] = 1;
                }
                else if(i==0){ //위가 없는 경우
                    dp[i][j] = dp[i][j-1] % 1000000007 ;
                }
                else if(j==0){ //왼쪽이 없는 경우
                    dp[i][j] = dp[i-1][j] % 1000000007;
                }
                else{ //중간
                    dp[i][j] = (dp[i-1][j] + dp[i][j-1])  % 1000000007 ;    
                }
                }
        }
        answer = dp[n-1][m-1] ;
        return answer;
    }
}

풀이

DP를 이용해서 풀었다. 주의할 점은 puddles의 좌표가 (x,y)라면 실제 길찾기 좌표에서는
(y,x)로 표현해주어야한다. (입출력 예시로 (2,2)가 들어가 있어서 착각했다.. (2,2)는 x,y좌료파 같으니까 ㅠㅠ)
그리고 답을 % 1000000007 한 값을 리턴해야하는데,
맨 마지막에서 처리할 경우 시간에러에 걸린다.
그래서 각 dp에 값을 넣을 때 , % 1000000007 을 처리해준다.
(모든 수를 더하고 나누나, 각각 나눈 수를 더하나 결과가 같으니까)

0개의 댓글