백준 1010번 바로가기

첫 번째 풀이

import itertools

for _ in range(int(input())):
  n, m = map(int, input().split())
  print(len(list(itertools.combinations(range(m),n))))

두 번째 풀이

def factorial(n):
  k = 1
  for i in range(n):
    k *= (i+1)
  return k

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

고수의 풀이

import math
for l in[*open(0)][1:]:print(math.comb(*map(int,l.split()[::-1])))

CODE REVIEW

  1. itertoolscombinations을 이용하면 편리하지만 숫자가 커지면 뻗어버린다.
    • 알고리즘에서는 combinations 직접 구현하자!
    • 아무래도 경우의 수를 모두 보여준 뒤에 len()으로 길이를 추출해내기 때문에 그런듯.
    • 경우의 수만 구해야한다면 굳이 이 과정을 거칠 이유가 없다.
  2. 따라서 combination 조합의 정의에 따라 factorial을 구현해서 풀어내었다.
  3. 경우의 수만 구하는 경우 math 라이브러리를 import해서 math.comb을 이요하자.