2026년 9월 7일 월요일

[교사·고사관리] 학년 연합 정기고사 지그재그 분반 좌석표 생성기 - 1분 만에 완성



지그재그로 부정행위를 원천 차단하는 '학년 연합 정기고사 & 학업성취도 평가 분반 좌석표 생성기'

🪄 교사·고사관리 — 1학기 지필평가나 국가수준 학업성취도 평가 시 1반과 2반 학생들을 1열씩 번갈아 지그재그(1반-2반-1반-2반)로 교차 배치하여 부정행위를 원천 차단하고, 교실 부착용 좌석표와 감독관용 명단을 즉시 출력합니다. 수작업으로 며칠씩 걸리던 시험 분반 좌석 배치 업무를 1분 만에 완료합니다.

📖 한 줄 정의

심기 모드(데이터 임베딩): API 데이터를 미리 받아 HTML 파일 안 상수로 박아두는 방식(앱 실행 중 외부 통신 0).

학내망 원칙: 학생 개인정보(실명·의견·성적·상담 기록)의 외부 수집·저장·전송 금지(쿼리에 학생 데이터가 담기는 외부 API 호출 포함) — 일반 공개 쿼리의 외부 호출은 허용하며, 학생 배포본은 심기 폴백(EMBED 상수)을 항상 내장한다.

1. 3대 핵심 분석 비교표

무엇이 바뀌었나요? / 영역 초보자를 위한 쉬운 설명 이렇게 한번 써보세요!
지그재그 교차 알고리즘 1번(1반), 1번(2반), 2번(1반), 2번(2반)처럼 각 행에 두 학급의 번호가 번갈아 배치되어 인접 학생이 같은 반 학생이 되지 않게 합니다. 두 학급 명단 CSV를 업로드하면 지그재그 교차 자동 조판.
수험번호 자동 부여 좌석 배치가 끝나면 좌측 상단부터 일련번호(수험 번호)가 자동으로 부여되어 감독관용 명단에 표기됩니다. 행(row) × 열(column) 좌표를 수험번호로 변환.
교실 부착용 & 감독관용 이중 출력 교실 벽에 붙일 대형 좌석도와 감독관이 챙겨 가는 명단 목록을 각각의 레이아웃으로 자동 생성합니다. @media print 서식으로 A4 가로 2장 출력.

2. 핵심 아키텍처 해설

① 학생 명단 CSV 업로드 및 파싱

const CLASS_A = ["김하늘", "이지원", "박민준", ...]; // 1반 명단
const CLASS_B = ["정서윤", "최도현", "강소현", ...]; // 2반 명단

function interleave(a, b) {
  const result = [];
  const maxLen = Math.max(a.length, b.length);
  for (let i = 0; i < maxLen; i++) {
    if (a[i]) result.push({ name: a[i], class: "1반" });
    if (b[i]) result.push({ name: b[i], class: "2반" });
  }
  return result;
}

두 학급 명단을 순서대로 번갈아 끼워 넣는(교차 배치) 순수 알고리즘입니다.

② 행·열 좌표 기반 수험번호 부여

function seatNumber(row, col, colsPerRow) {
  return row * colsPerRow + col + 1;
}
// 예: 6열 × 5행 좌석에서 3행 4열 = 19번
// 1행 1열부터 왼쪽→오른쪽, 위에서 아래로 순차 부여

좌석 배치가 완료되면 좌표 좌상단부터 1번, 2번... 순차적으로 수험번호가 부여되어 감독관용 명단에 연결됩니다.

③ @media print 이중 서식 (교실 부착용 + 감독관용)

@media print를 적용하여 화면 표시 모드와 별도로 A4 가로 방향 인쇄 시 교실 벽에 부착할 대형 좌석 격자표와 감독관용 학생 목록이 2장으로 분리되어 출력됩니다.

3. 초보자를 위한 바이브 코딩 실전 사용 예시

  1. 프롬프트 복사 — 아래 '제미나이 전용 에러 제로 프롬프트'를 복사합니다.
  2. 역질문 답변 — 제미나이가 묻는 학급 인원수(각 반 20~28명), 좌석 열 수, 시험 과목명에 답합니다.
  3. HTML 파일 실행 — 메모장에 붙여넣고 고사좌석표.html로 저장하여 고사계에서 인쇄합니다.

제미나이 전용 에러 제로 프롬프트

[🚨 에러 방지 기본 안전장치]
1. 단일 HTML 파일 완결성: 외부 라이브러리(CDN) 없이 순수 바닐라 HTML/CSS/JS로 완성한다.
2. 심기 모드(데이터 임베딩): const CLASS_A = [...] 및 const CLASS_B = [...] 상수에 각 학급 학생 닉네임(또는 실명)을 심어두고 즉시 실행되도록 한다.
3. 지그재그 교차 배치 알고리즘: 1반과 2반을 행(row) 단위로 번갈아 교차 배치하여 인접 학생이 같은 반 학생이 되지 않도록 한다.
4. 수험번호 자동 부여: 좌석 행·열 좌표 기준으로 좌측 상단부터 1번, 2번 순차 부여.
5. @media print 서식: 교실 부착용(대형 격자표)과 감독관용(명단 목록) 2장으로 분리 출력.
6. 학생 개인정보: 학급 내부 관리용이므로 학생 실명 사용을 허용하되, 외부로 전송하지 않는다(단일 HTML 오프라인).
7. // TODO, /* 생략 */ 등의 미완성 코드는 절대 넣지 말고 끝까지 완성한다.

[❓ 역질문 유도]
코드를 즉시 작성하지 말고, 아래 3가지 질문을 먼저 나에게 던져줘:
1. 학년 연합 시험에서 몇 개 학급(1반, 2반 외에도?)을 섞을까요?
2. 좌석 행(rows)과 열(columns)은 몇 줄씩 배치할까요? (예: 5행 × 6열)
3. 교실 부착용 좌석표를 가로 방향(A4 landscape)으로 출력할까요?

🎯 에디터 한줄평

"시험지에 다른 학생 답을 엿보려는 눈은, 인접 좌석이 같은 반 학생이 아닐 때 가장 먼저 포기합니다. 지그재그 알고리즘은 단순한 교차 배치이지만, 그것을 누가 어떤 순서로 배치했는지가 아닌 '규칙 그 자체'로 무결성을 증명할 때 고사계 교사는 진짜 투명성을 확보하게 됩니다."

📚 기술·교육 참고 링크

  • 교육부 학업성취도 평가 표준 관리지침 및 학급별 좌석표 표준 양식
  • 교육과정 연계: 교무 고사 관리, 초등 6학년 학업성취도 평가(수학, 국어, 과학)