01. 합과 곱의 법칙, 그리고 파이썬 Product 엔진
1. 학습 목표 (Learning Objectives)
- 무수히 많은 나뭇가지로 뻗어 나가는 경우의 수를 손쉽게 뭉쳐 계산하는 두 가지 대원칙, ‘합의 법칙(+)’과 ‘곱의 법칙(×)’을 명확하게 구분합니다.
- 파이썬의 강력한
itertools라이브러리의product모듈을 이용하여 번거로운 패션 의상 코디 조합을 0.01초 만에 모두 찾아 스크린에 렌더링하는 자동화 스크립트를 경험합니다.
2. OR(+) 인가, AND(×) 인가?
수많은 경우의 수 문제에서 학생들의 멘탈이 붕괴되는 지점은 딱 하나입니다.
“대체 언제 개수끼리 더해야 하고(+), 언제 곱해야 하는가(×)?”
1) 합의 법칙 (Addition Rule : OR)
- 상황: 사건 A와 사건 B가 “절대로 동시에 같이 일어날 수 없을 때” (택 1을 해야만 할 때)
- 예시: 분식집에서 메인 메뉴를 시켜야 합니다. ‘면류(라면, 우동, 쫄면 : 3개)’ 거나, 혹은(OR) ‘밥류(김밥, 볶음밥, 덮밥 : 3개)’ 중 딱 1개만 먹을 수 있다면?
- 계산: 3개 + 3개 = $\mathbf{6\text{가지}}$ (면과 밥을 동시에 시킬 수 없으므로 무조건 더합니다!)
2) 곱의 법칙 (Multiplication Rule : AND)
- 상황: 사건 A와 사건 B가 “시간의 흐름에 따라 연속해서, 또는 동시에 세트로 일어날 때”
- 예시: 아침에 외출을 합니다. 상의(티셔츠, 셔츠, 니트 : 3벌) 그리고(AND) 하의(청바지, 슬랙스 : 2벌)를 ‘세트로 입고’ 나가야 합니다.
- 계산: 3벌 × 2벌 = $\mathbf{6\text{가지 코디 룩}}$ (티셔츠에 청바지, 티셔츠에 슬랙스… 사건이 완료될 때까지 연결되므로 무조건 곱합니다!)
3. 파이썬 itertools.product로 옷장 속 조합 코딩 (Python)
위의 의상 코디(곱의 법칙) 예시에서, 옷이 각각 상의 상자(A 집합), 하의 상자(B 집합)에 담겨있어 각각 하나씩 무작위로 꺼내어 세트 룩(Look)을 맞춘다고 생각하면 됩니다. 수학에서는 이 거대한 경우의 가지 수를 ‘데카르트 곱(Cartesian Product)’ 이라 부릅니다.
파이썬에는 이 무한한 가지 뻗기(수형도)를 자동으로 생성해 주는 마법 램프 모듈, itertools 가 내장되어 있습니다. 이 중 product 엔진을 가동해 보겠습니다.
import itertools
# 1. 아웃핏(Outfit) 집합 선언 요소 부여
tops = ["👕 반팔티", "👔 체크셔츠", "🧶 포근니트"]
bottoms = ["👖 찢어진청바지", "👖 블랙슬랙스"]
shoes = ["👟 나이키조던", "👞 구두"]
print(f"👕 상의: {len(tops)}벌 | 👖 하의: {len(bottoms)}벌 | 👟 신발: {len(shoes)}켤레")
print(f"👉 총 경우의 수(곱의 법칙) = {len(tops)} x {len(bottoms)} x {len(shoes)} = {len(tops) * len(bottoms) * len(shoes)}가지 코디 등장!\n")
# 2. 파이썬 마법 엔진 (itertools.product - 데카르트 곱 전수 추출)
# 3개의 옷장을 하나로 묶어 무차별(Brute-force) 모든 경우의 쌍을 끄집어냅니다.
all_outfits = list(itertools.product(tops, bottoms, shoes))
# 3. 도출 결과 렌더링
print("-" * 40)
print("🤖 AI 스타일리스트가 생성한 모든 옷차림 경우의 수 내역")
print("-" * 40)
for index, out in enumerate(all_outfits, 1):
# 각 코디 묶음 튜플을 세련되게 풀어서(Unpack) 출력
print(f"[{index:02d}번 패션] {out[0]} + {out[1]} + {out[2]}")
파이썬의 실행 결과 요약:
👕 상의: 3벌 | 👖 하의: 2벌 | 👟 신발: 2켤레
👉 총 경우의 수(곱의 법칙) = 3 x 2 x 2 = 12가지 코디 등장!
----------------------------------------
🤖 AI 스타일리스트가 생성한 모든 옷차림 경우의 수 내역
----------------------------------------
[01번 패션] 👕 반팔티 + 👖 찢어진청바지 + 👟 나이키조던
[02번 패션] 👕 반팔티 + 👖 찢어진청바지 + 👞 구두
[03번 패션] 👕 반팔티 + 👖 블랙슬랙스 + 👟 나이키조던
[04번 패션] 👕 반팔티 + 👖 블랙슬랙스 + 👞 구두
[05번 패션] 👔 체크셔츠 + 👖 찢어진청바지 + 👟 나이키조던
(중략)
[11번 패션] 🧶 포근니트 + 👖 블랙슬랙스 + 👟 나이키조던
[12번 패션] 🧶 포근니트 + 👖 블랙슬랙스 + 👞 구두
인간이 수작업 트리(수형도)를 종이에 펜으로 끙끙 앓으며 그릴 때, 파이썬 알고리즘은 단 $0.001$초 만에 수만, 수천만 가지의 곱의 법칙 경우의 수 조합을 눈앞에 모두 펼쳐(Unpack) 텍스트로 렌더링해버리는 데이터 파워를 보여줍니다!
4. 학습 정리 (Summary)
- 합의 법칙 vs 곱의 법칙: 동시(혹은 연속) 다발적으로 일어나는 세트 사건은 모두 수형도 가지 치기 방식으로 ‘곱(×)’ 해야 하며, 양립할 수 없이 둘 중 하나만 선택(OR) 할 땐 ‘합(+)’을 해야 경우의 수가 나오게 됩니다.
- 파이썬
itertools.product: 여러 카테고리 속에서 원소를 1개씩 순회하며 뽑아내 곱의 법칙 모델에 맞게 수천 개의 모든 쌍(튜플) 조합 리스트를 자동 산출해 내는 수학적 데카르트 곱 코딩 모듈입니다.
서브목차