Python의 itertools 모듈은 반복 가능한(iterable) 객체를 다룰 때 유용한 함수들을 제공한다. 그중에서도 permutations(순열)과 combinations(조합)은 다양한 경우의 수를 구할 때 자주 사용된다. 오늘은 이 두 함수에 대해 정리해 보려고 한다.
itertools.permutations
permutations(iterable, r) 는 주어진 iterable에서 길이가 r인 순열을 생성한다. 순열은 원소들의 순서를 고려한 경우의 수를 의미한다.
✅ 사용 예시
from itertools import permutations
items = ['A', 'B', 'C']
# 모든 원소를 포함한 순열
for p in permutations(items):
print(p)
# 2개 원소로 이루어진 순열
for p in permutations(items, 2):
print(p)
🔹 결과
('A', 'B', 'C')
('A', 'C', 'B')
('B', 'A', 'C')
('B', 'C', 'A')
('C', 'A', 'B')
('C', 'B', 'A')
('A', 'B')
('A', 'C')
('B', 'A')
('B', 'C')
('C', 'A')
('C', 'B')
- 모든 원소를 포함한 경우, 원소들의 모든 가능한 순서가 출력된다.
- r 값을 지정하면 해당 길이만큼의 순열만 생성된다.
itertools.combinations
combinations(iterable, r) 는 주어진 iterable에서 길이가 r인 조합을 생성한다. 조합은 원소들의 순서를 고려하지 않는다.
✅ 사용 예시
from itertools import combinations
items = ['A', 'B', 'C']
# 2개 원소로 이루어진 조합
for c in combinations(items, 2):
print(c)
🔹 결과
('A', 'B')
('A', 'C')
('B', 'C')
- ('A', 'B')와 ('B', 'A')는 같은 조합으로 취급되므로 한 번만 출력된다.
- 중복 없이 특정 길이의 조합을 만들 때 유용하다.
combinations vs permutations
| 함수 | 순서 고려 | 예시 (r=2, n=3) |
| permutations | ⭕ | 6개 3P2 = 3! / (3-2)! |
| combinations | ❌ | 3개 3C2 = 3! / (2!(3-2)!) |
- permutations는 순서를 고려하기 때문에 조합보다 경우의 수가 많다.
- combinations는 순서를 고려하지 않으므로 중복을 제거한 결과를 얻을 수 있다.
활용 예시
🎲 경우의 수 계산
로또 번호를 6개 뽑는 경우를 생각해보자. 중복 없이 6개의 숫자를 조합하는 것이므로 combinations를 활용할 수 있다.
from itertools import combinations
lotto_numbers = range(1, 46) # 1~45까지 숫자
possible_combinations = list(combinations(lotto_numbers, 6))
print(len(possible_combinations)) # 8145060
이처럼 combinations를 사용하면 중복 없는 조합을 쉽게 만들 수 있다.
정리
- itertools.permutations(iterable, r) : 순서를 고려한 r개 원소의 조합 생성
- itertools.combinations(iterable, r) : 순서를 고려하지 않은 r개 원소의 조합 생성
- 경우의 수를 계산할 때 매우 유용하며, 중복 제거와 순열/조합을 쉽게 처리할 수 있다.
앞으로도 itertools를 활용해 더 효율적인 코드를 작성해 보자! 🚀
'Krafton Jungle > 3. TIL' 카테고리의 다른 글
| [WEEK02] Two-pointer 알고리즘 (0) | 2025.03.24 |
|---|---|
| [WEEK02] 힙 (0) | 2025.03.22 |
| [WEEK01] 비트마스킹 (0) | 2025.03.20 |
| [WEEK01] 합병 정렬 (0) | 2025.03.18 |
| [WEEK01] 힙 소트 (0) | 2025.03.18 |