[JAVA/프로그래머스] 동적계획법(Dynamic Programming)_등굣길

👀 문제

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

👊 도전

1. 설계

  1. 최단거리 구하는 방법을 적용한다.

2. 구현 (성공 코드)

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
import java.util.*;
/**
 *
 * @author HEESOO
 *
 */
 class Solution {
    public int solution(int m, int n, int[][] puddles) {
        int answer = 0;
        int[][] route=new int[n][m];
        for(int[] row:puddles){//웅덩이 설정
            route[row[1]-1][row[0]-1]=-1;
        }
        route[0][0]=1;//시작값 초기화
        for(int i=0;i<n;i++){
            for(int j=0;j<m;j++){
                if(route[i][j]==-1){//웅덩이는 0으로 변경
                    route[i][j]=0;
                }
                else{//웅덩이가 아니라면
                    if(i-1>=0){//왼쪽 값을 가져올 수 있다면
                        route[i][j]+=route[i-1][j]%1000000007;
                    }
                    if(j-1>=0){//위 값을 가져올 수 있다면
                        route[i][j]+=route[i][j-1]%1000000007;
                    }
                }
                if(i==n-1&&j==m-1){//목적지에 도착했다면
                    answer=route[i][j]%1000000007;
                }
            }
        }
        return answer;
    }
}

3. 결과

실행결과 🤟 성공 🤟

4. 설명

  1. 최단거리 구하는 방법을 적용한다.
    실행결과
    • 시작점을 포함한 행 열은 1로 초기화한다.
    • 웅덩이는 -1로 표시한다.
    • 현재 위치의 값은 왼쪽값+윗쪽값이다.
  2. 마지막에서만 1,000,000,007로 나누면 효율성 테스트에서 시간 초과가 난다.
    • 마지막 행에서 여러 경로에 대한 결과값이 저장되므로 이들 중 최댓값이 answer이다.
    • 정확한 이유는 잘 모르겠지만, 큰 값을 더하는 계속 더하는 것보다 그때그때 특정 값으로 나눈 나머지를 사용하여 값을 간단히 하는게 효율적이어서 그런게 아닐까 싶다.

👏 해결 완료!

문제 풀이법을 알면 코딩하는 것은 그렇게 어렵지는 않지만 그 풀이법을 생각해내는 것이 어렵다. 초등학교때 배운 이 방법을 기억하고 있지 않았더라면 이 문제를 해결하기 위해 얼마나 많은 시간을 투자했어야 할지..