N
: 서쪽 사이트 수 (0 < N
≤ M
< 30)
M
: 동쪽 사이트 수
✅ 입력 조건
1. 테스트케이스T
입력
2.T
만큼N
,M
입력
✅ 출력 조건
1. 테스트 케이스마다 다리 지을 수 있는 경우의 수 출력
2. 한 사이트엔 최대 한 개의 다리만 연결 가능
3. 서쪽 사이트 개수(N
)만큼 다리 연결
4. 다리끼리 서로 겹쳐질 수 없음
다리끼리는 서로 겹쳐질 수 없고, 서쪽의 사이트 개수만큼 다리를 연결해야 하므로 구해야 하는 경우의 수는 순서 상관없이 M개 중 N개를 뽑는 조합의 수를 계산하는 것과 같다.
itertools
라이브러리의 combinations
을 활용해서 조합의 수를 구하면 될 것이라 생각했는데, 직접 조합을 다 구하다보니 시간 제한 안에 연산이 되지 않았다.
따라서 조합의 수를 바로 구할 수 있는 math
라이브러리의 comb
를 활용하였다.
수학 공식으로 바로 조합의 수만 구할 수 있어 제한 시간 내에 연산이 가능하다.
테스트 케이스 입력 →
조합의 수 계산 →
최종 시간복잡도
으로 제한 시간 내에 연산이 가능하다.
math.comb
를 이용해 조합의 수를 계산하기
# 2. N, M 입력
for _ in range(T):
N, M = map(int, input().split())
# 3. 조합의 수 구하기
combs = combinations(range(M), N)
answer = len(list(combs))
# 4. 원하는 형식으로 출력
print(answer)
combinations
로 조합을 구하고, 개수를 출력하니 예제 수행 시 연산에 매우 오랜 시간이 걸렸다.itertools.combinations
가 오래 걸리는 이유 추측# 2. 각 테스트 케이스에 대해 N, M 입력
for _ in range(T):
N, M = map(int, input().split())
# 3. 조합의 수 구하기
answer = math.comb(M, N)
# 4. 원하는 형식으로 출력
print(answer)
math.comb
특징import sys
import math
input = sys.stdin.readline
# 1. T 입력
T = int(input())
# 2. N, M 입력
for _ in range(T):
N, M = map(int, input().split())
# 3. 조합의 수 구하기
answer = math.comb(M, N)
# 4. 원하는 형식으로 출력
print(answer)
import sys
input = sys.stdin.readline
# 1. T 입력
T = int(input())
# 2. N, M 입력
for _ in range(T):
N, M = map(int, input().split())
# 3. dp 테이블 정의
D = [[0 for _ in range(M + 1)] for _ in range(N + 1)]
# 4. dp 테이블 채우기
for j in range(1, M+1):
D[1][j] = j
D[0][j] = 1
for i in range(2, N+1):
for j in range(i, M+1):
D[i][j] = D[i-1][j-1] + D[i][j-1]
# 5. 원하는 형식으로 출력
print(D[N][M])