Krafton Jungle/3. TIL

[WEEK02] 순열과 조합 by itertools

munsik22 2025. 3. 22. 11:03

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를 활용해 더 효율적인 코드를 작성해 보자! 🚀