← KNN 알고리즘 교실

🏁 KNN 땅따먹기 (k-NN Board Game)

친구 2~5명과 즐기는 k-NN 보드 게임 — 숨은 별을 결과만 듣고 추리하거나, 다 놓은 뒤 떨어지는 별을 두고 겨루거나. 두 모드 모두 1·2라운드 K=1 → 3라운드부터 K=3 다수결, k-NN 분류 그 자체입니다.

📖 따라하기 가이드 — 1 / 6 단계

Step 1. 별⭐은 누구 땅일까? — KNN을 게임으로

이 게임은 k-NN(k개 최근접 이웃) 그 자체예요. 별⭐이 분류할 새 데이터, 여러분이 놓는 말이 학습 데이터, 각 플레이어가 클래스(편)입니다. 별에서 가까운 말들이 투표해서 별이 누구 땅인지 정해요. 모드가 두 가지 — 🕵️ 숨은 별 추리전과 🌠 별똥별 모드가 있어요.
📚 KNN 원리 탐구 수업1차시 숨은 규칙 찾기 · 4차시 K 바꾸어 보기 · 5차시 우리 모둠 분류기수업 페이지로 →

🎮 게임 준비

모드를 고르세요

공통 규칙: 1·2라운드 K=1 → 3라운드부터 K=3 다수결 · 표가 갈리면 무승부(모두 1점)

몇 명이 할까요?
🔵
🔴
🎨 보드 테두리 색 = 지금 놓을 사람
⚪ 색 원 = 각자의 말 (숫자 = 놓은 라운드)
⭐ 별 = 판정 기준 — 끝까지 비밀!
🟡 노란 점선 원 = 투표한 이웃들
♻️ 말은 사라지지 않아요 — 다음 라운드 투표에도 참여!

🏆 점수판

게임을 시작하면 점수가 표시돼요.

라운드
—
현재 K
—

🧪 이렇게 놀아 보세요

  1. 🕵️ 추리전: K=1 결과로 방향을 좁히고, 3라운드부턴 그 지점을 2~3개 말로 에워싸세요 — 다수결 역전!
  2. 🌠 별똥별: 초반엔 넓게 나눠 덮고, 3라운드부턴 유망한 곳에 뭉치세요.
  3. 같은 멤버로 두 모드를 한 판씩 — 어느 쪽이 더 실력 게임일까요?
  4. K가 커지면 왜 "딱 붙은 말" 하나의 힘이 약해질까? (힌트: 이상치)
  5. 모둠 대항전 뒤 우승 전략 발표 — "왜 그 자리에 놓았나?"

🧮 수식과 파이썬

별의 주인 = 다수결( 별에서 가까운 k개 말의 주인들 )
k-NN 분류: 새 데이터(별)에서 가장 가까운 k개 이웃이 다수결 투표 — 두 모드 모두 이 규칙 하나로 판정해요 (1·2라운드 k=1, 3라운드부터 k=3).
🐍 파이썬 코드로 보면? (펼치기)
import math
from collections import Counter

# 이 게임의 판정 로직 그대로 — k-NN 다수결 분류
def knn_owner(markers, target, k):
    """markers: [(x, y, 주인)], target: (x, y) — 별은 누구 땅?"""
    by_dist = sorted(markers, key=lambda m: math.dist((m[0], m[1]), target))
    votes = Counter(owner for _, _, owner in by_dist[:k])
    return votes.most_common(1)[0][0]

markers = [
    (7, 6, "파랑"),   # 별에 제일 가까운 말!
    (8, 8, "빨강"), (6, 8, "빨강"),   # 하지만 빨강이 2개로 에워쌌다
    (2, 12, "파랑"),
]
target = (7, 7)
print("K=1:", knn_owner(markers, target, 1))   # 파랑 — 1·2라운드(K=1) 판정
print("K=3:", knn_owner(markers, target, 3))   # 빨강 — 3라운드부터의 다수결!