안녕하세요. 성조입니다.
이 문제는 Python 3 버전을 기준으로 풀이됐습니다.
문제 출처
https://www.acmicpc.net/problem/1010
1010번: 다리 놓기
입력의 첫 줄에는 테스트 케이스의 개수 T가 주어진다. 그 다음 줄부터 각각의 테스트케이스에 대해 강의 서쪽과 동쪽에 있는 사이트의 개수 정수 N, M (0 < N ≤ M < 30)이 주어진다.
www.acmicpc.net
문제
재원이는 한 도시의 시장이 되었다. 이 도시에는 도시를 동쪽과 서쪽으로 나누는 큰 일직선 모양의 강이 흐르고 있다. 하지만 재원이는 다리가 없어서 시민들이 강을 건너는데 큰 불편을 겪고 있음을 알고 다리를 짓기로 결심하였다. 강 주변에서 다리를 짓기에 적합한 곳을 사이트라고 한다. 재원이는 강 주변을 면밀히 조사해 본 결과 강의 서쪽에는 N개의 사이트가 있고 동쪽에는 M개의 사이트가 있다는 것을 알았다. (N ≤ M)
재원이는 서쪽의 사이트와 동쪽의 사이트를 다리로 연결하려고 한다. (이때 한 사이트에는 최대 한 개의 다리만 연결될 수 있다.) 재원이는 다리를 최대한 많이 지으려고 하기 때문에 서쪽의 사이트 개수만큼 (N개) 다리를 지으려고 한다. 다리끼리는 서로 겹쳐질 수 없다고 할 때 다리를 지을 수 있는 경우의 수를 구하는 프로그램을 작성하라.
입력
입력의 첫 줄에는 테스트 케이스의 개수 T가 주어진다. 그 다음 줄부터 각각의 테스트케이스에 대해 강의 서쪽과 동쪽에 있는 사이트의 개수 정수 N, M (0 < N ≤ M < 30)이 주어진다.
출력
각 테스트 케이스에 대해 주어진 조건하에 다리를 지을 수 있는 경우의 수를 출력한다.
코드
import sys
import math
T = int(sys.stdin.readline())
for i in range(T):
input_data = sys.stdin.readline().rstrip()
N, M = map(int, input_data.rsplit())
bridges_cases = math.comb(M, N)
print(bridges_cases)
풀이
파이썬 버전 3.8 버전 이상부터 지원되는 내장 함수인 math.comb 함수를 통해서 풀이를 진행했다.
이 문제는 조합(nCr)을 통해서 경우의 수를 파악하는 문제였다.
1. 순서에 상관없이 [N개중에 M개를] 또는 [M개중에 N개를] 선택할 수 있는 경우의 수가 몇개 되는 것인지를 확인하는 것이다.
2. 공식은 N! / (M! * (N-M)!) 을 가져야 하는데 위 언급한 comb 함수를 활용하면 M개 다리 중에서 N개 다리를 선택하는 방법의 수를 계산할 수 있다.
3. 이 값들을 출력한다.
오타나 이해가 안 가는 부분이 있다면 언제든지 댓글로 얘기해 주시면 공유드리겠습니다. 또한 피드백 주신다면 개선해서 더 좋은 지식을 공유할 수 있도록 하겠습니다.
다음 포스팅 때 뵙겠습니다.
'백준 - Python' 카테고리의 다른 글
[백준 - 1920][Python] 수 찾기 (0) | 2023.03.02 |
---|---|
[백준 - 25206][Python] 너의 평점은 (0) | 2023.02.26 |
[백준 - 11478][Python] 서로 다른 부분 문자열의 개수 (0) | 2023.02.22 |
[백준 - 11047][Python] 동전 0 (0) | 2023.02.21 |
[백준 - 10845][Python] 큐 (0) | 2023.02.20 |