순열/조합/중복 순열/중복 조합이란?
순열 (nPr)
- 서로 다른 n개 중에 r개를 선택해 일렬로 나열하는 경우의 수 (순서 상관 O)
조합 (nCr)
- 서로 다른 n개 중에 r개를 순서 생각 안하고 선택하는 경우의 수 (순서 상관 X)
중복 순열 (n∏r)
- 중복 가능한 n개 중에 r개를 선택해 일렬로 나열하는 경우의 수 (순서 상관 O)
중복 조합 (nHr)
- 중복 가능한 n개 중에 r개를 선택하는 경우의 수 (순서 상관 X)
파이썬에서 함수로 구현하기
순열 : itertools.permutations(list, r)
- 서로 다른 n개에서 r개를 뽑아 일렬로 나열(순서O)
import itertools
arr = ['a', 'b', 'c']
nPr = itertools.permutations(arr, 2) # 몇개 뽑는지
# 리턴되어 list 써줘야 함
print(list(nPr))
#[('a', 'b'), ('a', 'c'), ('b', 'a'), ('b', 'c'), ('c', 'a'), ('c', 'b')]
조합 : itertools.combinations(list, r)
- 서로 다른 n개에서 r개를 순서 상관 없이 뽑기(순서X)
import itertools
arr = ['a', 'b', 'c']
nCr = itertools.combinations(arr, 2) # 몇개 뽑는지
# 리턴되어 list 써줘야 함
print(list(nCr))
#[('a', 'b'), ('a', 'c'), ('b', 'c')]
중복 순열 : itertools.product(list, repeat = r)
- 중복 가능한 수 n개에서 r개를 뽑아 일렬로 나열(순서 O, 중복 허용)
import itertools
arr = ['a', 'b', 'b']
nr = itertools.product(arr, repeat=2)
print(list(nr))
# [('a', 'a'), **('a', 'b'), ('a', 'b')**, ('b', 'a'), **('b', 'b'), ('b', 'b')**, ('b', 'a'), ('b', 'b'), ('b', 'b')]
중복 조합 : itertools.combinations_with_replacement(list, r)
- 중복 가능한 n개의 수에서 순서를 생각하지 않고 r개를 택하는 경우의 수 (순서 X, 중복 허용)
import itertools
arr = ['a', 'b', 'b']
nr = itertools.combinations_with_replacement(arr, 2)
print(list(nr))
# [('a', 'a'), ('a', 'b'), ('a', 'b'), ('b', 'b'), ('b', 'b'), ('b', 'b')]