Python

[Python] 파이썬 순열, 조합, 중복 순열, 중복 조합  itertools 함수 (permutations, combinations, product, combinations_with_replacement)

yujinius 2024. 4. 15. 21:32

순열/조합/중복 순열/중복 조합이란?

순열 (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')]