1. 중복을 허용하지 않는 경우
1 - 1. 순열 (permutations)
$${}_n{\rm P}_r = \frac{n!}{(n-r)!}$$
- p개 중에서 중복을 허용하지 않고 r개를 뽑아 나열하는 경우의 수
- 나열하기 때문에 순서가 다르면 다른 경우로 취급한다.
from itertools import permutations
a = [1,2,3,4,5]
b = list(permutations(a, 2)) # a에서 2개를 뽑아 나열하는 경우
print(b)
[(1, 2), (1, 3), (1, 4), (1, 5), (2, 1), (2, 3), (2, 4), (2, 5), (3, 1), (3, 2), (3, 4), (3, 5), (4, 1), (4, 2), (4, 3), (4, 5), (5, 1), (5, 2), (5, 3), (5, 4)]
1 - 2. 조합 (combinations)
$${}_n{\rm C}_r = \frac{n!}{(n-r)!r!}$$
- p개 중에서 중복을 허용하지 않고 r개를 뽑는 경우의 수
- 나열하지 않기 때문에 순서는 고려하지 않는다.
from itertools import combinations
a = [1,2,3,4,5]
b = list(combinations(a, 2)) # a에서 2개를 뽑는 경우
print(b)
[(1, 2), (1, 3), (1, 4), (1, 5), (2, 3), (2, 4), (2, 5), (3, 4), (3, 5), (4, 5)]
2. 중복을 허용하는 경우
2 - 1. 중복순열 (product)
$${}_n{\rm \pi}_r = n^r$$
- n개 중에서 중복을 허용하여 r개를 나열하는 경우의 수
from itertools import product
a = [1,2,3]
b = list(product(a, repeat=2))
print(b)
[(1, 1), (1, 2), (1, 3), (2, 1), (2, 2), (2, 3), (3, 1), (3, 2), (3, 3)]
2 - 2. 중복조합(combinations_with_replacement)
$${}_n{\rm H}_r = _{n+r-1}{\rm C}_r$$
- n개 중에서 중복을 허용하여 r개를 뽑는 경우의 수
from itertools import combinations_with_replacement
a = [1,2,3]
b = list(combinations_with_replacement(a,2))
print(b)
[(1, 1), (1, 2), (1, 3), (2, 2), (2, 3), (3, 3)]
'Python 활용하기' 카테고리의 다른 글
[Algorithm] LIS(Longest Increase Sequence) (0) | 2023.01.12 |
---|---|
시간복잡도 생각하기 (지속 업데이트) (0) | 2022.11.27 |
소수 (Prime Number) (0) | 2022.09.27 |
정규 표현식 (0) | 2022.09.26 |
진법 변환 (0) | 2022.09.25 |