만족은 하되 안주하지는 말자

기록해야 기억한다

프로그래밍/programmers&bj

[python] 백준 1010번: 다리 놓기

D36choi 2020. 8. 6. 20:41
728x90

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

 

1010번: 다리 놓기

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

www.acmicpc.net

 

조합으로 푸는 문제다.

중고등 수학을 했다면 이해는 바로되는 문제.

왼쪽에 N개, 오른 쪽에 M개의 노드가 있는데 M개 중에서 N개를 꼽아 서로 중복되지 않게 (순서는 무관하게) 왼쪽 N개의 노드와 이어 다리를 만드는 문제다.

 

n_C_m 으로 표현할 수 있다.

이는 팩토리얼로 m! / (m-n)! * n! 으로 표현 가능하다.

 

코드

import sys,math


T = int(input())
for i in range(T):
    n, m = map(int, input().split())
    print(math.factorial(m)//(math.factorial(m-n)*math.factorial(n)))

 

C++ 이었으면 factorial 을 구해서 풀었을 것이고 파이썬을 잘 모르니까 난 그렇게 풀려고 했는데...

알고보니 math 라는 좋은 module 이 존재한다. 코테에서도 이 모듈을 쓸수 있으려나?

 

팩토리얼 문제는 이 math.factorial 을 활용하면 빨리 풀듯 싶다.

 

알게 된 것

- python 엔 math 라는 모듈이 존재하고 이 안의 함수인 factorial 을 통해 정수 팩토리얼 값을 불러 올 수 있다.

- /과 다르게 // 은 FPE 가 없이 정수 / 정수를 실행한다. 오차가 없다.