본문 바로가기

코딩테스트

백준 1010: 다리 놓기 [JAVA]

[문제 링크]

https://www.acmicpc.net/problem/1010

[난이도]

- Silver 5

 

[알고리즘]

- DP

 

[코드]

import java.io.*;
import java.util.*;

public class Main {
    static int[][] dp = new int[30][30];
    public static void main(String[] args) throws IOException {
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        StringTokenizer st = new StringTokenizer(br.readLine(), " ");
        StringBuilder sb = new StringBuilder();

        int T = Integer.parseInt(st.nextToken());

        for (int i = 0; i < T; i++) {
            st = new StringTokenizer(br.readLine(), " ");

            // M개중 N개를 뽑는 경우이므로 nCr 에서 n = M, r = N 이다.
            int N = Integer.parseInt(st.nextToken()); // N = r
            int M = Integer.parseInt(st.nextToken()); // M = n

            sb.append(combi(M, N)).append("\n");
        }
        System.out.println(sb);
        br.close();
    }

    static int combi(int n, int r) {

        // 이미 계산해놓은 값이 있을 경우 바로 반환
        if (dp[n][r] > 0) {
            return dp[n][r];
        }

        // 2번 성질
        // n과r이 같거나 r==0 이면 1이다
        if (n == r || r == 0) {
            return dp[n][r] = 1;
        }

        // 1번 성질
        // nCr = n-1Cr-1 + n-1Cr 이다.
        return dp[n][r] = combi(n - 1, r - 1) + combi(n - 1, r);
    }
}

[풀이]

1번 성질 

n개 중에 r개를 뽑는 방법

 

2번 성질

 

        if (dp[n][r] > 0) {
            return dp[n][r];
        }

이미 계산해놓은 nCr이 있을 경우 그 값을 그대로 사용한다.

 

[출처]

https://st-lab.tistory.com/194

'코딩테스트' 카테고리의 다른 글

백준 14916: 거스름돈 [JAVA]  (0) 2024.05.30
백준 9655: 돌 게임 [JAVA]  (0) 2024.05.30
백준 19637: IF문 좀 대신 써줘 [JAVA]  (0) 2024.05.24
백준 4158: CD [JAVA]  (0) 2024.05.23
백준 2417: 정수 제곱근 [JAVA]  (0) 2024.05.21