조합의 실용적인 응용
이제 itertools.combinations() 함수의 몇 가지 실용적인 응용을 살펴보겠습니다. 이 함수를 사용하여 일반적인 문제를 해결하는 방법을 보여주기 위해 몇 가지 실제 예제를 구현해 보겠습니다.
예제 1: 팀 구성
특정 크기의 팀을 그룹에서 구성해야 한다고 가정해 보겠습니다. 가능한 모든 팀을 구성하는 데 도움이 되는 프로그램을 만들어 보겠습니다.
-
/home/labex/project 디렉토리에 team_formation.py라는 새 파일을 만듭니다.
-
다음 코드를 추가합니다.
import itertools
def form_teams(members, team_size):
"""Generate all possible teams of the specified size from the list of members."""
teams = list(itertools.combinations(members, team_size))
return teams
## List of team members
team_members = ["Alice", "Bob", "Charlie", "David", "Eva", "Frank"]
## Form teams of different sizes
pairs = form_teams(team_members, 2)
trios = form_teams(team_members, 3)
## Display the results
print(f"Total members: {len(team_members)}")
print(f"Members: {team_members}\n")
print(f"Possible pairs (teams of 2): {len(pairs)}")
for i, pair in enumerate(pairs, 1):
print(f"Team {i}: {' and '.join(pair)}")
print(f"\nPossible trios (teams of 3): {len(trios)}")
for i, trio in enumerate(trios, 1):
print(f"Team {i}: {', '.join(trio)}")
- 스크립트를 실행합니다.
python3 team_formation.py
6 명의 팀 구성원으로부터 구성할 수 있는 모든 가능한 쌍과 삼중항을 나열하는 출력을 볼 수 있습니다.
예제 2: 모든 부분 집합 찾기
또 다른 일반적인 응용 분야는 주어진 집합의 모든 가능한 부분 집합 (멱집합 (power set) 이라고도 함) 을 생성하는 것입니다. 이를 구현해 보겠습니다.
-
/home/labex/project 디렉토리에 generate_subsets.py라는 새 파일을 만듭니다.
-
다음 코드를 추가합니다.
import itertools
def generate_all_subsets(items):
"""Generate all possible subsets of the given items."""
all_subsets = []
## Empty set is always a subset
all_subsets.append(())
## Generate subsets of all possible lengths
for r in range(1, len(items) + 1):
subsets_of_length_r = list(itertools.combinations(items, r))
all_subsets.extend(subsets_of_length_r)
return all_subsets
## Sample set of items
items = ['A', 'B', 'C']
## Generate all subsets
subsets = generate_all_subsets(items)
## Display the results
print(f"Original set: {items}")
print(f"Total number of subsets: {len(subsets)}")
print("All subsets (including the empty set):")
for i, subset in enumerate(subsets):
if len(subset) == 0:
print(f"{i+1}. Empty set {{}}")
else:
print(f"{i+1}. {set(subset)}")
- 스크립트를 실행합니다.
python3 generate_subsets.py
출력은 빈 집합을 포함하여 집합 {A, B, C}의 모든 가능한 부분 집합을 표시합니다.
예제 3: 메뉴 조합 생성기
레스토랑이 메뉴 항목에서 가능한 모든 식사 조합을 생성하는 데 도움이 되는 실용적인 응용 프로그램을 만들어 보겠습니다.
-
/home/labex/project 디렉토리에 menu_combinations.py라는 새 파일을 만듭니다.
-
다음 코드를 추가합니다.
import itertools
def generate_meal_combinations(appetizers, main_courses, desserts):
"""Generate all possible meal combinations with one item from each category."""
meal_combinations = []
for app in appetizers:
for main in main_courses:
for dessert in desserts:
meal_combinations.append((app, main, dessert))
return meal_combinations
def generate_combo_deals(menu_items, combo_size):
"""Generate all possible combo deals of the specified size."""
return list(itertools.combinations(menu_items, combo_size))
## Menu categories
appetizers = ["Salad", "Soup", "Bruschetta"]
main_courses = ["Pasta", "Steak", "Fish"]
desserts = ["Ice Cream", "Cake", "Fruit"]
## All menu items
all_items = appetizers + main_courses + desserts
## Generate all possible three-course meals
meals = generate_meal_combinations(appetizers, main_courses, desserts)
## Generate all possible 2-item combo deals from the entire menu
combos = generate_combo_deals(all_items, 2)
## Display the results
print("Restaurant Menu Planner\n")
print("Menu Items:")
print(f"Appetizers: {appetizers}")
print(f"Main Courses: {main_courses}")
print(f"Desserts: {desserts}\n")
print(f"Total possible three-course meals: {len(meals)}")
print("Sample meals:")
for i in range(min(5, len(meals))):
app, main, dessert = meals[i]
print(f"Meal option {i+1}: {app} + {main} + {dessert}")
print(f"\nTotal possible 2-item combo deals: {len(combos)}")
print("Sample combo deals:")
for i in range(min(5, len(combos))):
print(f"Combo {i+1}: {' + '.join(combos[i])}")
- 스크립트를 실행합니다.
python3 menu_combinations.py
출력은 메뉴 항목에서 만들 수 있는 다양한 식사 조합 및 콤보 상품을 보여줍니다.
이러한 예제는 itertools.combinations() 함수를 항목의 조합과 관련된 실제 문제를 해결하는 데 어떻게 적용할 수 있는지 보여줍니다. 이 함수를 효과적으로 사용하는 방법을 이해하면 더 큰 집합에서 항목 그룹을 선택하는 문제를 해결하기 위한 보다 효율적인 솔루션을 개발할 수 있습니다.