배려 조건을 지키는 자리 배치가 3초에 끝난다 — 조건 만족 자리 배치 & 1인 1역 매칭 완전 정복
🪑 매월 초 자리 바꾸기 — '앞자리가 필요한 학생', '짝을 분리해 달라는 요청'을 조건 코드로 입력하면 조건 만족(constraint satisfaction) 알고리즘이 배치도를 3초 만에 완성하고, 1인 1역 당번까지 자동 배정합니다.
개인정보 설계가 핵심입니다: 시력·키·성별 같은 민감 정보를 저장하지 않고 '앞자리 필요''짝 분리' 같은 배려 조건 코드만 다룹니다(정보의 최소 수집). 기록은 CSV 내보내기(로컬 파일) — 자동 외부 전송 없음, 학급 시트 관리는 교사 수동.
📖 한 줄 정의
심기 모드(데이터 임베딩): API 데이터를 미리 받아 HTML 파일 안 상수로 박아두는 방식(앱 실행 중 외부 통신 0).
학내망 원칙: 학교 배포 웹앱은 개인정보 수집·저장·전송 없음(외부 CDN·API 호출 0, 단일 파일) — 학생은 학내망에서 교사 PC 서버에 접속.
1. 3대 핵심 분석 비교표
| 무엇이 바뀌었나요? / 영역 | 초보자를 위한 쉬운 설명 | 이렇게 한번 써보세요! |
|---|---|---|
| 월간 운영 리듬 | 매월 초 — 조건 입력(5분) → 배치 실행(3초) → 배치도·당번 확인 → CSV 기록. 담임의 머리 아픈 일이 한 자리에 끝납니다. | 월간 리듬표 3단으로 운영. |
| 조건 만족 알고리즘 | 조건이 많은 학생부터 배정하고, 앞자리 필요는 앞 2열, 짝 분리는 인접 금지를 검사합니다. 조건을 못 만족하면 '회의 제안' 안내를 표시합니다. | canSit 함수로 조건 검사 원리 이해. |
| 배려 조건 코드 | 건강·신체 정보를 저장하지 않고 '앞자리 필요''짝 분리' 코드만 — 조건은 학생 제안으로 모둠 회의에서 정합니다(학급자치). | 조건 코드 3종으로 시작해 확장. |
| 3D 배치도 | CSS 원근(perspective)으로 살짝 기울어진 3D 격자로 그립니다 — 전자칠판에서 옆 반 학생도 한눈에 봅니다. | chart3d 클래스 3줄. |
| 1인 1역 매칭 | 누적 횟수가 가장 적은 학생부터 역할을 배정해 매월 공평해집니다 — 배정 기록은 CSV로 누적(외부 전송 없음). | assignRoles 함수로 공평 배분. |
2. 핵심 아키텍처 해설
① 데이터: 번호·닉네임과 조건 코드
const STUDENTS = [
{ no: 1, nick: "코알라", front: true, apart: 0 },
{ no: 2, nick: "돌고래", front: false, apart: 7 }
];
front는 '앞자리 필요', apart는 '분리할 짝의 번호(0이면 없음)'. 시력·키·성별 같은 건강·신체 정보는 저장하지 않습니다 — 배려는 조건 코드로만 표현되고, 어떤 코드가 누구에게 붙었는지는 학생·교사만 아는 아날로그 영역입니다.
② 조건 검사: canSit
function canSit(p, seat, placed) {
if (p.front && seat.col > 2) return false; // 앞자리 필요 → 앞 2열만
if (p.apart > 0) {
for (const o of placed) {
if (o.no === p.apart && isNeighbor(o.seat, seat)) return false;
}
}
return true;
}
배정할 자리가 모든 조건을 통과하는지 검사하는 함수 — 조건 만족(constraint satisfaction)의 가장 작은 단위입니다.
③ 배치 실행: 조건 많은 학생부터
function placeAll() {
const report = [];
for (const p of byPriority(STUDENTS)) { // 조건 많은 순
const ok = SEATS.find(function (s) {
return !occupied(s) && canSit(p, s, placed);
});
if (ok) place(p, ok);
else report.push(p.nick + " 조건 미충족 — 모둠 회의 제안");
}
return report;
}
조건이 까다로운 학생부터 자리를 줍니다. 조건을 다 못 만족하면 실패를 숨기지 않고 '회의 제안'으로 표시 — 배치가 협상의 출발점이 됩니다.
④ 3D 배치도: CSS 원근
.chart3d { perspective: 900px; }
.chart { transform: rotateX(45deg); transform-style: preserve-3d; }
.desk { transform: translateZ(8px); }
교실 격자를 살짝 기울여 보면 자리 사이 간격이 공간처럼 보입니다 — '3D 배치도'가 라이브러리 없이 CSS 세 줄로 완성됩니다.
⑤ 1인 1역 매칭 + 기록
function assignRoles(roles, history) {
return shuffle(roles.slice()).sort(function (a, b) {
return count(history, a) - count(history, b);
});
}
// 배치도·당번표는 CSV 내보내기로 로컬 파일 저장 — 외부 전송 없음
역할별 누적 횟수가 적은 순으로 배정해 매월 공평해집니다. 배치도와 당번표는 CSV 내보내기로 로컬 파일로 남기고, 학급 시트로 옮기는 것은 교사의 수동 관리입니다(자동 외부 전송 없음).
3. 따라하기 3단계
- 제미나이 전용 에러 제로 프롬프트를 복사해 Gemini에 붙여넣습니다.
- AI가 던지는 역질문 3가지(교실 격자, 조건 코드 종류, 역할 목록)에 답하면 단일 HTML 코드가 완성됩니다.
- 코드를
자리배치.html로 저장 후 더블클릭 — 조건 입력 → 배치 실행 → 당번 확인의 월간 리듬이 시작됩니다.
제미나이 전용 에러 제로 프롬프트
[🚨 에러 방지 기본 안전장치]
1. 결과물은 외부 라이브러리·폰트·이미지 없이 단일 HTML 파일로 완성한다 — 더블클릭 즉시 실행(서버·설치·회원가입·구글 시트 API·Apps Script 금지).
2. 학생 표기는 번호·닉네임만 다룬다(실명·시력·키·성별 저장 금지) — 배려 조건은 '앞자리 필요''짝 분리' 코드만(정보의 최소 수집).
3. 조건 만족 알고리즘: 조건 많은 학생부터 배정, 앞자리는 앞 2열, 짝 분리는 인접 금지. 미충족 시 실패를 숨기지 말고 '모둠 회의 제안' 문구로 표시.
4. 배치도는 CSS 원근(perspective)으로 살짝 기울어진 3D 격자 — 전자칠판에서도 잘 보이게.
5. 1인 1역은 역할별 누적 횟수 최소 우선으로 자동 배정 — 매월 기록이 쌓여 공평해진다.
6. 배치도·당번표는 CSV 내보내기로 로컬 파일 저장 — 자동 외부 전송 없음(학급 시트는 교사 수동).
7. 조건·명단은 파일 상단 상수로 심기(학내망 배포용 외부 통신 0), 전자칠판 터치 대응(버튼 88px 이상).
8. // TODO, /* 생략 */ 금지 — 끝까지 완성한다.
[❓ 역질문 유도]
코드를 바로 만들지 말고, 아래 3가지를 먼저 질문한 뒤 내 답변으로 설계를 확정한다.
Q1. 교실 격자는? (행×열 — 예: 5행×6열)
Q2. 배려 조건 코드는 몇 종? (기본 3: 앞자리 필요 / 짝 분리 / 자리 고정)
Q3. 1인 1역 목록은? (우리 반 역할 12개 — 학급 회의에서 확정)🎯 에디터 한줄평
자리 배치는 담임 교사의 월간 최대 고민거리입니다. 조건을 코드로 명시하는 순간, 배치는 협상이 아니라 연산이 됩니다 — 그리고 코드에 담긴 조건은 모두 학생들이 제안한 것들입니다. 교실 복지의 민주화가 한 파일 안에서 일어나는 셈이죠. '저장하지 않는 배려'(건강 정보를 아예 다루지 않는 설계)는 정보의 최소 수집을 몸으로 가르치는 교과서입니다.
📚 기술·교육 참고 링크
- MDN — CSS 변형(transforms) : 3D 격자 배치도의 원리
- 교육과정 연계: 창의적 체험활동(학급자치), 수학(알고리즘과 조건 판단 사고)으로 확장