Study/Problem Solving

[BOJ_1010] 다리놓기

monitor 2024. 2. 14. 21:12

설명


한방에 통과 할 수 있었는데 처음에 언어 선택을 잘 못 했다가 컴파일 에러를 출력해버린 문제입니다.

 

정리하고 문제 분석을 해보면 N 노드에서 M 노드까지 연결을 할 수 있는 경우에 수를 출력하면 되는 문제인데요. 이는, N <= M 조건이므로 M에서 N개를 선택한다고 보아야겠습니다. 조합(해당 문제는 순서를 고려 하지 않기 때문에 사용합니다.)의 경우를 생각해보면 mCn을 구현 할 것  같습니다.

 

하지만, 이는 시간 초과를 야기하고 이를 방지하기 위해서는 조합의 유명한 공식인 nCr = n-1Cr-1 + n-1Cr 을 사용합니다.

 

이를 동적 계획법에 따라서 만들게 되면 dp[i][j] = 1 , dp[i][0] = 1 M 이 i이고 N이 j이라고 생각합시다. 그렇게 보면 i개 중에 i개 뽑는 경우는 1개 이고 i개 중에 0개 뽑는 경우도 1개 입니다. 무조건 

 

그래서 해당 식으로 dp[i][j] = dp[i - 1][j] + dp[i-1][j-1] 이라는 점화식을 만들어서 조합의 경우의 수를 메모리제이션으로 구합니다.

코드


import java.util.Scanner;

public class BOJ_1010 {
    static long[][] dp = new long[31][31];

    public static void main(String[] args) {
        Scanner scanner = new Scanner(System.in);
        int T = scanner.nextInt();

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

        for (int i = 0; i < T; i++) {
            int N = scanner.nextInt();
            int M = scanner.nextInt();
            System.out.println(dp[M][N]);
        }
    }
}

 

 

1010번: 다리 놓기

입력의 첫 줄에는 테스트 케이스의 개수 T가 주어진다. 그 다음 줄부터 각각의 테스트케이스에 대해 강의 서쪽과 동쪽에 있는 사이트의 개수 정수 N, M (0 < N ≤ M < 30)이 주어진다.

www.acmicpc.net