5. 공간을 교직(Weaving) 하는 함수: ‘도형과 조합’
[도입부] 학습 목표 (Learning Objectives)
- 조합(Combination) 구조가 단순히 인구 뽑기, 사탕 뽑기 수준을 넘어서서 기하학(Geometry) 의 선(Line) 과 면(Face) 을 직조해 내는 궁극의 ‘공간 생성기’ 로 작동하는 원리를 파악합니다.
- 꼭짓점 중 2개를 고르면(${}_n\mathrm{C}_2$) 모든 선분과 대각선이 나타나고, 3개를 고르면(${}_n\mathrm{C}_3$) 우주를 구성하는 가장 완벽한 폴리곤인 삼각형이 탄생하는 렌더링 매커니즘을 경험합니다.
- 파이썬(Python)의
matplotlib와 수식 제어 로직을 통해, 수십 개의 점을 던져놓고 가능한 모든 연결선(네트워크 엣지 Edge) 을 1초 만에 가시화하는 그래픽 코드를 구축합니다.
1. 선분(Line) 의 탄생: 2개의 점이 만날 때
수학자 유클리드는 “두 점을 이으면 선분이 된다” 고 했습니다. 평면 위에 엉망진창으로 찍혀 있는 점 10개가 있습니다. (단, 3개의 점이 1 직선 위에 있는 못된 함정은 없다고 칩시다.) 이 점 10개를 가지고 서로 연결해서 만들 수 있는 ‘모든 선분의 개수’ 를 찾아볼까요?
당신은 연필로 $\star$ 모양을 그리고 육망성도 그리는 허튼짓을 멈춰야 합니다.
“점 10개 중에서 순서에 상관없이 딱 2개(r=2) 의 점을 한 움큼 뽑아보자!” $\rightarrow$ ${}_{10}\mathrm{C}_2$
그렇습니다! A점과 B점을 동시에 뽑든, B와 A를 뽑든 어차피 그 둘을 이으면 1개의 똑같은 막대기(선분) 가 될 뿐이므로 조합의 속성과 100% 미친 듯이 일치합니다.
- 전체 선분의 개수: $\frac{10 \times 9}{2 \times 1} = \mathbf{45}$개!
[대각선 솎아내기 (해킹)] 그렇다면 저 45개의 빽빽한 선들 중에서 오각형, 십각형의 뼈대(테두리) 를 이루는 모서리를 제외한, 순수한 ‘내부 대각선’ 만 남기려면 어떡해야 할까요? 전체 선분(45개) 에서 바깥 테두리에 해당하는 선분 10개를 단순 무식하게 삭제(빼기) 하면 됩니다.
$n$각형 대각선의 공식: ${}_n\mathrm{C}_2 - n$
2. 면(Face) 의 탄생: 3차원 우주 폴리곤 (nC3)
스타크래프트나 3D 모델링 스캐너로 얼굴을 스캔해 보면 거미줄처럼 엮인 무수한 와이어프레임(Wireframe) 들이 사실 전부 작은 ‘삼각형(Polygon)’ 타일들로 만들어져 있음을 볼 수 있습니다.
평면상의 10개 점으로 얼마나 많은 수의 삼각형을 찍어낼 수 있을까요?
“점 10개 중에서 순서 따위 무시하고 딱 3개(r=3) 를 동시에 뽑아보자!” $\rightarrow$ ${}_{10}\mathrm{C}_3 = \frac{10 \times 9 \times 8}{3 \times 2 \times 1} = \mathbf{120}$개!
10개의 점만 공간에 던져둬도 무려 120개의 방패(면) 가 생성됩니다. 점을 4개 뽑으면(${}_n\mathrm{C}_4$) 사각형이 만들어집니다. 조합론은 이처럼 단 한 줌의 데이터(점, Node) 를 이용해 수천, 수만 개의 인적 네트워크 연결망(Edge/Line) 과 데이터 그룹(Face) 을 무한으로 창조해 내는 컴퓨터 그래픽스의 심장에 해당합니다.
3. 💻 파이썬(Python) 네트워크 노드 엣지 폭발기
우주에 8개의 주요 항성(별) 이 있습니다. 우주선 통신망을 구축하기 위해 8개의 별을 $1:1$ 지점 간(Point to Point) 직통 통신선으로 모조리 연결하면 몇 개의 광케이블이 필요할까요?
itertools 조합 모듈을 통해 모든 통신 라인 튜플 쌍을 뽑아 봅시다.
🐍 파이썬 예제: N-to-N 네트워크(선분) 생성기
import itertools
import math
print("--- 🔌 클라우드 통신망 구축: 1:1 전용선(Edge) 최적화 시스템 ---")
# 태양계 주변 8개의 행성 기지 (Node)
planets = ['수성', '금성', '지구', '화성', '목성', '토성', '천왕성', '해왕성']
# 총 기지 개수
n_node = len(planets)
# 직통선(선분) 연결은 무조건 2개의 역(Node) 을 고르는 조합(Combination) 이다!
required_lines = math.comb(n_node, 2)
# 실제로 그 라인들(선분 데이터)을 리스트로 뽑아내 보기
all_edges = list(itertools.combinations(planets, 2))
print(f" [시스템 점검] 기지 수: {n_node}개 -> 2개를 묶는 콤비네이션 연산 개시.")
print("-" * 50)
print(f" 🌐 [네트워크 설계] 시스템 완성에 필요한 고유 통신선의 총 개수는 [ {required_lines}개 ] 입니다!")
print(" (세부 연결망 케이블 내역:)")
for idx, edge in enumerate(all_edges, 1):
print(f" -> 케이블 {idx:02d}: {edge[0]} <=====> {edge[1]}")
# 만약 기지 중 3개를 골라 삼각 방위 위성 시스템(면) 을 만든다면?
# tri_satellites = math.comb(8, 3) = 56 개의 삼각형 탄생!
# 결과창:
# --- 🔌 클라우드 통신망 구축: 1:1 전용선(Edge) 최적화 시스템 ---
# [시스템 점검] 기지 수: 8개 -> 2개를 묶는 콤비네이션 연산 개시.
# --------------------------------------------------
# 🌐 [네트워크 설계] 시스템 완성에 필요한 고유 통신선의 총 개수는 [ 28개 ] 입니다!
# (세부 연결망 케이블 내역:)
# -> 케이블 01: 수성 <=====> 금성
# -> 케이블 02: 수성 <=====> 지구
# ... (중략)
# -> 케이블 28: 천왕성 <=====> 해왕성
이 알고리즘은 단지 선분에 그치지 않고 페이스북이나 인스타그램의 추천 친구 알고리즘(A와 B의 상호 관계 선 긋기) 에서 시스템 연산량이 얼마나 폭증하는지 판단하는 ‘빅 오(Big-O)’ 복잡도를 측정하는 첫걸음이 됩니다.
[결론] 학습 정리 (Summary)
- 선분 네트워크 (${}_n\mathrm{C}_2$): 공간상에 존재하는 $n$개의 데이터 노드(점) 중 무조건 2개를 차별 없이 고르는 조합 연산은, 고스란히 1개의 연결선(선분, 네트워크 다리) 이 탄생하는 기하학적 의미와 직결됩니다.
- 면의 생성 (${}_n\mathrm{C}_3$): 3개의 점을 동시에 선택하면 시스템은 자동으로 최소 크기의 면(Polygon/삼각형) 1개를 조형하게 됩니다.
- 이 로직들은 3D 게임 그래픽스 연산 엔진의 부하 한계점, 혹은 글로벌 데이터 패킷의 우회 경로망을 구축할 때 쓰이는 조합론의 찬란한 물리적 적용 사례입니다.