파이썬에서 순열과 조합을 구현할 때 가장 편리한 방법은 itertools 표준 라이브러리를 활용하는 것입니다.
수학적 개념을 코드로 간단하게 구현할 수 있고, 경우의 수를 계산하거나 모든 경우를 나열할 때 자주 사용됩니다.
1. itertools 불러오기
from itertools import permutations, combinations, product, combinations_with_replacement
- permutations: 순서가 중요한 경우의 수(순열)
- combinations: 순서가 중요하지 않은 경우의 수(조합)
- product: 중복 순열 (데카르트 곱)
- combinations_with_replacement: 중복 조합
2. 순열 (permutations)
순열은 서로 다른 n개의 원소 중에서 r개를 뽑아 순서를 고려하여 나열한 경우의 수입니다.
from itertools import permutations
data = ['A', 'B', 'C']
result = list(permutations(data, 2))
print(result)
출력
[('A', 'B'), ('A', 'C'), ('B', 'A'), ('B', 'C'), ('C', 'A'), ('C', 'B')]
- permutations(data, r) → r은 뽑을 원소 개수
- r을 생략하면 len(data)와 동일하게 동작합니다.
3. 조합 (combinations)
조합은 서로 다른 n개의 원소 중에서 r개를 뽑아 순서를 고려하지 않는 경우의 수입니다.
from itertools import combinations
data = ['A', 'B', 'C']
result = list(combinations(data, 2))
print(result)
출력
[('A', 'B'), ('A', 'C'), ('B', 'C')]
- combinations(data, r)은 순서가 다른 경우를 동일하게 취급합니다.
- 예: ('A', 'B')와 ('B', 'A')는 같은 경우이므로 한 번만 출력됩니다.
4. 중복 순열 (product)
product는 중복을 허용하는 순열을 생성합니다.
from itertools import product
data = ['A', 'B', 'C']
result = list(product(data, repeat=2))
print(result)
출력
[('A', 'A'), ('A', 'B'), ('A', 'C'),
('B', 'A'), ('B', 'B'), ('B', 'C'),
('C', 'A'), ('C', 'B'), ('C', 'C')]
- repeat은 뽑을 원소의 개수입니다.
- 동일 원소를 여러 번 뽑을 수 있습니다.
5. 중복 조합 (combinations_with_replacement)
중복 조합은 중복을 허용하면서 순서를 고려하지 않는 조합입니다.
from itertools import combinations_with_replacement
data = ['A', 'B', 'C']
result = list(combinations_with_replacement(data, 2))
print(result)
결과
[('A', 'A'), ('A', 'B'), ('A', 'C'),
('B', 'B'), ('B', 'C'), ('C', 'C')]
- 동일 원소를 여러 번 뽑을 수 있지만, 순서는 고려하지 않습니다.
6. 마무리
- 순열: permutations(data, r) — 순서 O, 중복 X
- 조합: combinations(data, r) — 순서 X, 중복 X
- 중복 순열: product(data, repeat=r) — 순서 O, 중복 O
- 중복 조합: combinations_with_replacement(data, r) — 순서 X, 중복 O
itertools는 경우의 수 문제를 풀 때 매우 강력하며, 백준, 프로그래머스 같은 알고리즘 문제 풀이에서 필수적으로 알아두면 좋습니다.
'Programming' 카테고리의 다른 글
| [Python 코드 분석] 트리 구조 생성과 홀수 레벨 노드의 합계 구하기 (0) | 2025.07.11 |
|---|---|
| [Java] 재귀 함수(Recursive Function)로 피보나치 수열 예제로 쉽게 이해하기 (0) | 2025.07.11 |
| [Java] 상속과 오버라이딩: private, protected, static 변수 알아보기 (0) | 2025.07.11 |
| 함수 호출 방식에 대한 이해: Python, C, C++, Java 비교 (1) | 2024.09.29 |
| 프로그래밍 언어 개념 Chapter 2.1 :: 언어의 변천 (0) | 2023.09.27 |