재원이는 한 도시의 시장이 되었다. 이 도시에는 도시를 동쪽과 서쪽으로 나누는 큰 일직선 모양의 강이 흐르고 있다. 하지만 재원이는 다리가 없어서 시민들이 강을 건너는데 큰 불편을 겪고 있음을 알고 다리를 짓기로 결심하였다. 강 주변에서 다리를 짓기에 적합한 곳을 사이트라고 한다. 재원이는 강 주변을 면밀히 조사해 본 결과 강의 서쪽에는 N개의 사이트가 있고 동쪽에는 M개의 사이트가 있다는 것을 알았다. (N ≤ M)
재원이는 서쪽의 사이트와 동쪽의 사이트를 다리로 연결하려고 한다. (이때 한 사이트에는 최대 한 개의 다리만 연결될 수 있다.) 재원이는 다리를 최대한 많이 지으려고 하기 때문에 서쪽의 사이트 개수만큼 (N개) 다리를 지으려고 한다. 다리끼리는 서로 겹쳐질 수 없다고 할 때 다리를 지을 수 있는 경우의 수를 구하는 프로그램을 작성하라.

입력의 첫 줄에는 테스트 케이스의 개수 T가 주어진다. 그 다음 줄부터 각각의 테스트케이스에 대해 강의 서쪽과 동쪽에 있는 사이트의 개수 정수 N, M (0 < N ≤ M < 30)이 주어진다.
각 테스트 케이스에 대해 주어진 조건하에 다리를 지을 수 있는 경우의 수를 출력한다.
3
2 2
1 5
13 29
1
5
67863915
강의 서쪽과 동쪽에 사이트가 각각 주어지고 겹치지 않게 다리를 연결할 수 있는 모든 경우의 수를 구하는 문제.
주어진 조건:
동적 프로그래밍 접근법을 사용하여 조합 값을 미리 계산하고 저장하는 방식으로 문제를 해결.
DP
1. 테스트 케이스 수 T를 입력받습니다.
2. k와 n 값을 각 테스트 케이스마다 입력받습니다.
3. arr[a][b]를 사용하여 각 층과 호의 사람 수를 저장합니다.
4. arr[0][i] = i + 1로 첫 번째 행을 초기화합니다.
5. arr[a][b] = arr[a][b-1] + arr[a-1][b] 이런식으로 사람 수를 계산해 채워넣습니다.
6. 미리 계산된 arr 배열을 이용해 각 테스트 케이스에 대해 arr[n-1][m-1]을 출력합니다.
조합식
1. 첫 번째 줄에서 테스트 케이스 수 T를 입력받습니다.
2. 이후 각 테스트 케이스마다 N과 M을 입력받고, 서쪽 사이트 N개를 동쪽 사이트 M개 중에서 선택하는 경우의 수를 계산합니다.
3. 함수 cal(m, n)은 M개 중에서 N개를 선택하는 조합을 계산합니다.
4. 조합의 정의에 따라, 분자와 분모를 하나씩 곱하면서 나눠가며 계산합니다.
5. for 반복문을 사용하여 조합을 계산하므로 math 모듈을 사용하지 않고도 정확한 조합 수를 구할 수 있습니다.
6. 각 테스트 케이스의 결과를 리스트 arr에 저장하고, 모든 테스트 케이스에 대한 결과를 한꺼번에 출력합니다.
1회차
처음에 조합식으로 풀었는데 DP로 풀어야 공부가 되기에 다시 DP로 풀어봄,,
사실 전 문제의 코드랑 거의 비슷
DP
import sys
T = int(sys.stdin.readline())
arr = [[0] * 30 for _ in range(30)]
for i in range(30):
arr[0][i] = i+1
for a in range(1, 30):
for b in range(1, 30):
arr[a][b] = arr[a][b-1] + arr[a-1][b-1]
for _ in range(T):
n, m = map(int, sys.stdin.readline().split())
print(arr[n-1][m-1])
조합식
import sys
arr = []
T = int(sys.stdin.readline())
def cal(m, n):
result = 1
for i in range(m-n):
result *= (m-i)
result //= (i+1)
return result
for _ in range(T):
N, M = map(int, sys.stdin.readline().split())
arr.append(cal(M, N))
for a in arr:
print(a)