알고리즘/[ Baekjoon ]

[ BOJ ][JAVA][5569] 출근경로

kim.svadoz 2021. 4. 30. 16:36
반응형

www.acmicpc.net/problem/5569

 

5569번: 출근 경로

상근이가 사는 도시는 남북 방향으로 도로가 w개, 동서 방향으로 도로가 h개 있다.  남북 방향 도로는 서쪽부터 순서대로 번호가 1, 2, ..., w로 매겨져 있다. 또, 동서 방향 도로는 남쪽부터 순서대

www.acmicpc.net

시간 제한 메모리 제한 제출 정답 맞은 사람 정답 비율
1 초 128 MB 1531 620 505 43.422%

문제

상근이가 사는 도시는 남북 방향으로 도로가 w개, 동서 방향으로 도로가 h개 있다.

남북 방향 도로는 서쪽부터 순서대로 번호가 1, 2, ..., w로 매겨져 있다. 또, 동서 방향 도로는 남쪽부터 순서대로 번호가 1, 2, ..., h로 매겨져 있다. 서쪽에서 i번째 남북 방향 도로와 남쪽에서 j번째 동서 방향 도로가 만나는 교차로는 (i, j)이다.

상근이는 교차로 (1, 1)에 살고 있고, 교차로 (w, h)에 있는 회사에 차로 다니고 있다. 차는 도로로만 이동할 수 있다. 상근이는 회사에 최대한 빨리 가기 위해서, 동쪽 또는 북쪽으로만 이동할 수 있다. 또, 이 도시는 교통 사고를 줄이기 위해서 교차로를 돈 차량은 그 다음 교차로에서 다시 방향을 바꿀 수 없다. 즉, 교차로에서 방향을 바꾼 후, 1 블록만 이동한 후 다시 방향을 바꿀 수 없다.

상근이가 회사에 출근할 수 있는 경로의 수는 몇 가지 일까?

w와 h가 주어졌을 때, 가능한 출근 경로의 개수를 구하는 프로그램을 작성하시오.

입력

첫째 줄에 w와 h가 주어진다. (2 ≤ w, h ≤ 100)

출력

첫째 줄에 상근이가 출근할 수 있는 경로의 개수를 100000로 나눈 나머지를 출력한다.

예제 입력 1

3 4

예제 출력 1

5

코드

/*
    출근경로
    시간복잡도 : O(wh)
    기본적인 격자문제이므로 dp로 접근 시도
*/
import java.io.*;
import java.util.*;
public class p5569 {
    static final int MOD = 100000;
    static int w, h;
    public static void main(String[] args) throws Exception {
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        StringTokenizer st = new StringTokenizer(br.readLine());
        w = Integer.parseInt(st.nextToken());
        h = Integer.parseInt(st.nextToken());

        // dp = int[110][110][t][chk]
        // t : 현재 진행방향 (0 -> 동쪽, 1 -> 북쪽)
        // chk : 방향 변경 가능 여부 (0 -> 변경 불가능, 1 -> 변경 가능)
        // 이전경로에서 변경 불가능(chk 0)했다면 현재경로 변경 가능(chk 1), 불 가능(chk 0) 모두 허용된다.
        // 이전경로에서 변경 가능(chk 1)했다면 현재 경로에서는 변경 불가능(chk 0) 이어야 한다.
        int[][][][] dp = new int[110][110][2][2];

        for (int i = 2; i <= w; i++) {
            // 세로줄은 아래에서만 올 수 있고, 꺾이지 않았다.
            dp[i][1][0][0] = 1;
        }

        for (int i = 2; i <= h; i++) {
            // 가로줄은 왼쪽에서만 올 수 있고, 꺾이지 않았다.
            dp[1][i][1][0] = 1;
        }

        for (int i = 2; i <= w; i++) {
            for (int j = 2; j <= h; j++) {
                dp[i][j][0][0] = (dp[i-1][j][0][0] + dp[i-1][j][0][1]) % MOD;
                dp[i][j][1][0] = (dp[i][j-1][1][0] + dp[i][j-1][1][1]) % MOD;
                dp[i][j][0][1] = dp[i-1][j][1][0];
                dp[i][j][1][1] = dp[i][j-1][0][0];
            }
        }

        int ans = 0;
        for (int i = 0; i < 2; i++) {
            for (int j = 0; j < 2; j++) {
                ans += dp[w][h][i][j];
            }
        }
        System.out.println(ans % MOD);

    }
}
반응형

'알고리즘 > [ Baekjoon ]' 카테고리의 다른 글

[ BOJ ][JAVA][10824] 네 수  (0) 2021.05.01
[ BOJ ][JAVA][2493] 탑  (0) 2021.05.01
[ BOJ ][JAVA][1722] 순열의 순서  (0) 2021.04.30
[ BOJ ][JAVA][1010] 다리놓기  (0) 2021.04.30
[ BOJ ][JAVA][10824] 네 수  (0) 2021.04.29