문제
1010번: 다리 놓기
입력의 첫 줄에는 테스트 케이스의 개수 T가 주어진다. 그 다음 줄부터 각각의 테스트케이스에 대해 강의 서쪽과 동쪽에 있는 사이트의 개수 정수 N, M (0 < N ≤ M < 30)이 주어진다.
www.acmicpc.net
구현 방법
다리 구하는 개수는 조합을 사용하여 풀어줄 수 있습니다.
예제를 예를 들어 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 |