개발 블로그
article thumbnail

 

아이디어

두 좌표 간에 최단 거리로 가는 방법은 (H, H) ~ (N, N) 범위 내에서만 움직이는 것이다. 

 

ex) (4, 4) ~ (8, 8)

? ? ? ? ? ? ? ? ?

? ? ? ? ? ? ? ? ?

? ? ? ? ? ? ? ? ?

? ? ? ? ? ? ? ? ?

? ? ? ? o o o o o

? ? ? ? o o o o o

? ? ? ? o o o o o

? ? ? ? o o o o o

? ? ? ? o o o o o

 

어차피 해당 범위 내에서만 움직인다면 (0, 0) ~ (4, 4) 랑 똑같으므로 이 점을 활용해서 

배열의 크기를 |H - N| + 1 로 선언한다.

 

추가로 (H, H) ~ (N, N) 으로 가는 경로의 개수나 (N, N) ~ (H, H) 로 가는 경로의 개수나 동일하므로

(0, 0) ~ (|H-N|, |H-N|) 까지 가는 경로의 개수를 구하면 정답이 된다.

 

dp[i][j] 를 (0, 0) 에서 (i, j) 까지 가는 경로의 개수라고 정의한다면 j > i 인 곳은 침수상태이므로

 

1 0 0   0   0

1 1 0   0   0

1 2 2   0   0

1 3 5   5   0

1 4 9 14 14

 

dp[i][j] = dp[i - 1][j] + dp[i][j - 1]

 

이라는 점화식을 얻을 수 있다.

 

 

풀이코드

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.StringTokenizer;

public class Main {

    public static void main(String[] args) throws IOException {
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        StringTokenizer st = new StringTokenizer(br.readLine());

        int H = Integer.parseInt(st.nextToken());
        int N = Integer.parseInt(st.nextToken());

        int size = Math.abs(H - N) + 1;
        long[][] dp = new long[size][size];
        dp[0][0] = 1;

        for (int i = 1; i < size; i++) {
            for (int j = 0; j <= i; j++) {
                if (j == 0) {
                    dp[i][j] = 1;
                } else {
                    dp[i][j] = dp[i - 1][j] + dp[i][j - 1];
                }
            }
        }

        System.out.println(dp[size - 1][size - 1]);
    }
}

'Algorithm > 백준 알고리즘' 카테고리의 다른 글

2644번. 촌수계산  (0) 2023.11.02
1946번. 신입 사원  (0) 2023.11.02
16401번. 과자 나눠주기  (0) 2023.11.01
1080번. 행렬  (1) 2023.11.01
2876번. 그래픽스 퀴즈  (1) 2023.11.01
profile

개발 블로그

@하얀.손

포스팅이 좋았다면 "좋아요❤️" 또는 "구독👍🏻" 해주세요!