
백준 1010번 문제입니다.

두 가지로 문제를 풀 수 있다. 일단, 문제를 읽자마자 조합의 경우를 생각해 볼 수 있었다.
# factorial 정의
def factorial(N):
if N > 1:
return (N * factorial(N-1))
else:
return 1
# T 입력 받기
T = int(input())
for _ in range(T):
N, M = map(int, input().split())
print(factorial(M) // (factorial(M-N) * factorial(N)))
다른 방법으로도 해결할 수 있는데, 이 방법은 하단의 그림을 바탕으로 작성된 코드이다.
T = int(input())
dp = [[0] * 30 for _ in range(30)] #N, M / 0 < N <= M < 30 조건에 의거
for i in range(30):
for j in range(30):
if i == 1:
dp[i][j] = j #위 그림에서 볼 수 있듯, N==1이면 M의 개수가 경우의 수를 결정
else:
if i == j:
dp[i][j] = 1 #N=M이면 경우의 수는 하나뿐
elif i < j:
dp[i][j] = dp[i-1][j-1] + dp[i][j-1]
for _ in range(T):
N, M = map(int, input().split())
print (dp[N][M])
