본문 바로가기
백준

백준 1010번 : 다리 놓기

by Huiyeong 2021. 3. 19.

 문제

www.acmicpc.net/problem/1010

 

1010번: 다리 놓기

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

www.acmicpc.net

1010 다리 놓기

 

 구현 방법

 다리 구하는 개수는 조합을 사용하여 풀어줄 수 있습니다.

예제를 예를 들어 13 29가 입력 되었을 때 29C13을 구해주면 됩니다.

수가 너무 크므로 BigInteger 클래스로 dp 배열을 생성했습니다.

dp에 31까지의 곱셈을 구해준 다음 dp[29] / dp[M-N = 17] 를 구해주면 29부터 17까지의 곱셈을 구할 수 있습니다. 이를 dp[13]으로 나누어주면 29C13의 값이 출력됩니다.

 

 구현 코드

package BOJ.Silver;

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

public class BOJ1010_다리놓기 {
	public static void main(String[] args) throws NumberFormatException, IOException {
		BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
		StringBuilder sb = new StringBuilder();
		int TC = Integer.parseInt(br.readLine());
		for (int tc=0;tc<TC;tc++) {
			StringTokenizer st = new StringTokenizer(br.readLine());
			int N = Integer.parseInt(st.nextToken());
			int M = Integer.parseInt(st.nextToken());
			BigInteger[] dp = new BigInteger[31]; // 정수는 30개까지이니 31까지 선언
			dp[0] = BigInteger.valueOf(1); 
			dp[1] = BigInteger.valueOf(1); // 1C1 = 1 
			for (int i=2;i<31;i++) {
				dp[i]= dp[i-1].multiply(BigInteger.valueOf(i));
			}
		
			sb.append((dp[M].divide(dp[M-N])).divide(dp[N])+"\n");
		}
		System.out.println(sb);
	}
}

 

정답!

'백준' 카테고리의 다른 글

백준 9461번 : 파도반 수열  (0) 2021.03.19
백준 9095번 : 1, 2, 3 더하기  (0) 2021.03.19
백준 1003번 : 피보나치 함수  (0) 2021.03.19
백준 2210번 : 숫자판 점프  (0) 2021.03.18
백준 2583번 : 영역 구하기  (0) 2021.03.18