조합과 순열
1. 조합 (Combination)
조합은 순서를 고려하지 않고 어떤 원소가 선택되었는지만 중요한 경우를 의미합니다.
반장 선거에 6명의 학생이 출마했고, 여기서 2명을 선출한다고 가정해봅시다.
- 첫 번째로 한 명 뽑는 경우
- 처음에 일단 한 명 먼저 뽑는다고 생각해볼게요. 그러면 이 때는 6명 중에서 아무나 1명 뽑으면 되겠죠.
- 가능한 선택지: A, B, C, D, E, F → 총 6가지 경우
- 두 번째로 한 명 더 뽑는 경우
- 첫 번째로 한 명 뽑았으니까, 이제 남은 5명 중에서 1명만 더 뽑으면 됩니다.
- 예를 들어 첫 번째로 A를 뽑았으면,
- 남은 선택지는 B, C, D, E, F → 총 5가지 경우가 있을겁니다.
- 그래서 전체 경우의 수는?
- 첫 번째 6가지 경우 × 두 번째 5가지 경우해서, 6 × 5 = 총 30가지가 될겁니다.
- 하지만 중복된 경우를 제거해야 됩니다.
- (A학생, B학생)을 뽑은 것과 (B학생, A학생)을 뽑은 것은 같은 경우이니, 이렇게 중복된 경우를 제거해야됩니다.
- 그래서 전체 경우의 수를 2로 나누면, 30 ÷ 2해서 총 15가지의 조합을 구할 수 있습니다.
- 이 때 2로 나누는 이유는, 한 조합 안에서 발생되는 중복이 2가지 경우가 있기 때문입니다.
조합 코드
1. math.comb
활용
1
2
from math import comb
print(comb(6, 2)) # 결과: 15
2. itertools.combinations
활용
1
2
3
4
5
6
7
8
9
from itertools import combinations
lst = [1, 2, 3, 4, 5, 6]
pick = 2
result = list(combinations(lst, pick))
print(result)
# 결과:
# [(1, 2), (1, 3), (1, 4), ..., (5, 6)]
2. 순열 (Permutation)
순열은 조합과 다르게 순서를 고려하여 뽑는 경우를 의미합니다.
예를 들어 6명(A,B,C,D,E,F) 중에서 3명씩 줄을 세울려고 할 때를 가정해보겠습니다.
이것도 조합이랑 똑같이,
- 일단 첫 번째 자리에는 아무나 올 수 있을겁니다. → 6가지 선택 가능
- 그리고 두 번째 자리엔 한 명이 이미 앉았으니까, 남은 사람 중에서 선택하는 경우로 5가지의 경우가 있습니다.
- 마지막으로 세 번째 자리는 이미 두 명이 앉아 있으니까 남은 세 사람 중에서 선택하는 4가지의 경우가 있습니다.
- 여기선 중복을 제거할 필요가 없으니, 6 X 5 X 4 해서 총 120가지의 경우가 나올겁니다.
순열 코드
1. math.perm
활용
1
2
from math import perm
print(perm(6, 3)) # 결과: 120
2. itertools.permutations
활용
1
2
3
4
5
6
7
8
9
from itertools import permutations
lst = [1, 2, 3, 4, 5, 6]
pick = 3
result = list(permutations(lst, pick))
print(result)
# 결과:
# [(1, 2, 3), (1, 2, 4), (1, 2, 5), ...]
3. 중복 조합 (Product)
중복 조합은 말 그대로 조합에서 같은 원소를 여러 번 선택할 수 있는 조합입니다.
예를 들어, 음료수 자판기에서 1000원으로 음료수를 2개 뽑는다고 가정해보겠습니다.
- 자판기 안에 음료수 종류는 콜라, 사이다, 환타가 있고 각 음료수의 가격은 모두 500원으로 동일할 때의 조합은,
콜라-콜라
,콜라-사이다
,콜라-환타
등 같은 음료를 여러 번 선택 할 수 있습니다.물론 같은 음료수를 마실 수 있다는 가정이 존재한다는 조건하에..
중복 조합 코드
1. math.comb
활용
1
2
from math import comb
print(comb((3 + 2 - 1), 2))
2. itertools.product
활용
1
2
3
4
5
6
7
8
9
from itertools import product
lst = ['콜라', '사이다', '환타']
pick = 2
result = list(product(lst, repeat=pick))
print(result)
# 결과:
# [('콜라', '콜라'), ('콜라', '사이다'), ('콜라', '환타'), ...]
4. itertools vs math 차이점
math 모듈
숫자로 된 조합과 순열 개수만 알고 싶을 때 사용 예를 들어, math.comb(6,2)는 6개 중에서 2개를 선택하는 경우의 수(15)를 반환 math.perm(6,2)는 6개 중에서 2개를 순서 고려하여 나열하는 경우의 수(30)를 반환
itertools 모듈
실제 조합이나 순열을 리스트로 출력하고 싶을 때 사용 예를 들어, list(combinations([1,2,3],2))은 (1,2), (1,3), (2,3) 형태로 출력 list(permutations([1,2,3],2))은 (1,2), (1,3), (2,1), (2,3), (3,1), (3,2) 형태로 출력
This post is licensed under CC BY 4.0 by the author.