본문 바로가기

Algorithm Problems/조합론

[백준/Python] 1010번: 다리 놓기

문제

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

1010번: 다리 놓기

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

www.acmicpc.net


문제 요약

강 서쪽에 N개, 동족에 M개의 사이트가 존재할 때 서로 겹치지 않게 다리를 지을 수 있는 경우의 수를 출력한다.
 
+ 사이트란 강 주변에서 다리를 짓기에 적합한 곳이다.

+ 한 사이트에는 최대 한 개의 다리만 연결될 수 있다.


코드

T = int(input())

for _ in range(T):
    N, M = map(int, input().split())
    # N은 서쪽의 사이트 개수, M은 동쪽 사이트 개수

    small = min(N, M)
    big = max(N, M)

    res = 1

    # small C big의 분자 계산 
    for i in range (big, big - small, -1):
        res *= i

    # small C big의 분모 계산
    for i in range(1, small + 1):
        res //= i

    print(res)

코드 설명

다리를 지을 수 있는 경우의 수는 사이트 개수가 더 많은 쪽에서 적은 쪽 의 개수만큼 고를 수 있는 경우의 수이다.
(고르기만 하면 차례대로 연결시키면 된다.)
 
즉 Combination 계산이 필요하다.
 
+ 리스트를 만들어 완전 탐색이나, combination tool을 이용하면 시간 초과 문제가 발생한다.
=> 따라서 리스트를 만들어 경우의 수를 일일이 구하는 것이 아니라 개수만 구해야한다.
 
 
1. min, max 함수를 통해 더 큰 값과 작은 값을 고른다.
 
2. combination 계산 식의 분자를 계산한다.
 
3. combination 계산 식의 분모를 계산한다.
 
4. 값을 출력한다.

'Algorithm Problems > 조합론' 카테고리의 다른 글

[백준/Python] 다음 순열  (0) 2023.09.28