From ffce2b9bfce77f3a01e0f0d5ac295df25cc92730 Mon Sep 17 00:00:00 2001
From: th-kim0823
Date: Sat, 25 Apr 2026 19:05:20 +0900
Subject: [PATCH] =?UTF-8?q?fix:=20EffTech=20=EC=8B=A0=EA=B7=9C=20=ED=95=A9?=
=?UTF-8?q?=EB=A5=98=20=ED=99=94=ED=95=A9=20=EC=9C=84=ED=95=B4=20=EB=AA=A8?=
=?UTF-8?q?=EB=93=A0=20=ED=8C=80=EC=97=90=20EffTech=201=EB=AA=85=20?=
=?UTF-8?q?=EC=9D=B4=EC=83=81=20=ED=95=84=EC=88=98?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
기존 제약(같은 부서 ≤2명) 만으로는 EffTech 0명인 팀 발생 (재배정 전 팀2).
신규 부서 ≥1명 제약 추가로 모든 팀이 기존-신규 섞이도록 보장.
Co-Authored-By: Claude Opus 4.7 (1M context)
---
assign_teams.py | 26 ++++++++++++++-----
participants.json | 66 +++++++++++++++++++++++------------------------
2 files changed, 52 insertions(+), 40 deletions(-)
diff --git a/assign_teams.py b/assign_teams.py
index 58edaa9..a2ea78f 100644
--- a/assign_teams.py
+++ b/assign_teams.py
@@ -51,23 +51,35 @@ TEAM_SIZE = 5
MAX_SAME_DEPT = 2
SEED = 20260428 # 행사일 시드 (재현 가능)
+# EffTech 신규 합류 → 모든 팀에 ≥1명 필수 (화합 목표)
+NEW_DEPT = "AI Efficiency Tech"
+MIN_NEW_PER_TEAM = 1
+
+
+def is_valid(teams):
+ for team in teams:
+ depts = [d for _, d in team]
+ # 같은 부서 ≤ 2명
+ if max(Counter(depts).values()) > MAX_SAME_DEPT:
+ return False
+ # 신규 부서 ≥ 1명
+ if depts.count(NEW_DEPT) < MIN_NEW_PER_TEAM:
+ return False
+ return True
+
def assign(seed):
rng = random.Random(seed)
- for attempt in range(5000):
+ for attempt in range(20000):
shuffled = PEOPLE[:]
rng.shuffle(shuffled)
teams = [
shuffled[i * TEAM_SIZE : (i + 1) * TEAM_SIZE]
for i in range(NUM_TEAMS)
]
- ok = all(
- max(Counter(d for _, d in team).values()) <= MAX_SAME_DEPT
- for team in teams
- )
- if ok:
+ if is_valid(teams):
return teams, attempt + 1
- raise RuntimeError(f"제약 만족하는 배정 5000회 시도에도 실패")
+ raise RuntimeError("제약 만족하는 배정 20000회 시도에도 실패")
def main():
diff --git a/participants.json b/participants.json
index 640e38a..86994a4 100644
--- a/participants.json
+++ b/participants.json
@@ -1,37 +1,37 @@
{
- "유준희": "팀1",
- "김재현": "팀1",
- "조민정": "팀1",
+ "서한배": "팀1",
+ "서희": "팀1",
+ "김호승": "팀1",
"손현준": "팀1",
- "유용혁": "팀1",
- "한지승": "팀2",
- "김정명": "팀2",
- "박재호": "팀2",
- "김동국": "팀2",
+ "김동국": "팀1",
"장혁진": "팀2",
- "강승형": "팀3",
- "김태현": "팀3",
- "김민섭": "팀3",
- "이성재": "팀3",
- "길주현": "팀3",
- "서한배": "팀4",
- "최호진": "팀4",
- "김영관": "팀4",
- "이정태": "팀4",
- "박영훈": "팀4",
- "유지원": "팀5",
- "전효준": "팀5",
- "정현준": "팀5",
- "장다현": "팀5",
- "정채윤": "팀5",
- "오근현": "팀6",
- "이준형": "팀6",
- "이준석": "팀6",
- "서희": "팀6",
- "김호승": "팀6",
- "이재광": "팀7",
- "이지환": "팀7",
- "김병훈": "팀7",
- "심성환": "팀7",
- "변수민": "팀7"
+ "이준형": "팀2",
+ "김재현": "팀2",
+ "이정태": "팀2",
+ "장다현": "팀2",
+ "김영관": "팀3",
+ "정현준": "팀3",
+ "이재광": "팀3",
+ "최호진": "팀3",
+ "한지승": "팀3",
+ "이성재": "팀4",
+ "유지원": "팀4",
+ "정채윤": "팀4",
+ "박재호": "팀4",
+ "강승형": "팀4",
+ "변수민": "팀5",
+ "김민섭": "팀5",
+ "이지환": "팀5",
+ "오근현": "팀5",
+ "조민정": "팀5",
+ "길주현": "팀6",
+ "심성환": "팀6",
+ "김병훈": "팀6",
+ "전효준": "팀6",
+ "유용혁": "팀6",
+ "김정명": "팀7",
+ "이준석": "팀7",
+ "박영훈": "팀7",
+ "김태현": "팀7",
+ "유준희": "팀7"
}
\ No newline at end of file