fix: EffTech 신규 합류 화합 위해 모든 팀에 EffTech 1명 이상 필수
기존 제약(같은 부서 ≤2명) 만으로는 EffTech 0명인 팀 발생 (재배정 전 팀2). 신규 부서 ≥1명 제약 추가로 모든 팀이 기존-신규 섞이도록 보장. Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
This commit is contained in:
@@ -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():
|
||||
|
||||
@@ -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"
|
||||
}
|
||||
Reference in New Issue
Block a user