// post
중학교 입학배정 알고리즘을 만들며 배운 것
2026년 6월 28일
지망 정보와 주소, 교육지원청 기준, 난수 요소를 함께 다루는 입학배정 로직을 설계하며 배운 점을 정리한 회고입니다.
중학교 입학배정 시스템을 다루며 가장 먼저 배운 것은 알고리즘이 복잡해서 어려운 것이 아니라, 공정성을 설명해야 해서 어렵다는 점이었다. 코드 안에서는 조건문 몇 개와 정렬 규칙처럼 보일 수 있지만, 실제로는 학생의 지망 정보와 주소지, 교육지원청 기준, 추첨 요소가 함께 맞물린다. 어느 한 조건만 잘못 이해해도 결과에 대한 신뢰가 흔들릴 수 있었다. 그래서 구현보다 먼저 배정 규칙을 사람이 읽을 수 있는 순서로 다시 풀어 쓰는 데 시간을 많이 썼다.
내가 중요하게 본 기준은 세 가지였다. 첫째, 우선순위가 섞이지 않도록 입력값을 명확히 구분할 것. 둘째, 추첨이 들어가는 구간은 재현 가능한 형태로 남길 것. 셋째, 배정 결과를 보고 왜 그렇게 나왔는지 설명할 수 있을 것. 특히 난수는 공정성을 위한 장치이지만, 기록이 남지 않으면 오히려 불신의 원인이 된다. 그래서 단순히 결과만 저장하는 것이 아니라, 어떤 기준 단계에서 후보가 좁혀졌는지 흐름을 따라갈 수 있게 설계하는 쪽이 훨씬 중요했다.
이 작업을 하면서 데이터 정합성의 무게도 크게 느꼈다. 알고리즘이 아무리 깔끔해도 주소 정보나 학교 코드가 기대한 형식과 다르면 전체 결과가 흔들린다. 결국 좋은 배정 로직은 화려한 수식보다 입력 데이터 검증과 예외 처리에서 완성된다는 생각을 하게 됐다. 운영 단계에서는 코드보다 데이터 보정 문의가 더 자주 들어왔고, 그 경험 덕분에 나는 로직 개발과 데이터 점검을 분리해서 보지 않게 됐다.
지금 돌아보면 이 프로젝트는 단순한 조건 분기 구현이 아니라 행정 규칙을 소프트웨어 언어로 번역하는 작업에 가까웠다. 배정 알고리즘은 빠르게 끝내는 코드보다, 나중에 감사나 문의가 들어와도 같은 답을 할 수 있는 구조여야 한다. 다음에 비슷한 공공 로직을 맡는다면 구현 문서와 테스트 케이스를 더 일찍 짝지어 두고 시작할 생각이다.