본문 바로가기
[ 다먹살 ]/- Coding

[백준] 1010 다리놓기

by 엉망으로살기 2021. 11. 24.
반응형

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

 

1010번: 다리 놓기

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

www.acmicpc.net

 

이 문제는 수학적인 내용을 알면 쉽게 해결할 수 있는 문제이다. mCn이라는 것은 총 m개의 값 중에서 n개를 순서있게 선택할 때 만들수 있는 경우의 수와 같다. 다만 주의할 점은 팩토리얼 부분이 들어가있기 때문에 자료형의 범위를 신경써야하는데, 모든 범위의 표현이 가능한 BigInteger를 사용하면 해결할 수 있다.


문제 및 입출력


코드

import java.util.Scanner;
import java.math.BigInteger;

public class Main
{
    public static void main(String[] args)
    {
        Scanner sc = new Scanner(System.in);
        StringBuilder sb = new StringBuilder();
        int t = sc.nextInt();
        // overflow 방지를 위한 BigInteger 자료형 선언
        BigInteger[] dp = new BigInteger[31];
        dp[1] = new BigInteger("1");
        
        for(int i=2; i<dp.length; i++)
        {
            dp[i] = new BigInteger(i+"").multiply(dp[i-1]);
        }
        
        for(int i=0; i<t; i++)
        {
            int n = sc.nextInt();
            int m = sc.nextInt();
            
            // case 1 : n==m일 때는 무조건 1
            if(n==m)
            {
                sb.append(1 + "\n");
            }
            // case 2 : mCn : m! / (n! * m-n!)
            else
            {
                sb.append(dp[m].divide(dp[n].multiply(dp[m-n])) + "\n");
            }
        }
        
        System.out.print(sb.toString());
        sc.close();
    }
}

 

반응형

'[ 다먹살 ] > - Coding' 카테고리의 다른 글

[백준] 9461 파도반 수열  (0) 2021.11.24
[백준] 1002 터렛  (0) 2021.11.24
[프로그래머스] 레벨2 카카오프렌즈 컬러링북  (0) 2021.11.23
[백준] 6603 로또  (0) 2021.11.23
[백준] 1934 최소공배수  (0) 2021.11.22

댓글