카테고리 없음

(1,1)→(M,N)까지 가는 길의 경우의 수

건이두 2019. 12. 4. 20:15
728x90

(1,1)→(M,N)까지 가는 길의 경우의 수 를 찾는 문제입니다.

아래 영상의 1분~5분에서 이 문제에 대해서 설명하고 있습니다.
https://www.youtube.com/watch?v=krZI60lKPek&feature=share

자세한 내용은 아래 코드 참고하시구요, github 링크는 여기 → Java Source Link!!

package com.tistory.skysign.MITOpenCourseWare.R5_Dynamic_Programming;

public class Main {
//    https://www.youtube.com/watch?v=krZI60lKPek&feature=share
//    동영상에서 4분 후반에 설명하는 첫 DP 문제를 실제 구현하면 아래와 같습니다.

//  [i][j] 로 오는 unique한 길의 수는 좌측/상단의 값을 더한 숫자 입니다.
//  [i-1][j] + [i][j-1] -> [i][j]
    public static int uniqueNumberOfPathes(int i, int j, int[][] a) {
        return a[i-1][j] + a[i][j-1];
    }

    public static void printPathes(int[][] a) {
        for(int i=0; i<a.length; ++i) {
            for(int j=0; j<a[0].length; ++j) {
                System.out.printf("%3d ", a[i][j]);
            }
            System.out.println();
        }
        System.out.println();
    }

    public static void main(String[] args) {
//    동영상에서는 좌측 하단에서 우측 상단으로 우측과, 위로 가는 방향만 사용해서
//    1,1 에서 M,N까지 가는 unique한 길의 숫자를 DP를 통해서 계산합니다.
//    구현을 좀 쉽게 하기 위해서, 2개의 조건을 변경합니다.
//    - 동영상의 좌표계를 90도 시계방향으로 회전합니다.
//    - 1,1 부터 시작하지 않고, 0,0 에서 시작하겠습니다.
        int M = 5, N = 5;
        int[][] a = new int[M][N];

//      마찬가지로 M 이 0 이면, unique한 path는 1개 뿐입니다.
        for(int j=1; j<N; ++j)
            a[0][j] = 1;

//      N 이 0 이면, unique한 path는 1개 뿐입니다.
        for(int i=1; i<M; ++i)
            a[i][0] = 1;

        printPathes(a);

//      모든 점으로 이동 가능한 unique한 경우의 수를 계산하면 아래와 같습니다.
        for(int i=1; i<M; ++i) {
            for(int j=1; j<N; ++j) {
                a[i][j] = uniqueNumberOfPathes(i, j, a);
            }
        }

        printPathes(a);
    }
}
728x90