본문 바로가기
코딩일기/알고리즘

[프로그래머스 : 레벨 3] 등굣길 : Dynamic Programing(Java)

by 욱파이어니어 2021. 6. 17.
728x90
반응형

이번 문제도 DP 알고리즘을 적용하니 금방 풀리는 문제였다.

문제 자체에서 가로세로의 변수 설정 부분이 이상해서 자꾸 틀려서 한번 가로와 세로 변수를 바꾸니

금방 적용이 잘되었다.

 

문제를 살펴보자.

 

문제 설명

 

계속되는 폭우로 일부 지역이 물에 잠겼습니다. 물에 잠기지 않은 지역을 통해 학교를 가려고 합니다. 집에서 학교까지 가는 길은 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

 

입출력 예 설명

 

문제풀이

집에서 학교까지 물웅덩이를 피해서 갈수있는 경로의 개수를 구하는것이다.

 

 

이번 문제는 문제 자체에서 가로세로가 약간 문제가 있다.

그래서 마지막에 최단경로의 개수를 1,000,000,007로 나눈 나머지를 return 하라는 이유가 m과 n의 index가

잘못 설정되어 있어서 그렇다고 했다.

 

그래서 맞게 테스트케이스를 다 맞게 설정했는데도 불구하고 저 나머지를 return을 마지막 결과값에다가만 적용하니

문제가 생겼었다.

근데 매번 경로 개수 설정하는 부분에 저 식을 적용하니 문제가 금방 해결되었다.

 

이번 문제도 피보나치수를 구하는 것과 비슷한 방식으로 문제를 풀었다.

그래서 소스에대한 설명은 따로 하지않고 피보나치 알고리즘 링크를 걸어둘테니 모르시는 분들은 확인해보면 될것 같다.

 

import java.util.*;
class Solution {
    public int solution(int m, int n, int[][] puddles) {
        int answer = 0;
        
        int[][] arr = new int [n][m];
        
        for(int i = 0;i<puddles.length;i++) {
        	int hi = puddles[i][1];
        	int width = puddles[i][0];
        	arr[hi-1][width-1] = 101;
        }
        answer = checkP(0,1,arr) + checkP(1,0,arr);
        answer %= 1000000007;
        return answer;
    }
    
    public int checkP(int hi,int width, int[][] arr) {
        
    	int wl = arr[0].length;
    	int hl = arr.length;
    	
    	if(arr[hi][width] == 101) {
    		return 0;
    	}else {
    		if(hi == hl-1 && width == wl-1 ) {
    			return 1;
    		}else {
    			if(arr[hi][width] != 0) {
    				return arr[hi][width];
    			}else {
	 	    		if(hi == hl-1) {
		    			return arr[hi][width] = checkP(hi,width+1,arr);
		    		}
		    		if(width == wl-1) {
		    			return arr[hi][width] = checkP(hi+1,width,arr);
		    		}else {
		    			return arr[hi][width] = (checkP(hi+1,width,arr) + checkP(hi,width+1,arr)) % 1000000007;
		    		}   				
    			}

    		}

    	}
    }
}

 

 

느낀점

1. 문제를 자세히 살펴보고 긴가 민가한 부분은 일단 소스를 짜고 틀린다면 헷갈렷던 부분을 수정하자.

2. 문제를 읽고 차근차근히 문제가 말하는 요구사항대로  그림을 그려보자.

반응형