🎓
SG상담플랫폼
로그인
SG상담플랫폼
로그인하면 아래 기능을 이용할 수 있어요
🔒 로그인 후 이용할 수 있어요
로그인하기
닫기
✕
🎓
SG상담플랫폼
아이디와 비밀번호를 입력하세요
아이디
비밀번호
로그인 상태 유지 (공용 PC에서는 해제)
로그인
파일버전: 2026-05-04 08:19
⚠ 로그인이 안 되시나요?
🔄 브라우저 데이터 초기화 후 재시작
※ 데이터는 Firebase에 백업되어 있어 복구됩니다
<!DOCTYPE html> <!-- saved from url=(0221)file:///C:/Users/user/Downloads/APEX_V26%ED%94%8C%EB%9F%AC%EC%8A%A4_%ED%94%84%EB%A6%AC%EB%AF%B8%EC%97%84%ED%95%99%EC%83%9D%EC%84%A4%EB%AC%B8_%EC%A4%9112_%EC%9D%B8%EC%87%84%EC%9E%98%EB%A6%BC%EC%88%98%EC%A0%95%EB%B3%B8.html --> <html lang="ko"><head><meta http-equiv="Content-Type" content="text/html; charset=UTF-8"> <title>APEX 학업역량 정밀진단 시스템 V26</title> <style> @import url('https://cdn.jsdelivr.net/gh/orioncactus/pretendard/dist/web/static/pretendard.css'); :root { --primary: #1A237E; --secondary: #1A73E8; --gold: #b8860b; --gold-bg: #fff9e6; --border: #e0e0e0; --text-main: #333333; --bg-light: #f4f7f9; --danger: #d32f2f; } * { box-sizing: border-box; } body { font-family: 'Pretendard', sans-serif; background: var(--bg-light); margin: 0; padding: 20px; color: var(--text-main); line-height: 1.5; } .container { max-width: 1050px; margin: 0 auto; } .no-print { margin-bottom: 30px; padding: 35px; background: white; border-radius: 12px; box-shadow: 0 4px 20px rgba(0,0,0,0.08); border-top: 5px solid var(--primary); } .input-grid { display: grid; grid-template-columns: repeat(auto-fit, minmax(200px, 1fr)); gap: 15px; margin-bottom: 20px; } .input-grid div { display: flex; flex-direction: column; } .input-grid label { font-size: 0.9em; font-weight: 700; color: var(--primary); margin-bottom: 5px; } .input-grid input, .input-grid select { padding: 8px 10px; border: 1px solid #ccc; border-radius: 5px; font-family: 'Pretendard'; font-size:0.9em; } .grade-table { width: 100%; border-collapse: collapse; margin-top: 8px; text-align: center; font-size: 0.85em; background: white; } .grade-table th { background: #e1e9ff; color: var(--primary); padding: 8px; border: 1px solid #b3d4ff; font-weight: 800; } .grade-table td { padding: 6px; border: 1px solid #b3d4ff; font-weight:bold; } .grade-table select { width: 100%; padding: 4px; border: 1px solid #ccc; border-radius: 4px; text-align: center; font-weight: bold; color: #333; cursor: pointer; } .page { background: white; padding: 45px 50px; margin-bottom: 40px; box-shadow: 0 10px 30px rgba(0,0,0,0.1); border-radius: 8px; position: relative; overflow: hidden; page-break-after: always; width: 100%; max-width: 210mm; min-height: 297mm; margin: 0 auto 40px auto; } .report-header { border-bottom: 3px solid var(--primary); padding-bottom: 10px; margin-bottom: 20px; } .report-header .title-area { display: flex; justify-content: space-between; align-items: flex-end; } .report-header h1 { color: var(--primary); margin: 0; font-size: 1.8em; font-weight: 900; letter-spacing: -1px; } .report-header .sub-text { color: var(--secondary); font-weight: 700; font-size: 0.95em; margin-top: 3px; } h3 { color: var(--secondary); font-size: 1.25em; border-left: 6px solid var(--secondary); padding-left: 12px; margin-top: 25px; margin-bottom: 15px; } .cover-content { height: 100%; min-height: 250mm; display: flex; flex-direction: column; justify-content: center; align-items: center; border: 12px double var(--primary); padding: 40px; } .cover-title { font-size: 3.6em; font-weight: 900; color: var(--primary); text-align: center; margin-bottom: 30px; letter-spacing: -2px; } .cover-desc { font-size: 1.05em; line-height: 1.8; color: #444; max-width: 850px; text-align: justify; background: #f8f9fa; padding: 30px; border-radius: 12px; border-left: 8px solid var(--secondary); } .info-table { width: 500px; border-collapse: collapse; margin-top: 50px; } .info-table td { padding: 15px; border-bottom: 2px solid var(--primary); font-size: 1.2em; font-weight: 800; } .info-table .label { color: var(--primary); width: 120px; text-align: left; } .survey-grid { display: grid; grid-template-columns: 1fr 1fr; gap: 8px 30px; margin-top: 10px; } .survey-item { border-bottom: 1px solid #eee; padding: 6px 0; display: flex; justify-content: space-between; font-size: 0.88em; align-items: flex-start; } .survey-item .q { color: #555; padding-right: 10px; } .survey-item .a { color: var(--secondary); font-weight: 900; white-space: nowrap; } .analysis-box { background: #f8faff; padding: 18px 22px; border-radius: 12px; margin-bottom: 15px; border: 1px solid #e1e9ff; line-height: 1.6; font-size: 0.95em; text-align: justify; } .total-box { text-align: center; background: linear-gradient(135deg, #f8f9fa 0%, #ffffff 100%); padding: 25px; border-radius: 15px; border: 3px solid var(--primary); margin: 15px 0; } .total-val { font-size: 4em; font-weight: 900; color: var(--primary); margin: 5px 0; letter-spacing: -2px; } .trend-badge { font-size: 0.35em; vertical-align: middle; padding: 5px 12px; border-radius: 20px; font-weight: 800; display: inline-block; margin-left: 10px; } .trend-up { background: #e8f5e9; color: #2e7d32; border: 1px solid #2e7d32; } .trend-down { background: #ffebee; color: #c62828; border: 1px solid #c62828; } .trend-same { background: #f5f5f5; color: #666; border: 1px solid #999; } .mismatch-box { background: #fff5f5; border-left: 8px solid #d32f2f; padding: 15px 20px; border-radius: 8px; margin-top: 10px; color: #b71c1c; font-weight: 700; font-size: 0.9em; line-height:1.5; text-align:left; } .rubric-tag { display: inline-block; padding: 3px 10px; border-radius: 5px; font-weight: 800; color: white; margin-bottom: 8px; font-size: 0.8em; } .tag-master { background: var(--primary); } .tag-proficient { background: #2e7d32; } .tag-developing { background: #ef6c00; } .tag-critical { background: var(--danger); } .school-grid { display: grid; grid-template-columns: repeat(3, 1fr); gap: 10px; margin-top: 10px; } .school-card { padding: 10px 12px; border: 1.5px solid var(--border); border-radius: 10px; text-align: center; background: #fff; position: relative; } .school-card.gold { background: var(--gold-bg); border: 2px solid var(--gold); } .school-score { font-size: 1.4em; font-weight: 900; color: var(--primary); margin: 3px 0; } .school-target { font-size: 0.8em; color: #666; font-weight: 800; border-top: 1px dashed #ccc; margin-top: 4px; padding-top: 4px; } .status-badge { font-weight: 800; padding: 3px 8px; border-radius: 12px; font-size: 0.7em; display: inline-block; margin-bottom: 3px; } .badge-stable { background: #e8f5e9; color: #2e7d32; } .badge-challenge { background: #e3f2fd; color: #1565c0; } .badge-caution { background: #ffebee; color: var(--danger); } .gap-indicator { font-size: 0.8em; font-weight: bold; margin-top: 2px; } .gap-plus { color: #2e7d32; } .gap-minus { color: var(--danger); } .stucare-roadmap { display: grid; grid-template-columns: 1fr 1fr 1fr; gap: 15px; margin-top: 20px; } .stucare-step { background: #fff; border: 2px solid var(--secondary); border-radius: 10px; padding: 18px 15px; position: relative; } .stucare-step .step-num { position: absolute; top: -12px; left: 15px; background: var(--secondary); color: white; padding: 3px 10px; border-radius: 15px; font-weight: 900; font-size: 0.8em; } .footer { position: absolute; bottom: 15px; left: 0; right: 0; text-align: center; font-size: 0.85em; color: #aaa; font-weight: 700; border-top: 1px solid #f0f0f0; padding-top: 8px; width: 85%; margin: 0 auto; } /* Page 7 compact balancing */ #p7 .report-header { margin-bottom: 14px; } #p7 h3 { margin-top: 10px !important; margin-bottom: 8px !important; font-size: 1.08em; } #p7 #gradeIndexArea { margin-bottom: 10px !important; } #p7 .analysis-box { padding: 10px 14px; font-size: 0.78em !important; line-height: 1.45; } #p7 .school-grid { gap: 8px; margin-top: 8px; } #p7 .school-card { padding: 8px 10px; } #p7 .status-badge { font-size: 0.65em; padding: 3px 7px; margin-bottom: 2px; } #p7 .school-score { font-size: 1.25em; margin: 2px 0; } #p7 .target-avg { font-size: 0.76em; } #p7 .gap-indicator { font-size: 0.74em; } /* School-only page / print-safe strategy pages */ #p7 .report-header { margin-bottom: 10px; } #p7 h3 { margin-top: 8px !important; margin-bottom: 7px !important; font-size: 1.05em; } #p7 .school-grid { gap: 6px; margin-top: 6px; } #p7 .school-card { padding: 7px 9px; min-height: 0; } #p7 .status-badge { font-size: 0.62em; padding: 2px 6px; margin-bottom: 1px; } #p7 .school-score { font-size: 1.18em; margin: 1px 0; } #p7 .target-avg, #p7 .gap-indicator { font-size: 0.70em; } #p4 .total-box { padding:18px; margin:10px 0; } #p4 .total-val { font-size:3.3em; } #p4 h3 { margin-top:15px; margin-bottom:10px; } #p8 .analysis-box { margin-bottom: 10px; padding: 13px 16px; font-size:0.86em; line-height:1.55; } #p9 .analysis-box { margin-bottom: 12px; padding: 13px 16px; font-size:0.86em; line-height:1.55; } #p9 .stucare-roadmap { gap:10px; margin-top:16px; } #p9 .stucare-step { padding:16px 13px; } #p7 #schoolThreeAxisSummary, #p7 #streamFitSummary { break-inside: avoid; page-break-inside: avoid; } #p8 .analysis-box, #p8 #deliverableBox, #p9 table, #p9 #priorityActionBox, #p9 #nextConsultBox { break-inside: avoid; page-break-inside: avoid; } #p8 .analysis-box { margin-bottom:7px; padding:10px 13px; } #p9 table th, #p9 table td { vertical-align:top; } #p7 #readinessDetailSummary { break-inside: avoid; page-break-inside: avoid; } #p7 #schoolSpecificSection { break-inside: avoid; page-break-inside: avoid; } #p7 #schoolThreeAxisSummary, #p7 #dnaPositionSummary, #p7 #streamFitSummary, #p7 #readinessDetailSummary {break-inside:avoid;page-break-inside:avoid;} #p8 .school-grid {gap:8px;margin-top:8px;} #p8 .school-card {padding:9px 11px;min-height:0;} #p8 .status-badge {font-size:0.64em;padding:3px 7px;} #p8 .school-score {font-size:1.25em;} #p8 .target-avg,#p8 .gap-indicator {font-size:0.74em;} #p7 #subjectProfileSummary { break-inside:avoid; page-break-inside:avoid; } #p7 #subjectProfileSummary table { page-break-inside:avoid; } #p7 #achievementStabilitySummary { break-inside:avoid; page-break-inside:avoid; } #p7 #achievementStabilitySummary table { page-break-inside:avoid; } @media print { .no-print { display: none; } body { padding: 0; background: white; margin: 0; } @page { size: A4; margin: 0; } .container { max-width: 100%; width: 100%; margin: 0; } .page { width: 210mm; height: 297mm; max-height: 297mm; margin: 0; padding: 10mm 15mm; border: none; box-shadow: none; border-radius: 0; page-break-after: always; overflow: hidden; } .total-box, .school-card, .analysis-box, .stucare-step, .grade-table th { -webkit-print-color-adjust: exact; print-color-adjust: exact; } .rubric-tag, .status-badge, .cover-content, .a, .trend-badge, .trend-same, .trend-down { -webkit-print-color-adjust: exact; print-color-adjust: exact; } } </style> </head> <body> <div class="container"> <div class="no-print"> <div style="display:flex; justify-content:space-between; align-items:flex-end; border-bottom: 5px solid var(--primary); margin-bottom: 20px; padding-bottom: 10px;"> <h2 style="margin:0; color:var(--primary);">🎯 APEX 학업역량 정밀진단 시스템 V26 (최종)</h2> <button onclick="printStudentQuestionnaire()" style="background:#2e7d32; color:white; border:none; padding:12px 25px; border-radius:8px; font-weight:800; cursor:pointer; font-size:1.05em; box-shadow: 0 4px 6px rgba(0,0,0,0.15);">📄 학생용 프리미엄 설문지 인쇄 (A4)</button> </div> <div class="input-grid"> <div style="grid-column: span 2; background:#eef5ff; padding:12px; border-radius:8px; border:1px solid #b9cff5;"> <label style="color:#234f9b; font-size:1em;">📍 운영 버전</label> <div style="display:flex; gap:20px; margin-top:8px; flex-wrap:wrap;"> <label style="color:#333; font-weight:bold; cursor:pointer;"><input type="radio" name="operationMode" value="sejong" checked=""> 학교 매칭 표시형 — 핵심 진단 + 주요 고교 준비도</label> <label style="color:#333; font-weight:bold; cursor:pointer;"><input type="radio" name="operationMode" value="daechi"> 핵심 진단형 — 성장 DNA·계열 적합도·준비도 중심</label> </div> <div style="font-size:0.82em; color:#5f6b7a; margin-top:6px;">학생 진단 문항과 계산 방식은 동일합니다. 학교명을 표시하는지 여부만 달라지며, 핵심 진단 점수와 계열 적합도는 두 방식 모두 동일하게 표시됩니다.</div> </div> <div style="grid-column: span 2; background:#fff3e0; padding:12px; border-radius:8px; border:1px solid #ffcc80;"> <label style="color:#e65100; font-size:1em;">🔄 검사 회차 설정 (회차에 따라 문항 자동 변경)</label> <div style="display:flex; gap:20px; margin-top:8px;"> <label style="color:#333; font-weight:bold; cursor:pointer;"><input type="radio" name="sessionType" value="1" checked="" onchange="toggleSession()"> 1차 검사 (최초 진단)</label> <label style="color:#333; font-weight:bold; cursor:pointer;"><input type="radio" name="sessionType" value="2" onchange="toggleSession()"> 2차 검사 (추이 분석)</label> </div> </div> <div><label>검사 일시</label><input type="date" id="inDate" value="2026-05-15"></div> <div><label>학교명</label><input type="text" id="inSchool" placeholder="스파르타중"></div> <div><label>학생명</label><input type="text" id="inName" placeholder="홍길동"></div> <div><label>학년 (학년별 거품 제거 알고리즘 적용)</label> <select id="inGrade" onchange="renderQuestions(); renderGradeSelects(); updateAcademicInputMode()"> <option value="elem">초등 5~6학년 (Step 1)</option> <option value="mid12">중등 1~2학년 (Step 2)</option> <option value="mid3" selected="">중등 3학년 (Step 3)</option> </select> </div> <div><label>희망 계열</label> <select id="inStream"> <option value="natural">NATURAL (자연/의학)</option> <option value="human">HUMAN (인문/사회)</option> <option value="convergence">CONVERGENCE (창의융합)</option> </select> </div> <div><label>인식 성향 (Q5)</label> <select id="inStyle"> <option value="master">마스터형</option> <option value="perfect">완벽주의형</option> <option value="follower">팔로워형</option> <option value="talent">지능의존형</option> </select> </div> <div id="gradeAchievementInputBlock" style="grid-column: span 2; background: rgb(244, 250, 255); padding: 15px; border-radius: 8px; border: 1px solid rgb(179, 212, 255); display: block;"> <label style="color:#0056b3; font-size:1.05em;">📊 [절대평가 지표] 학기별 교과 내신 성취도 (A~E)</label> <p style="font-size:0.8em; color:#555; margin:4px 0 8px 0; font-weight:bold;">* 아직 배우지 않은 학기나 성적이 나오지 않은 학기는 반드시 "미이수 / 아직 성적 없음"을 선택합니다. 미이수는 0점도 A도 아니며 계산에서 제외됩니다.</p> <div id="gradeDataGuide" style="font-size:0.82em;color:#0b5394;background:#eef6ff;border:1px solid #c8ddf5;border-radius:7px;padding:8px 10px;margin-bottom:10px;">중1~2 학생은 <b>실제로 나온 학기 성적만</b> 입력하세요. 시험 전이라 성적이 전혀 없다면 모두 미이수로 두고 아래 현재 교과 기반을 입력합니다.</div> <div style="font-size:0.75em;color:#667085;background:#f8fafc;border:1px solid #e5e7eb;padding:7px 9px;border-radius:7px;margin:8px 0;">※ 입력한 성취도를 기준으로 <b>학년별 A·B·C·D/E 개수와 최근 변화</b>가 자동 계산됩니다.</div> <table class="grade-table"> <tbody><tr><th>과목</th><th>2학년 1학기</th><th>2학년 2학기</th><th>3학년 1학기</th><th>3학년 2학기</th></tr> </tbody><tbody id="gradeTbody"><tr><td style="font-weight:bold; color:var(--primary); background:#f0f4f8;">국어</td><td><select id="g-kor-21"> <option value="" selected="">미이수 / 아직 성적 없음</option> <option value="90">A</option> <option value="70">B</option> <option value="50">C</option> <option value="30">D/E</option> </select></td><td><select id="g-kor-22"> <option value="" selected="">미이수 / 아직 성적 없음</option> <option value="90">A</option> <option value="70">B</option> <option value="50">C</option> <option value="30">D/E</option> </select></td><td><select id="g-kor-31"> <option value="" selected="">미이수 / 아직 성적 없음</option> <option value="90">A</option> <option value="70">B</option> <option value="50">C</option> <option value="30">D/E</option> </select></td><td><select id="g-kor-32"> <option value="" selected="">미이수 / 아직 성적 없음</option> <option value="90">A</option> <option value="70">B</option> <option value="50">C</option> <option value="30">D/E</option> </select></td></tr><tr><td style="font-weight:bold; color:var(--primary); background:#f0f4f8;">영어</td><td><select id="g-eng-21"> <option value="" selected="">미이수 / 아직 성적 없음</option> <option value="90">A</option> <option value="70">B</option> <option value="50">C</option> <option value="30">D/E</option> </select></td><td><select id="g-eng-22"> <option value="" selected="">미이수 / 아직 성적 없음</option> <option value="90">A</option> <option value="70">B</option> <option value="50">C</option> <option value="30">D/E</option> </select></td><td><select id="g-eng-31"> <option value="" selected="">미이수 / 아직 성적 없음</option> <option value="90">A</option> <option value="70">B</option> <option value="50">C</option> <option value="30">D/E</option> </select></td><td><select id="g-eng-32"> <option value="" selected="">미이수 / 아직 성적 없음</option> <option value="90">A</option> <option value="70">B</option> <option value="50">C</option> <option value="30">D/E</option> </select></td></tr><tr><td style="font-weight:bold; color:var(--primary); background:#f0f4f8;">수학</td><td><select id="g-mat-21"> <option value="" selected="">미이수 / 아직 성적 없음</option> <option value="90">A</option> <option value="70">B</option> <option value="50">C</option> <option value="30">D/E</option> </select></td><td><select id="g-mat-22"> <option value="" selected="">미이수 / 아직 성적 없음</option> <option value="90">A</option> <option value="70">B</option> <option value="50">C</option> <option value="30">D/E</option> </select></td><td><select id="g-mat-31"> <option value="" selected="">미이수 / 아직 성적 없음</option> <option value="90">A</option> <option value="70">B</option> <option value="50">C</option> <option value="30">D/E</option> </select></td><td><select id="g-mat-32"> <option value="" selected="">미이수 / 아직 성적 없음</option> <option value="90">A</option> <option value="70">B</option> <option value="50">C</option> <option value="30">D/E</option> </select></td></tr><tr><td style="font-weight:bold; color:var(--primary); background:#f0f4f8;">과학</td><td><select id="g-sci-21"> <option value="" selected="">미이수 / 아직 성적 없음</option> <option value="90">A</option> <option value="70">B</option> <option value="50">C</option> <option value="30">D/E</option> </select></td><td><select id="g-sci-22"> <option value="" selected="">미이수 / 아직 성적 없음</option> <option value="90">A</option> <option value="70">B</option> <option value="50">C</option> <option value="30">D/E</option> </select></td><td><select id="g-sci-31"> <option value="" selected="">미이수 / 아직 성적 없음</option> <option value="90">A</option> <option value="70">B</option> <option value="50">C</option> <option value="30">D/E</option> </select></td><td><select id="g-sci-32"> <option value="" selected="">미이수 / 아직 성적 없음</option> <option value="90">A</option> <option value="70">B</option> <option value="50">C</option> <option value="30">D/E</option> </select></td></tr><tr><td style="font-weight:bold; color:var(--primary); background:#f0f4f8;">사회</td><td><select id="g-soc-21"> <option value="" selected="">미이수 / 아직 성적 없음</option> <option value="90">A</option> <option value="70">B</option> <option value="50">C</option> <option value="30">D/E</option> </select></td><td><select id="g-soc-22"> <option value="" selected="">미이수 / 아직 성적 없음</option> <option value="90">A</option> <option value="70">B</option> <option value="50">C</option> <option value="30">D/E</option> </select></td><td><select id="g-soc-31"> <option value="" selected="">미이수 / 아직 성적 없음</option> <option value="90">A</option> <option value="70">B</option> <option value="50">C</option> <option value="30">D/E</option> </select></td><td><select id="g-soc-32"> <option value="" selected="">미이수 / 아직 성적 없음</option> <option value="90">A</option> <option value="70">B</option> <option value="50">C</option> <option value="30">D/E</option> </select></td></tr><tr><td style="font-weight:bold; color:var(--primary); background:#f0f4f8;">역사</td><td><select id="g-his-21"> <option value="" selected="">미이수 / 아직 성적 없음</option> <option value="90">A</option> <option value="70">B</option> <option value="50">C</option> <option value="30">D/E</option> </select></td><td><select id="g-his-22"> <option value="" selected="">미이수 / 아직 성적 없음</option> <option value="90">A</option> <option value="70">B</option> <option value="50">C</option> <option value="30">D/E</option> </select></td><td><select id="g-his-31"> <option value="" selected="">미이수 / 아직 성적 없음</option> <option value="90">A</option> <option value="70">B</option> <option value="50">C</option> <option value="30">D/E</option> </select></td><td><select id="g-his-32"> <option value="" selected="">미이수 / 아직 성적 없음</option> <option value="90">A</option> <option value="70">B</option> <option value="50">C</option> <option value="30">D/E</option> </select></td></tr></tbody> </table> </div> <div style="background:#f3e5f5; padding:12px; border-radius:8px; border:1px solid #ce93d8;"> <label style="color:#6a1b9a;">🏆 국어 객관평가·진단 자료 (선택)</label> <select id="inMockKor" style="width:100%; margin-top:5px;"><option value="" selected="">미응시 / 객관자료 없음</option><option value="100">전국·기관 상위 1% 이내</option><option value="90">전국·기관 상위 4% 이내</option><option value="80">전국·기관 상위 11% 이내</option><option value="65">전국·기관 상위 23% 이내</option><option value="50">그 이하 / 기초 확인 필요</option></select> </div> <div style="background:#f3e5f5; padding:12px; border-radius:8px; border:1px solid #ce93d8;"> <label style="color:#6a1b9a;">🏆 수학 객관평가·진단 자료 (선택)</label> <select id="inMockMath" style="width:100%; margin-top:5px;"><option value="" selected="">미응시 / 객관자료 없음</option><option value="100">전국·기관 상위 1% 이내</option><option value="90">전국·기관 상위 4% 이내</option><option value="80">전국·기관 상위 11% 이내</option><option value="65">전국·기관 상위 23% 이내</option><option value="50">그 이하 / 기초 확인 필요</option></select> </div> <div style="background:#f3e5f5; padding:12px; border-radius:8px; border:1px solid #ce93d8;"> <label style="color:#6a1b9a;">🏆 영어 객관평가·진단 자료 (선택)</label> <select id="inMockEng" style="width:100%; margin-top:5px;"><option value="" selected="">미응시 / 객관자료 없음</option><option value="100">전국·기관 상위 1% 이내</option><option value="90">전국·기관 상위 4% 이내</option><option value="80">전국·기관 상위 11% 이내</option><option value="65">전국·기관 상위 23% 이내</option><option value="50">그 이하 / 기초 확인 필요</option></select> </div> <div style="background:#f3e5f5; padding:12px; border-radius:8px; border:1px solid #ce93d8;"> <label style="color:#6a1b9a;">🏆 과학 객관평가·진단 자료 (선택)</label> <select id="inMockSci" style="width:100%; margin-top:5px;"><option value="" selected="">미응시 / 객관자료 없음</option><option value="100">전국·기관 상위 1% 이내</option><option value="90">전국·기관 상위 4% 이내</option><option value="80">전국·기관 상위 11% 이내</option><option value="65">전국·기관 상위 23% 이내</option><option value="50">그 이하 / 기초 확인 필요</option></select> </div> <div id="foundationInputBlock" style="grid-column: span 2; background: rgb(247, 251, 248); padding: 15px; border-radius: 8px; border: 1px solid rgb(184, 223, 192); display: block;"> <label style="color:#216e39;font-size:1.05em;">🌱 성적 전 학업탐색 자료 — 현재 교과 기반</label> <p id="foundationGuide" style="font-size:0.80em;color:#53645a;margin:5px 0 10px 0;line-height:1.45;">중1~2는 <b>실제 학교 성적이 나온 학기만 A/B 성취도를 입력</b>합니다. 시험 전이라 성적이 없다면 모두 “미이수”로 두고 아래 현재 교과 기반을 입력하면 초기 학업탐색형으로 분석합니다.</p> <div style="display:grid;grid-template-columns:repeat(2,1fr);gap:9px;"> <div><label>국어 현재 교과 기반</label><select id="inBaseKor"> <option value="">관찰 자료 없음</option><option value="95">매우 안정</option><option value="85">안정</option><option value="72">기본 확보</option><option value="60">일부 보완 필요</option> </select></div> <div><label>수학 현재 교과 기반</label><select id="inBaseMath"> <option value="">관찰 자료 없음</option><option value="95">매우 안정</option><option value="85">안정</option><option value="72">기본 확보</option><option value="60">일부 보완 필요</option> </select></div> <div><label>영어 현재 교과 기반</label><select id="inBaseEng"> <option value="">관찰 자료 없음</option><option value="95">매우 안정</option><option value="85">안정</option><option value="72">기본 확보</option><option value="60">일부 보완 필요</option> </select></div> <div><label>과학 현재 교과 기반</label><select id="inBaseSci"> <option value="">관찰 자료 없음</option><option value="95">매우 안정</option><option value="85">안정</option><option value="72">기본 확보</option><option value="60">일부 보완 필요</option> </select></div> </div> <div style="font-size:0.74em;color:#6b746d;margin-top:8px;"> ※ 이 값은 학교 성적이 아닙니다. 실제 A/B 성취도가 입력되면 교과 성취 자료를 우선 사용합니다. </div> </div> <div style="background:#e8f5e9; padding:12px; border-radius:8px; border:1px solid #a5d6a7;"> <label style="color:#2e7d32;">📈 수학 선행·심화</label> <select id="inMathLevel" style="margin-top:5px;"><option value="" selected="">자료 없음 / 아직 확인하지 않음</option><option value="95">고등 공통수학 이상을 이해·적용하며 중등 최상위 심화 안정</option><option value="85">고등 선행 진행 또는 중등 최상위 심화가 안정적</option><option value="72">중등 현행 심화·응용이 안정적</option><option value="60">현행 개념은 안정적이며 심화를 시작하는 단계</option><option value="50">현행 핵심 개념을 보완하는 단계</option></select> </div> <div style="background:#e8f5e9; padding:12px; border-radius:8px; border:1px solid #a5d6a7;"> <label style="color:#2e7d32;">📈 과학 선행·심화</label> <select id="inSciLevel" style="margin-top:5px;"><option value="" selected="">자료 없음 / 아직 확인하지 않음</option><option value="95">통합과학 이상 선행과 중등 심화 탐구가 안정적</option><option value="85">통합과학 선행 또는 중등 최상위 심화가 안정적</option><option value="72">중등 현행 개념·심화 문제해결이 안정적</option><option value="60">현행 개념은 안정적이며 심화 탐구를 시작하는 단계</option><option value="50">현행 핵심 개념을 보완하는 단계</option></select> </div> <div style="background:#e8f5e9; padding:12px; border-radius:8px; border:1px solid #a5d6a7;"> <label style="color:#2e7d32;">📖 국어 심화·독해</label> <select id="inKorLevel" style="margin-top:5px;"><option value="" selected="">자료 없음 / 아직 확인하지 않음</option><option value="95">고1 수준 장문·비문학을 안정적으로 분석</option><option value="85">중등 고난도 독해·서술 및 예비고 수준 확장</option><option value="72">중등 현행 독해·서술이 안정적</option><option value="60">긴 글 독해와 서술을 심화하는 단계</option><option value="50">기초 독해·서술을 보완하는 단계</option></select> </div> <div style="background:#e8f5e9; padding:12px; border-radius:8px; border:1px solid #a5d6a7;"> <label style="color:#2e7d32;">🌐 영어 심화·독해</label> <select id="inEngLevel" style="margin-top:5px;"><option value="" selected="">자료 없음 / 아직 확인하지 않음</option><option value="95">고1 수준 독해·구문을 안정적으로 처리</option><option value="85">중등 고난도 독해·문법 및 예비고 수준 확장</option><option value="72">중등 현행 독해·어휘·문법이 안정적</option><option value="60">독해·구문을 심화하는 단계</option><option value="50">기초 어휘·문법·독해를 보완하는 단계</option></select> </div> <div style="background:#e8f5e9; padding:12px; border-radius:8px; border:1px solid #a5d6a7;"> <label style="color:#2e7d32;">📈 사회·역사 이해·확장</label> <select id="inHisLevel" style="margin-top:5px;"><option value="" selected="">자료 없음 / 아직 확인하지 않음</option><option value="95">고등 통합사회·한국사 수준까지 흐름과 쟁점을 연결</option><option value="85">중등 역사·사회 흐름을 깊게 이해하고 설명 가능</option><option value="72">중등 현행 개념과 흐름이 안정적</option><option value="60">핵심 개념과 흐름을 확장하는 단계</option><option value="50">기초 개념·용어를 보완하는 단계</option></select> </div> <div style="grid-column:span 2;background:#fffaf0;padding:13px;border-radius:8px;border:1px solid #f0d9a7;"> <label style="color:#8a5a00;font-size:1.02em;">🎨 학생 경험 · 특기 · 취미</label> <p style="font-size:0.78em;color:#666;margin:5px 0 9px 0;">성적 밖에서 반복해서 드러나는 관심과 경험을 진로·주제탐구·학생부 전략에 연결하기 위한 입력입니다.</p> <div style="display:grid;grid-template-columns:1fr 1fr;gap:8px;"> <input id="inTalent" type="text" placeholder="특기/잘하는 것 (예: 축구, 피아노, 코딩, 발표)" style="width:100%;"> <input id="inHobby" type="text" placeholder="취미/시간 가는 줄 모르고 하는 것" style="width:100%;"> <input id="inLongExperience" type="text" placeholder="오래 해온 활동/경험 (예: 농구 5년, F1 관심 3년)" style="width:100%;"> <input id="inPraise" type="text" placeholder="주변에서 자주 잘한다고 말하는 것" style="width:100%;"> </div> </div> <div id="prevScoreBox" style="grid-column: span 2; background:#fff5f5; padding:12px; border-radius:8px; border:1px solid #ffcdd2; display:none;"> <label style="color:#c62828;">📉 [추이 분석용] 직전 1차 진단 종합 점수 입력 (240점 만점)</label> <input type="number" id="inPrevScore" placeholder="예: 175" style="margin-top:5px; width:100%;"> </div> </div> <h4 style="color:var(--primary); margin-bottom:10px;">[Step 0. 기초 평가 16문항 데이터 입력]</h4> <div id="step0_inputs" style="display:grid; grid-template-columns: 1fr 1fr; gap:12px;"><div style="grid-column: 1 / -1; margin-bottom:8px;"><label style="font-size:0.85em; color:#555; font-weight:700; margin-bottom:4px; display:block;">1. 미래에 가장 깊게 공부해보고 싶은 점검 분야와 그 이유는?</label><input type="text" id="s0_0" style="width:100%; padding:10px; font-size:0.9em; border:1px solid #ccc; border-radius:5px;"></div><div style="grid-column: 1 / -1; margin-bottom:8px;"><label style="font-size:0.85em; color:#555; font-weight:700; margin-bottom:4px; display:block;">2. 평소 유튜브나 SNS에서 즐겨보는 콘텐츠 유형은?</label><input type="text" id="s0_1" style="width:100%; padding:10px; font-size:0.9em; border:1px solid #ccc; border-radius:5px;"></div><div style="grid-column: 1 / -1; margin-bottom:8px;"><label style="font-size:0.85em; color:#555; font-weight:700; margin-bottom:4px; display:block;">3. 나만의 특별한 '취미'나 남들보다 잘하는 '특기'는?</label><input type="text" id="s0_2" style="width:100%; padding:10px; font-size:0.9em; border:1px solid #ccc; border-radius:5px;"></div><div style="grid-column: 1 / -1; margin-bottom:8px;"><label style="font-size:0.85em; color:#555; font-weight:700; margin-bottom:4px; display:block;">4. 미래에 가고 싶은 '목표 고등학교'와 '장래희망'은?</label><input type="text" id="s0_3" style="width:100%; padding:10px; font-size:0.9em; border:1px solid #ccc; border-radius:5px;"></div><div style="grid-column: 1 / -1; margin-bottom:8px;"><label style="font-size:0.85em; color:#555; font-weight:700; margin-bottom:4px; display:block;">5. 본인이 생각하는 자신의 공부 스타일은?</label><input type="text" id="s0_4" style="width:100%; padding:10px; font-size:0.9em; border:1px solid #ccc; border-radius:5px;"></div><div style="grid-column: 1 / -1; margin-bottom:8px;"><label style="font-size:0.85em; color:#555; font-weight:700; margin-bottom:4px; display:block;">6. 주당 평균 사교육 시간 vs 순수 공부 시간의 비율은?</label><input type="text" id="s0_5" style="width:100%; padding:10px; font-size:0.9em; border:1px solid #ccc; border-radius:5px;"></div><div style=" margin-bottom:8px;"><label style="font-size:0.85em; color:#555; font-weight:700; margin-bottom:4px; display:block;">7. 수학 공식을 스스로 유도하거나 원리를 증명해 본 적 있는가?</label><select id="s0_6" style="width:100%; padding:8px; font-size:0.85em; border:1px solid #ccc; border-radius:5px;"><option value="O">O (그렇다)</option><option value="X">X (아니다)</option></select></div><div style=" margin-bottom:8px;"><label style="font-size:0.85em; color:#555; font-weight:700; margin-bottom:4px; display:block;">8. 교과서 외 점검 분야로 '주제 탐구 보고서'를 써봤는가?</label><select id="s0_7" style="width:100%; padding:8px; font-size:0.85em; border:1px solid #ccc; border-radius:5px;"><option value="O">O (그렇다)</option><option value="X">X (아니다)</option></select></div><div style=" margin-bottom:8px;"><label style="font-size:0.85em; color:#555; font-weight:700; margin-bottom:4px; display:block;">9. 최근 1년간 진로 관련 책을 5권 이상 정독했는가?</label><select id="s0_8" style="width:100%; padding:8px; font-size:0.85em; border:1px solid #ccc; border-radius:5px;"><option value="O">O (그렇다)</option><option value="X">X (아니다)</option></select></div><div style=" margin-bottom:8px;"><label style="font-size:0.85em; color:#555; font-weight:700; margin-bottom:4px; display:block;">10. 공부할 때 스마트폰 유혹을 스스로 완전히 통제하는가?</label><select id="s0_9" style="width:100%; padding:8px; font-size:0.85em; border:1px solid #ccc; border-radius:5px;"><option value="O">O (그렇다)</option><option value="X">X (아니다)</option></select></div><div style=" margin-bottom:8px;"><label style="font-size:0.85em; color:#555; font-weight:700; margin-bottom:4px; display:block;">11. 성적이 하락했을 때 감정에 휘둘리지 않고 원인을 분석하는가?</label><select id="s0_10" style="width:100%; padding:8px; font-size:0.85em; border:1px solid #ccc; border-radius:5px;"><option value="O">O (그렇다)</option><option value="X">X (아니다)</option></select></div><div style=" margin-bottom:8px;"><label style="font-size:0.85em; color:#555; font-weight:700; margin-bottom:4px; display:block;">12. 모르는 내용이 나오면 질문하거나 찾아 끝까지 해결하는가?</label><select id="s0_11" style="width:100%; padding:8px; font-size:0.85em; border:1px solid #ccc; border-radius:5px;"><option value="O">O (그렇다)</option><option value="X">X (아니다)</option></select></div><div style=" margin-bottom:8px;"><label style="font-size:0.85em; color:#555; font-weight:700; margin-bottom:4px; display:block;">13. 공부 잘하는 친구를 경쟁자보다 배우고 싶은 파트너로 보는가?</label><select id="s0_12" style="width:100%; padding:8px; font-size:0.85em; border:1px solid #ccc; border-radius:5px;"><option value="O">O (그렇다)</option><option value="X">X (아니다)</option></select></div><div style=" margin-bottom:8px;"><label style="font-size:0.85em; color:#555; font-weight:700; margin-bottom:4px; display:block;">14. 기숙사 생활의 엄격한 규칙(폰 사용 등)을 잘 지킬 자신이 있는가?</label><select id="s0_13" style="width:100%; padding:8px; font-size:0.85em; border:1px solid #ccc; border-radius:5px;"><option value="O">O (그렇다)</option><option value="X">X (아니다)</option></select></div><div style=" margin-bottom:8px;"><label style="font-size:0.85em; color:#555; font-weight:700; margin-bottom:4px; display:block;">15. 매일 일정한 시간에 기상하고 취침하는 생활 루틴이 있는가?</label><select id="s0_14" style="width:100%; padding:8px; font-size:0.85em; border:1px solid #ccc; border-radius:5px;"><option value="O">O (그렇다)</option><option value="X">X (아니다)</option></select></div><div style=" margin-bottom:8px;"><label style="font-size:0.85em; color:#555; font-weight:700; margin-bottom:4px; display:block;">16. 진단 결과를 통해 정확한 합격 가능성을 알고 싶은가?</label><select id="s0_15" style="width:100%; padding:8px; font-size:0.85em; border:1px solid #ccc; border-radius:5px;"><option value="O">O (그렇다)</option><option value="X">X (아니다)</option></select></div></div> <h4 style="color:var(--primary); margin-top:25px; margin-bottom:10px;">[4대 역량 진단 데이터 입력 (1~10점)]</h4> <div id="main_inputs"><div style="margin-bottom: 15px;"><b style="color:var(--primary); font-size:1.05em;">탐구(A) 영역</b><div style="display: grid; grid-template-columns: 1fr 1fr; gap: 10px; margin-top: 5px;"><div style="font-size:0.85em; background:#f9f9f9; padding:6px 12px; border-radius:6px; border:1px solid #ddd; display:flex; justify-content:space-between; align-items:center;"> <span style="flex:1;">개념 유도 과정을 스스로 증명해봤는가?</span> <div style="display:flex; align-items:center; width:110px; justify-content:flex-end;"> <input type="range" class="q-val" data-domain="A" min="1" max="10" value="7" oninput="this.nextElementSibling.innerText=this.value" style="width:70px;"> <span style="font-weight:900; color:var(--primary); width:20px; text-align:right; margin-left:10px;">7</span> </div> </div><div style="font-size:0.85em; background:#f9f9f9; padding:6px 12px; border-radius:6px; border:1px solid #ddd; display:flex; justify-content:space-between; align-items:center;"> <span style="flex:1;">논리적 비약을 느끼고 관련 서적을 찾아보는가?</span> <div style="display:flex; align-items:center; width:110px; justify-content:flex-end;"> <input type="range" class="q-val" data-domain="A" min="1" max="10" value="7" oninput="this.nextElementSibling.innerText=this.value" style="width:70px;"> <span style="font-weight:900; color:var(--primary); width:20px; text-align:right; margin-left:10px;">7</span> </div> </div><div style="font-size:0.85em; background:#f9f9f9; padding:6px 12px; border-radius:6px; border:1px solid #ddd; display:flex; justify-content:space-between; align-items:center;"> <span style="flex:1;">수학 지식을 실생활 문제 해결에 연결하는가?</span> <div style="display:flex; align-items:center; width:110px; justify-content:flex-end;"> <input type="range" class="q-val" data-domain="A" min="1" max="10" value="7" oninput="this.nextElementSibling.innerText=this.value" style="width:70px;"> <span style="font-weight:900; color:var(--primary); width:20px; text-align:right; margin-left:10px;">7</span> </div> </div><div style="font-size:0.85em; background:#f9f9f9; padding:6px 12px; border-radius:6px; border:1px solid #ddd; display:flex; justify-content:space-between; align-items:center;"> <span style="flex:1;">주제 탐구 보고서를 직접 작성해봤는가?</span> <div style="display:flex; align-items:center; width:110px; justify-content:flex-end;"> <input type="range" class="q-val" data-domain="A" min="1" max="10" value="7" oninput="this.nextElementSibling.innerText=this.value" style="width:70px;"> <span style="font-weight:900; color:var(--primary); width:20px; text-align:right; margin-left:10px;">7</span> </div> </div><div style="font-size:0.85em; background:#f9f9f9; padding:6px 12px; border-radius:6px; border:1px solid #ddd; display:flex; justify-content:space-between; align-items:center;"> <span style="flex:1;">손으로 직접 정리하며 풀어가는가?</span> <div style="display:flex; align-items:center; width:110px; justify-content:flex-end;"> <input type="range" class="q-val" data-domain="A" min="1" max="10" value="7" oninput="this.nextElementSibling.innerText=this.value" style="width:70px;"> <span style="font-weight:900; color:var(--primary); width:20px; text-align:right; margin-left:10px;">7</span> </div> </div><div style="font-size:0.85em; background:#f9f9f9; padding:6px 12px; border-radius:6px; border:1px solid #ddd; display:flex; justify-content:space-between; align-items:center;"> <span style="flex:1;">복습 시 새로운 질문이나 원리를 떠오르는가?</span> <div style="display:flex; align-items:center; width:110px; justify-content:flex-end;"> <input type="range" class="q-val" data-domain="A" min="1" max="10" value="7" oninput="this.nextElementSibling.innerText=this.value" style="width:70px;"> <span style="font-weight:900; color:var(--primary); width:20px; text-align:right; margin-left:10px;">7</span> </div> </div></div></div><div style="margin-bottom: 15px;"><b style="color:var(--primary); font-size:1.05em;">주도(B) 영역</b><div style="display: grid; grid-template-columns: 1fr 1fr; gap: 10px; margin-top: 5px;"><div style="font-size:0.85em; background:#f9f9f9; padding:6px 12px; border-radius:6px; border:1px solid #ddd; display:flex; justify-content:space-between; align-items:center;"> <span style="flex:1;">오늘 배운 내용을 백지에 구조화할 수 있는가?</span> <div style="display:flex; align-items:center; width:110px; justify-content:flex-end;"> <input type="range" class="q-val" data-domain="B" min="1" max="10" value="7" oninput="this.nextElementSibling.innerText=this.value" style="width:70px;"> <span style="font-weight:900; color:var(--primary); width:20px; text-align:right; margin-left:10px;">7</span> </div> </div><div style="font-size:0.85em; background:#f9f9f9; padding:6px 12px; border-radius:6px; border:1px solid #ddd; display:flex; justify-content:space-between; align-items:center;"> <span style="flex:1;">나만의 오답 분석법이나 플래너를 쓰는가?</span> <div style="display:flex; align-items:center; width:110px; justify-content:flex-end;"> <input type="range" class="q-val" data-domain="B" min="1" max="10" value="7" oninput="this.nextElementSibling.innerText=this.value" style="width:70px;"> <span style="font-weight:900; color:var(--primary); width:20px; text-align:right; margin-left:10px;">7</span> </div> </div><div style="font-size:0.85em; background:#f9f9f9; padding:6px 12px; border-radius:6px; border:1px solid #ddd; display:flex; justify-content:space-between; align-items:center;"> <span style="flex:1;">지시 없이 학습 로드맵을 스스로 결정하는가?</span> <div style="display:flex; align-items:center; width:110px; justify-content:flex-end;"> <input type="range" class="q-val" data-domain="B" min="1" max="10" value="7" oninput="this.nextElementSibling.innerText=this.value" style="width:70px;"> <span style="font-weight:900; color:var(--primary); width:20px; text-align:right; margin-left:10px;">7</span> </div> </div><div style="font-size:0.85em; background:#f9f9f9; padding:6px 12px; border-radius:6px; border:1px solid #ddd; display:flex; justify-content:space-between; align-items:center;"> <span style="flex:1;">시간 단축을 위한 나만의 효율 도구를 쓰는가?</span> <div style="display:flex; align-items:center; width:110px; justify-content:flex-end;"> <input type="range" class="q-val" data-domain="B" min="1" max="10" value="7" oninput="this.nextElementSibling.innerText=this.value" style="width:70px;"> <span style="font-weight:900; color:var(--primary); width:20px; text-align:right; margin-left:10px;">7</span> </div> </div><div style="font-size:0.85em; background:#f9f9f9; padding:6px 12px; border-radius:6px; border:1px solid #ddd; display:flex; justify-content:space-between; align-items:center;"> <span style="flex:1;">변형 문제를 예측하며 공부하는가?</span> <div style="display:flex; align-items:center; width:110px; justify-content:flex-end;"> <input type="range" class="q-val" data-domain="B" min="1" max="10" value="7" oninput="this.nextElementSibling.innerText=this.value" style="width:70px;"> <span style="font-weight:900; color:var(--primary); width:20px; text-align:right; margin-left:10px;">7</span> </div> </div><div style="font-size:0.85em; background:#f9f9f9; padding:6px 12px; border-radius:6px; border:1px solid #ddd; display:flex; justify-content:space-between; align-items:center;"> <span style="flex:1;">1년 뒤 구체적인 목표와 계획이 있는가?</span> <div style="display:flex; align-items:center; width:110px; justify-content:flex-end;"> <input type="range" class="q-val" data-domain="B" min="1" max="10" value="7" oninput="this.nextElementSibling.innerText=this.value" style="width:70px;"> <span style="font-weight:900; color:var(--primary); width:20px; text-align:right; margin-left:10px;">7</span> </div> </div></div></div><div style="margin-bottom: 15px;"><b style="color:var(--primary); font-size:1.05em;">정서(C) 영역</b><div style="display: grid; grid-template-columns: 1fr 1fr; gap: 10px; margin-top: 5px;"><div style="font-size:0.85em; background:#f9f9f9; padding:6px 12px; border-radius:6px; border:1px solid #ddd; display:flex; justify-content:space-between; align-items:center;"> <span style="flex:1;">잘하는 친구를 시기보다 파트너로 인식하는가?</span> <div style="display:flex; align-items:center; width:110px; justify-content:flex-end;"> <input type="range" class="q-val" data-domain="C" min="1" max="10" value="7" oninput="this.nextElementSibling.innerText=this.value" style="width:70px;"> <span style="font-weight:900; color:var(--primary); width:20px; text-align:right; margin-left:10px;">7</span> </div> </div><div style="font-size:0.85em; background:#f9f9f9; padding:6px 12px; border-radius:6px; border:1px solid #ddd; display:flex; justify-content:space-between; align-items:center;"> <span style="flex:1;">계획이 틀어질 때 즉시 수정하여 실천하는가?</span> <div style="display:flex; align-items:center; width:110px; justify-content:flex-end;"> <input type="range" class="q-val" data-domain="C" min="1" max="10" value="7" oninput="this.nextElementSibling.innerText=this.value" style="width:70px;"> <span style="font-weight:900; color:var(--primary); width:20px; text-align:right; margin-left:10px;">7</span> </div> </div><div style="font-size:0.85em; background:#f9f9f9; padding:6px 12px; border-radius:6px; border:1px solid #ddd; display:flex; justify-content:space-between; align-items:center;"> <span style="flex:1;">경쟁 환경의 긴장감을 즐거움으로 느끼는가?</span> <div style="display:flex; align-items:center; width:110px; justify-content:flex-end;"> <input type="range" class="q-val" data-domain="C" min="1" max="10" value="7" oninput="this.nextElementSibling.innerText=this.value" style="width:70px;"> <span style="font-weight:900; color:var(--primary); width:20px; text-align:right; margin-left:10px;">7</span> </div> </div><div style="font-size:0.85em; background:#f9f9f9; padding:6px 12px; border-radius:6px; border:1px solid #ddd; display:flex; justify-content:space-between; align-items:center;"> <span style="flex:1;">성적이 떨어져도 평온을 유지하려 노력하는가?</span> <div style="display:flex; align-items:center; width:110px; justify-content:flex-end;"> <input type="range" class="q-val" data-domain="C" min="1" max="10" value="7" oninput="this.nextElementSibling.innerText=this.value" style="width:70px;"> <span style="font-weight:900; color:var(--primary); width:20px; text-align:right; margin-left:10px;">7</span> </div> </div><div style="font-size:0.85em; background:#f9f9f9; padding:6px 12px; border-radius:6px; border:1px solid #ddd; display:flex; justify-content:space-between; align-items:center;"> <span style="flex:1;">실수 두려움 없이 새로운 도전에 나서는가?</span> <div style="display:flex; align-items:center; width:110px; justify-content:flex-end;"> <input type="range" class="q-val" data-domain="C" min="1" max="10" value="7" oninput="this.nextElementSibling.innerText=this.value" style="width:70px;"> <span style="font-weight:900; color:var(--primary); width:20px; text-align:right; margin-left:10px;">7</span> </div> </div><div style="font-size:0.85em; background:#f9f9f9; padding:6px 12px; border-radius:6px; border:1px solid #ddd; display:flex; justify-content:space-between; align-items:center;"> <span style="flex:1;">에너지를 스스로 관리하고 휴식을 취하는가?</span> <div style="display:flex; align-items:center; width:110px; justify-content:flex-end;"> <input type="range" class="q-val" data-domain="C" min="1" max="10" value="7" oninput="this.nextElementSibling.innerText=this.value" style="width:70px;"> <span style="font-weight:900; color:var(--primary); width:20px; text-align:right; margin-left:10px;">7</span> </div> </div></div></div><div style="margin-bottom: 15px;"><b style="color:var(--primary); font-size:1.05em;">습관(D) 영역</b><div style="display: grid; grid-template-columns: 1fr 1fr; gap: 10px; margin-top: 5px;"><div style="font-size:0.85em; background:#f9f9f9; padding:6px 12px; border-radius:6px; border:1px solid #ddd; display:flex; justify-content:space-between; align-items:center;"> <span style="flex:1;">공부 시 폰을 물리적으로 격리하여 차단하는가?</span> <div style="display:flex; align-items:center; width:110px; justify-content:flex-end;"> <input type="range" class="q-val" data-domain="D" min="1" max="10" value="7" oninput="this.nextElementSibling.innerText=this.value" style="width:70px;"> <span style="font-weight:900; color:var(--primary); width:20px; text-align:right; margin-left:10px;">7</span> </div> </div><div style="font-size:0.85em; background:#f9f9f9; padding:6px 12px; border-radius:6px; border:1px solid #ddd; display:flex; justify-content:space-between; align-items:center;"> <span style="flex:1;">순공 시간과 그냥 앉아 있던 시간을 구분하는가?</span> <div style="display:flex; align-items:center; width:110px; justify-content:flex-end;"> <input type="range" class="q-val" data-domain="D" min="1" max="10" value="7" oninput="this.nextElementSibling.innerText=this.value" style="width:70px;"> <span style="font-weight:900; color:var(--primary); width:20px; text-align:right; margin-left:10px;">7</span> </div> </div><div style="font-size:0.85em; background:#f9f9f9; padding:6px 12px; border-radius:6px; border:1px solid #ddd; display:flex; justify-content:space-between; align-items:center;"> <span style="flex:1;">규칙적인 수면을 유지하며 밤에 폰을 안 하는가?</span> <div style="display:flex; align-items:center; width:110px; justify-content:flex-end;"> <input type="range" class="q-val" data-domain="D" min="1" max="10" value="7" oninput="this.nextElementSibling.innerText=this.value" style="width:70px;"> <span style="font-weight:900; color:var(--primary); width:20px; text-align:right; margin-left:10px;">7</span> </div> </div><div style="font-size:0.85em; background:#f9f9f9; padding:6px 12px; border-radius:6px; border:1px solid #ddd; display:flex; justify-content:space-between; align-items:center;"> <span style="flex:1;">환경을 탓하기보다 직접 정리하는가?</span> <div style="display:flex; align-items:center; width:110px; justify-content:flex-end;"> <input type="range" class="q-val" data-domain="D" min="1" max="10" value="7" oninput="this.nextElementSibling.innerText=this.value" style="width:70px;"> <span style="font-weight:900; color:var(--primary); width:20px; text-align:right; margin-left:10px;">7</span> </div> </div><div style="font-size:0.85em; background:#f9f9f9; padding:6px 12px; border-radius:6px; border:1px solid #ddd; display:flex; justify-content:space-between; align-items:center;"> <span style="flex:1;">지루한 반복 학습도 묵묵히 수행하는가?</span> <div style="display:flex; align-items:center; width:110px; justify-content:flex-end;"> <input type="range" class="q-val" data-domain="D" min="1" max="10" value="7" oninput="this.nextElementSibling.innerText=this.value" style="width:70px;"> <span style="font-weight:900; color:var(--primary); width:20px; text-align:right; margin-left:10px;">7</span> </div> </div><div style="font-size:0.85em; background:#f9f9f9; padding:6px 12px; border-radius:6px; border:1px solid #ddd; display:flex; justify-content:space-between; align-items:center;"> <span style="flex:1;">주변 분위기에 휩쓸리지 않고 내 페이스를 지키는가?</span> <div style="display:flex; align-items:center; width:110px; justify-content:flex-end;"> <input type="range" class="q-val" data-domain="D" min="1" max="10" value="7" oninput="this.nextElementSibling.innerText=this.value" style="width:70px;"> <span style="font-weight:900; color:var(--primary); width:20px; text-align:right; margin-left:10px;">7</span> </div> </div></div></div></div> <div id="pressureSection" style="margin-top:25px; padding:16px; background:#fff8ee; border:1px solid #f0cf9d; border-radius:10px;"> <h4 style="color:#9a5a00; margin:0 0 6px 0;">[회복탄력성·학습복귀 점검 12문항 — 1~10점]</h4> <p style="font-size:0.82em; color:#666; margin:0 0 12px 0;">기존 4대 역량 점수는 유지하면서, 기대 부담·도움 요청·스트레스 해소·다시 공부로 돌아오는 힘을 추가로 확인합니다.</p> <div id="pressure_inputs" style="display:grid; grid-template-columns:1fr 1fr; gap:10px;"> <div style="font-size:0.85em; background:#fff; padding:8px 12px; border-radius:7px; border:1px solid #ead8bc; display:flex; justify-content:space-between; align-items:center;"> <span style="flex:1;"><b>1.</b> 부모님이나 선생님의 기대에 못 미칠까 봐 걱정되는 경우가 많다.</span> <div style="display:flex; align-items:center; width:120px; justify-content:flex-end;"> <input type="range" class="pressure-val" data-pid="P1" min="1" max="10" value="7" oninput="this.nextElementSibling.innerText=this.value" style="width:78px;"> <span style="font-weight:900; color:#9a5a00; width:22px; text-align:right; margin-left:8px;">7</span> </div> </div> <div style="font-size:0.85em; background:#fff; padding:8px 12px; border-radius:7px; border:1px solid #ead8bc; display:flex; justify-content:space-between; align-items:center;"> <span style="flex:1;"><b>2.</b> 좋은 결과를 내야 주변 사람을 실망시키지 않을 것 같다는 생각이 든다.</span> <div style="display:flex; align-items:center; width:120px; justify-content:flex-end;"> <input type="range" class="pressure-val" data-pid="P2" min="1" max="10" value="7" oninput="this.nextElementSibling.innerText=this.value" style="width:78px;"> <span style="font-weight:900; color:#9a5a00; width:22px; text-align:right; margin-left:8px;">7</span> </div> </div> <div style="font-size:0.85em; background:#fff; padding:8px 12px; border-radius:7px; border:1px solid #ead8bc; display:flex; justify-content:space-between; align-items:center;"> <span style="flex:1;"><b>3.</b> 내가 원하는 학교나 진로를 왜 원하는지 내 말로 설명할 수 있다.</span> <div style="display:flex; align-items:center; width:120px; justify-content:flex-end;"> <input type="range" class="pressure-val" data-pid="P3" min="1" max="10" value="7" oninput="this.nextElementSibling.innerText=this.value" style="width:78px;"> <span style="font-weight:900; color:#9a5a00; width:22px; text-align:right; margin-left:8px;">7</span> </div> </div> <div style="font-size:0.85em; background:#fff; padding:8px 12px; border-radius:7px; border:1px solid #ead8bc; display:flex; justify-content:space-between; align-items:center;"> <span style="flex:1;"><b>4.</b> 혼자 해결되지 않으면 너무 늦기 전에 선생님·부모·주변 사람에게 도움을 요청한다.</span> <div style="display:flex; align-items:center; width:120px; justify-content:flex-end;"> <input type="range" class="pressure-val" data-pid="P4" min="1" max="10" value="7" oninput="this.nextElementSibling.innerText=this.value" style="width:78px;"> <span style="font-weight:900; color:#9a5a00; width:22px; text-align:right; margin-left:8px;">7</span> </div> </div> <div style="font-size:0.85em; background:#fff; padding:8px 12px; border-radius:7px; border:1px solid #ead8bc; display:flex; justify-content:space-between; align-items:center;"> <span style="flex:1;"><b>5.</b> 힘들어도 주변 사람에게 티를 내지 않고 혼자 버티는 편이다.</span> <div style="display:flex; align-items:center; width:120px; justify-content:flex-end;"> <input type="range" class="pressure-val" data-pid="P5" min="1" max="10" value="7" oninput="this.nextElementSibling.innerText=this.value" style="width:78px;"> <span style="font-weight:900; color:#9a5a00; width:22px; text-align:right; margin-left:8px;">7</span> </div> </div> <div style="font-size:0.85em; background:#fff; padding:8px 12px; border-radius:7px; border:1px solid #ead8bc; display:flex; justify-content:space-between; align-items:center;"> <span style="flex:1;"><b>6.</b> 중간에 쉬면 뒤처질 것 같아서 쉬는 것이 불편하다.</span> <div style="display:flex; align-items:center; width:120px; justify-content:flex-end;"> <input type="range" class="pressure-val" data-pid="P6" min="1" max="10" value="7" oninput="this.nextElementSibling.innerText=this.value" style="width:78px;"> <span style="font-weight:900; color:#9a5a00; width:22px; text-align:right; margin-left:8px;">7</span> </div> </div> <div style="font-size:0.85em; background:#fff; padding:8px 12px; border-radius:7px; border:1px solid #ead8bc; display:flex; justify-content:space-between; align-items:center;"> <span style="flex:1;"><b>7.</b> 스트레스를 풀 수 있는 나만의 방법이 있고, 쉬고 나면 다시 할 일로 돌아오는 편이다.</span> <div style="display:flex; align-items:center; width:120px; justify-content:flex-end;"> <input type="range" class="pressure-val" data-pid="P7" min="1" max="10" value="7" oninput="this.nextElementSibling.innerText=this.value" style="width:78px;"> <span style="font-weight:900; color:#9a5a00; width:22px; text-align:right; margin-left:8px;">7</span> </div> </div> <div style="font-size:0.85em; background:#fff; padding:8px 12px; border-radius:7px; border:1px solid #ead8bc; display:flex; justify-content:space-between; align-items:center;"> <span style="flex:1;"><b>8.</b> 잠깐 쉬려고 시작한 게임·영상·SNS·취미가 너무 길어져 복귀가 어려운 경우가 있다.</span> <div style="display:flex; align-items:center; width:120px; justify-content:flex-end;"> <input type="range" class="pressure-val" data-pid="P8" min="1" max="10" value="7" oninput="this.nextElementSibling.innerText=this.value" style="width:78px;"> <span style="font-weight:900; color:#9a5a00; width:22px; text-align:right; margin-left:8px;">7</span> </div> </div> <div style="font-size:0.85em; background:#fff; padding:8px 12px; border-radius:7px; border:1px solid #ead8bc; display:flex; justify-content:space-between; align-items:center;"> <span style="flex:1;"><b>9.</b> 하루 계획이 무너지거나 시험을 망쳐도 다음날 중요한 것부터 다시 시작할 수 있다.</span> <div style="display:flex; align-items:center; width:120px; justify-content:flex-end;"> <input type="range" class="pressure-val" data-pid="P9" min="1" max="10" value="7" oninput="this.nextElementSibling.innerText=this.value" style="width:78px;"> <span style="font-weight:900; color:#9a5a00; width:22px; text-align:right; margin-left:8px;">7</span> </div> </div> <div style="font-size:0.85em; background:#fff; padding:8px 12px; border-radius:7px; border:1px solid #ead8bc; display:flex; justify-content:space-between; align-items:center;"> <span style="flex:1;"><b>10.</b> 여행·행사·시험 종료 등으로 흐름이 끊기면 원래 공부 리듬을 찾는 데 오래 걸린다.</span> <div style="display:flex; align-items:center; width:120px; justify-content:flex-end;"> <input type="range" class="pressure-val" data-pid="P10" min="1" max="10" value="7" oninput="this.nextElementSibling.innerText=this.value" style="width:78px;"> <span style="font-weight:900; color:#9a5a00; width:22px; text-align:right; margin-left:8px;">7</span> </div> </div> <div style="font-size:0.85em; background:#fff; padding:8px 12px; border-radius:7px; border:1px solid #ead8bc; display:flex; justify-content:space-between; align-items:center;"> <span style="flex:1;"><b>11.</b> 작은 실수 하나 때문에 그 뒤 공부나 시험까지 흔들리는 경우가 있다.</span> <div style="display:flex; align-items:center; width:120px; justify-content:flex-end;"> <input type="range" class="pressure-val" data-pid="P11" min="1" max="10" value="7" oninput="this.nextElementSibling.innerText=this.value" style="width:78px;"> <span style="font-weight:900; color:#9a5a00; width:22px; text-align:right; margin-left:8px;">7</span> </div> </div> <div style="font-size:0.85em; background:#fff; padding:8px 12px; border-radius:7px; border:1px solid #ead8bc; display:flex; justify-content:space-between; align-items:center;"> <span style="flex:1;"><b>12.</b> 완벽하게 하지 못하더라도 우선 끝내고 다음에 수정할 수 있다.</span> <div style="display:flex; align-items:center; width:120px; justify-content:flex-end;"> <input type="range" class="pressure-val" data-pid="P12" min="1" max="10" value="7" oninput="this.nextElementSibling.innerText=this.value" style="width:78px;"> <span style="font-weight:900; color:#9a5a00; width:22px; text-align:right; margin-left:8px;">7</span> </div> </div></div> </div> <button onclick="generateReport()" style="width:100%; padding:18px; background:var(--primary); color:white; border:none; border-radius:8px; cursor:pointer; font-size:1.2em; font-weight:900; margin-top:25px; box-shadow: 0 4px 15px rgba(26,35,126,0.2);">최종 리포트 생성 및 인쇄</button> </div> <div class="page" id="p1" style="display:none;"> <div class="cover-content"> <div class="cover-title">APEX 학업역량 정밀진단 리포트</div> <div class="cover-desc"> APEX는 단순히 현재 성적만 보는 검사가 아닙니다. 탐구·자기주도·정서·학습습관의 4대 영역을 통해 학생이 <b>어떻게 배우고, 실행하고, 경쟁 속에서 얼마나 안정적으로 성장할 수 있는지</b>를 함께 봅니다.<br><br> <b>30여 년간 축적된 학생 상담·지도 사례와 성장 관찰 경험을 바탕으로 설계된 학업역량 정밀진단</b>으로, 성적만으로는 보이지 않는 학습 성향과 성장 패턴을 살피고 <b>실제 교과 성취도·전국 수준 평가·과목별 선행·심화 정도</b>를 함께 반영합니다. 이를 통해 <b>성장 DNA, 현재 학업 준비도, 학업 지속력</b>을 구분해 보여주며, 현재의 성취뿐 아니라 <b>앞으로 어떤 방식으로 성장할 가능성이 있는지</b>까지 상담할 수 있도록 설계했습니다. </div> <table class="info-table"> <tbody><tr><td class="label">검사 회차</td><td id="outSessionText" style="color:var(--secondary);"></td></tr> <tr><td class="label">검사 일시</td><td id="outDate"></td></tr> <tr><td class="label">학 교</td><td id="outSchool"></td></tr> <tr><td class="label">학 년</td><td id="outGrade"></td></tr> <tr><td class="label">이 름</td><td id="outName"></td></tr> </tbody></table> </div> <div style="margin-top:10px;text-align:center;font-size:0.80em;color:#555;font-weight:700;"> 현재의 점수보다, 앞으로 어떻게 성장할 학생인지를 함께 봅니다. </div> <div class="footer">Page 1 | APEX Academic Intelligence System by Sparta</div> </div> <div class="page" id="p2" style="display:none;"> <div class="report-header" id="header-p2"></div> <h3 style="margin-top:0;">📋 Step 0. 기초 학습 환경 및 진로 인식 데이터 (16문항)</h3> <div id="step0_display" class="survey-grid"></div> <div class="analysis-box" style="margin-top:15px; padding: 15px 20px;"> <b>💡 진단 데이터의 가치:</b> 위 기초 정보는 학생의 학업 성취 이면에 숨겨진 '학습 근력'을 해석하는 결정적인 필터입니다. 교육전문가는 학생의 주관적인 자기 인식과 실제 습관 데이터 사이의 괴리를 분석하여, 입학 후 발생할 수 있는 성적 변동성과 적응 리스크를 선제적으로 파악합니다. </div> <div class="footer">Page 2 | APEX Academic Intelligence System by Sparta</div> </div> <div class="page" id="p3" style="display:none;"> <div class="report-header" id="header-p3"></div> <h3>📝 4대 핵심 역량별 정밀 진단 상세 데이터</h3> <p style="color:#666; font-size:0.9em; margin-bottom:10px;">* 아래 수치는 학생의 평소 태도와 실재하는 행동 증거(Fact)를 1~10점으로 환산한 결과입니다.</p> <div id="main_survey_display"></div> <div class="footer">Page 3 | APEX Academic Intelligence System by Sparta</div> </div> <div class="page" id="p3a" style="display:none;"> <div class="report-header" id="header-p3a"></div> <h3>🧭 회복탄력성·학습복귀 점검</h3> <p style="color:#666; font-size:0.9em; margin-bottom:10px;">* 기존 4대 역량 총점과 별도로, 중요한 시험·진학·경쟁 상황에서 흔들린 뒤 얼마나 잘 회복하고 다시 공부로 돌아오는지 확인합니다.</p> <div id="pressureProfileSummary" class="analysis-box" style="background:#fff; border-left:8px solid #d98b1f;"></div> <div id="pressureSurveyDisplay" style="margin-top:12px;"></div> <div id="pressureWatchArea" style="margin-top:12px;"></div> <div class="footer">APEX | 압박·회복 추가 점검</div> </div> <div class="page" id="p4" style="display:none;"> <div class="report-header" id="header-p4"></div> <h3>🔍 학업역량 정밀진단 시스템 개요</h3> <div id="step_overview_box" class="analysis-box" style="background: white; border-left: 8px solid var(--primary);"></div> <div class="total-box"> <div style="font-weight:700; color:#666; letter-spacing:1px;" id="totalBoxTitle">APEX 성장 DNA</div> <div class="total-val"> <span id="resTotal">0 / 240</span> <span id="trendBadge" class="trend-badge" style="display:none;"></span> </div> <div style="font-size:1.4em; font-weight:900; color:var(--secondary);" id="resTier"></div> </div> <div class="analysis-box" style="margin-top:12px; background:#f8fbff; border-left:6px solid var(--secondary); padding:13px 17px; font-size:0.86em; line-height:1.65;"> <b>이 점수는 무엇인가요?</b><br> <b>APEX 성장 DNA</b>는 탐구·자기주도·정서·학습습관에서 반복적으로 나타나는 <b>학생의 학습 성향과 성장 방식</b>을 보여줍니다. 교과 성적이나 선행 정도를 합친 학교 점수가 아니라, 학생이 <b>어떻게 배우고, 실행하고, 흔들린 뒤 다시 움직이는지</b>를 보여줍니다.<br> </div> <div style="display:grid; grid-template-columns: 1fr 1fr; gap: 20px; align-items: center; margin-top:20px;"> <div style="text-align:center;"> <div id="radarChartSvg" style="height:270px; width:100%; position:relative;"></div> <p style="font-size:0.8em; color:#777; margin-top:5px; font-weight:bold;">* 탐구·자기주도·정서·학습습관의 균형을 한눈에 보여주는 그래프입니다.</p> </div> <div> <h3>🏆 교육전문가 종합 정밀 진단</h3> <div id="resSummary" class="analysis-box" style="background:#fff; margin-bottom:0; line-height: 1.7;"></div> <div id="mismatchArea"></div> </div> </div> <div class="footer">Page 4 | APEX Academic Intelligence System by Sparta</div> </div> <div class="page" id="p5" style="display:none;"> <div class="report-header" id="header-p5"></div> <h3>📊 4대 핵심 역량별 심층 분석 (Part 1)</h3> <div id="domainPart1"></div> <div class="footer">Page 5 | APEX Academic Intelligence System by Sparta</div> </div> <div class="page" id="p6" style="display:none;"> <div class="report-header" id="header-p6"></div> <h3>📊 4대 핵심 역량별 심층 분석 (Part 2)</h3> <div id="domainPart2"></div> <h3 style="margin-top: 15px;">📝 역량 평가 척도(Rubric) 가이드</h3> <div style="background:#f4f7f9; padding:15px 20px; border-radius:10px; line-height: 1.5; font-size:0.88em;"> <div style="margin-bottom: 6px;"><b>💎 강점 뚜렷 (9~10점):</b> 해당 역량을 증명할 구체적 사례와 탐구 보고서 등의 결과물이 실재합니다. 현상의 원리에 대해 스스로 '왜?'라고 질문하며 난제 해결을 즐기는 단계로, 어떤 경쟁 환경에서도 최상위권을 유지할 DNA를 보유하고 있습니다.</div> <div style="margin-bottom: 6px;"><b>✅ 안정 (7~8점):</b> 성실하게 수행 중이나 사례가 평범하며 특목고 입학 후 내신 경쟁을 견딜 안정적 기초 체력 단계입니다.</div> <div style="margin-bottom: 6px;"><b>🔎 성장 중 (5~6점):</b> 필요성은 인지하나 기복이 심하며 특정 흥미 분야 외에는 학습 습관이 부족한 단계입니다.</div> <div style="margin-bottom: 0;"><b>⚠️ 기초 구조 보완 (4점 이하):</b> 메타인지가 부족하고 환경 통제가 불가능한 상태로, 고강도 학업 환경에 들어가기 전 학습 구조와 생활 관리의 보완이 필요합니다.</div> </div> <div class="footer">Page 6 | APEX Academic Intelligence System by Sparta</div> </div> <div class="page" id="p7" style="display:none;"> <div class="report-header" id="header-p7"></div> <h3 style="margin-top:4px;margin-bottom:8px;">📊 핵심 진단 점수 · 성장 DNA · 계열 적합도</h3> <div id="academicModeBanner" style="margin-bottom:10px;"></div> <div id="schoolThreeAxisSummary" style="margin-bottom:10px;"></div> <div id="dnaPositionSummary" style="margin-bottom:10px;"></div> <div id="streamFitSummary" style="margin-bottom:10px;"></div> <div id="readinessDetailSummary" style="margin-bottom:10px;"></div> <div id="subjectProfileSummary" style="margin-bottom:10px;"></div> <div id="achievementStabilitySummary" style="margin-bottom:10px;"></div> <div class="analysis-box" style="margin:0; font-size:0.78em; padding:10px 13px; line-height:1.5; background:#f8fbff; border-left:5px solid var(--secondary);"> <b>상담에서 보는 순서</b><br> ① <b>성장 DNA</b>로 학생의 학습 성향과 현재 성장 단계를 보고, ② <b>학업 기반·준비 상태</b>로 현재 확보된 교과·객관자료·심화 수준을 확인하며, ③ <b>학업 지속력</b>으로 흐름 유지와 회복 가능성을 함께 봅니다. 초등과 학교 성적이 없는 중1~2는 정량 순위보다 <b>성장 기반과 탐색 방향</b>을 중심으로 해석합니다. </div> <div class="footer">Page 7 | APEX 핵심 진단 점수 · 성장 DNA · 계열 적합도</div> </div> <div class="page" id="p8" style="display:none;"> <div class="report-header" id="header-p8"></div> <h3 id="schoolPageTitle" style="margin-top:4px;margin-bottom:8px;">🏫 주요 고교 현재 준비도</h3> <div id="schoolPageIntro" class="analysis-box" style="margin:0 0 10px 0; font-size:0.78em; padding:10px 13px; line-height:1.45; background:#f8fbff; border-left:5px solid var(--secondary);"> 학교별 점수는 <b>실제 교과 수준·모의평가 수준·과목별 선행·심화·APEX 학업역량</b>을 학교 특성에 맞게 종합한 상담용 준비도 지표입니다. 합격 확률이 아니라 <b>현재 준비 상태와 보완 방향</b>을 확인하는 용도로 해석합니다. </div> <div class="school-grid" id="schoolGrid"></div> <div id="schoolLegend" style="margin-top:10px; font-size:0.74em; text-align:center; color:#666; font-weight:bold; background:#f4f7f9; padding:6px; border-radius:5px;"> <span class="gap-plus">현재 준비도 충분</span> · <span style="color:#1565c0;">도전 가능·보완 필요</span> · <span class="gap-minus">준비도 추가 보완 필요</span> </div> <div class="footer">Page 8 | APEX 진학 환경 · 학교 준비도</div> </div> <div class="page" id="p9" style="display:none;"> <div class="report-header" id="header-p9"></div> <h3>🎯 진로 · 주제탐구 · 생기부 통합 설계</h3> <p style="font-size:0.84em;color:#666;margin:0 0 9px 0;line-height:1.45;"> 앞의 진단을 실제 학교생활로 연결합니다. <b>진단 근거 → 전략 → 학교 안에서 남길 증거</b>의 순서로 봅니다. </p> <div id="experienceProfileBox" class="analysis-box" style="background:#fffaf0;border-left:7px solid #d98b1f;padding:10px 13px;"></div> <div id="strategyProfileSummary" class="analysis-box" style="background:#f8fbff;border-left:7px solid var(--secondary);padding:10px 13px;"></div> <div id="careerStrategyBox" class="analysis-box" style="background:#fff;border-left:7px solid #3949ab;"></div> <div id="inquiryStrategyBox" class="analysis-box" style="background:#fff;border-left:7px solid #00897b;"></div> <div id="recordStrategyBox" class="analysis-box" style="background:#fff;border-left:7px solid #d98b1f;"></div> <div id="deliverableBox" style="margin-top:8px;padding:9px 12px;background:#f7f8fa;border-radius:8px;font-size:0.77em;color:#555;line-height:1.5;"></div> <div style="margin-top:7px;padding:8px 11px;background:#fff7e8;border-radius:8px;font-size:0.73em;color:#666;line-height:1.4;"> ※ 외부 활동 자체가 학생부에 자동으로 기록되는 것은 아닙니다. 외부 경험은 <b>교과 질문 → 수업·수행평가·교내 탐구 → 학교 안 결과물</b>로 연결할 때 의미가 있습니다. </div> <div class="footer">Page 9 | APEX 진로 · 탐구 · 학생부 통합 설계</div> </div> <div class="page" id="p10" style="display:none;"> <div class="report-header" id="header-p10"></div> <h3>📋 개인 실행 로드맵 · 다음 상담 체크포인트</h3> <p style="font-size:0.84em;color:#666;margin:0 0 9px 0;line-height:1.45;"> 강점·보완영역·현재 준비도·회복 패턴을 조합해 다음 4주의 행동과 확인 기준을 정합니다. </p> <div id="personalActionSummary" class="analysis-box" style="background:#f8fbff;border-left:7px solid var(--secondary);padding:10px 13px;"></div> <div id="priorityActionBox" style="margin-top:8px;"></div> <table style="width:100%;border-collapse:collapse;margin-top:9px;font-size:0.76em;"> <thead> <tr style="background:#f1f4f8;"> <th style="padding:6px;border:1px solid #dfe5ec;width:11%;">주차</th> <th style="padding:6px;border:1px solid #dfe5ec;width:35%;">핵심 행동</th> <th style="padding:6px;border:1px solid #dfe5ec;width:34%;">남길 결과물</th> <th style="padding:6px;border:1px solid #dfe5ec;width:20%;">확인 기준</th> </tr> </thead> <tbody id="fourWeekPlanBody"></tbody> </table> <div id="nextConsultBox" style="margin-top:9px;padding:9px 12px;background:#fff7e8;border-radius:8px;font-size:0.76em;line-height:1.45;color:#555;"></div> <div style="margin-top:10px;text-align:center;" class="no-print"> <button onclick="window.print()" style="background:#d32f2f;padding:11px 38px;color:white;border:none;border-radius:8px;font-weight:900;cursor:pointer;font-size:1em;">최종 리포트 PDF 저장 및 인쇄</button> </div> <div class="footer">Page 10 | APEX 개인 실행 로드맵</div> </div> </div> <script> // --- 설문 문항 세트 --- const step0_short_1 = [ "1. 미래에 가장 깊게 공부해보고 싶은 점검 분야와 그 이유는?", "2. 평소 유튜브나 SNS에서 즐겨보는 콘텐츠 유형은?", "3. 나만의 특별한 '취미'나 남들보다 잘하는 '특기'는?", "4. 미래에 가고 싶은 '목표 고등학교'와 '장래희망'은?", "5. 본인이 생각하는 자신의 공부 스타일은?", "6. 주당 평균 사교육 시간 vs 순수 공부 시간의 비율은?", "7. 수학 공식을 스스로 유도하거나 원리를 증명해 본 적 있는가?", "8. 교과서 외 점검 분야로 '주제 탐구 보고서'를 써봤는가?", "9. 최근 1년간 진로 관련 책을 5권 이상 정독했는가?", "10. 공부할 때 스마트폰 유혹을 스스로 완전히 통제하는가?", "11. 성적이 하락했을 때 감정에 휘둘리지 않고 원인을 분석하는가?", "12. 모르는 내용이 나오면 질문하거나 찾아 끝까지 해결하는가?", "13. 공부 잘하는 친구를 경쟁자보다 배우고 싶은 파트너로 보는가?", "14. 기숙사 생활의 엄격한 규칙(폰 사용 등)을 잘 지킬 자신이 있는가?", "15. 매일 일정한 시간에 기상하고 취침하는 생활 루틴이 있는가?", "16. 진단 결과를 통해 정확한 합격 가능성을 알고 싶은가?" ]; const step0_short_2 = [ "1. 지난 검사 이후 점검 분야의 구체적인 변화나 발전은?", "2. 최근 학습 목적으로 자발적으로 찾아본 영상 콘텐츠는?", "3. 최근 스트레스 해소용으로 건전하게 수행한 취미 활동은?", "4. 목표 고교 진학에 대한 최근의 의지 변화(상승/하락)?", "5. 현재 자신의 공부법 중 가장 개선하고 싶은 점은?", "6. 최근 1개월 순수 자기주도 학습 시간의 증감 여부는?", "7. 최근 어려운 수/과학 문제를 30분 이상 끈질기게 고민했는가?", "8. 최근 수행평가/과제 시 추가로 심화 탐구를 진행했는가?", "9. 지난 검사 이후 진로/전공 관련 자료를 스스로 찾아 읽었는가?", "10. 알림이 울려도 즉각 확인하지 않고 정해진 시간에만 보는가?", "11. 최근 실수했을 때 좌절보다 오답 분석을 먼저 실행했는가?", "12. 모르는 부분을 선생님/조교님께 논리적으로 질문하는 빈도가 늘었는가?", "13. 최근 친구와 학습 내용에 대해 긍정적으로 토론한 적 있는가?", "14. 주말에도 평일과 유사한 기상 시간을 스스로 지키고 있는가?", "15. 최근 1개월 내 수면 부족으로 수업에 존 적이 없는가?", "16. 이번 검사를 통해 스스로의 약점을 직면하고 개선할 의지가 있는가?" ]; // 프린트용 분할 배열 const step0_detail_1_part1 = [ "1. 미래에 가장 깊게 공부해보고 싶은 점검 분야(전공)는 무엇이며, 그 이유는 무엇입니까?", "2. 평소 유튜브나 SNS에서 가장 즐겨보는 콘텐츠 유형 3가지는 무엇입니까?", "3. 남들에게 자신 있게 말할 수 있는 나만의 특별한 '취미'나 '특기'는 무엇입니까?", "4. 현재 진학을 희망하는 '목표 고등학교'와 구체적인 '장래희망(직업)'을 적어주세요.", "5. 본인이 생각하는 자신의 공부 스타일은 어디에 가깝습니까? (마스터형/완벽주의형/팔로워형/지능의존형)", "6. 일주일 평균 '학원/과외 시간'과 혼자 공부하는 '순수 공부 시간'의 비율은 대략 몇 대 몇 입니까?", "7. [O/X] 수학 공식을 무작정 암기하지 않고, 스스로 유도해 보거나 원리를 증명해 본 적이 있습니까?", "8. [O/X] 교과서 내용 외에 지적 호기심이 생겨 스스로 '주제 탐구 보고서'를 찾아 써본 적이 있습니까?" ]; const step0_detail_1_part2 = [ "9. [O/X] 최근 1년 동안 자신의 진로와 관련된 전문 서적(비문학)을 5권 이상 끝까지 정독했습니까?", "10. [O/X] 공부할 때 스마트폰을 다른 방에 두는 등 유혹을 물리적으로 완벽히 통제하고 있습니까?", "11. [O/X] 시험 성적이 떨어졌을 때, 우울해하기보다 즉시 오답 원인을 분석하고 다음 계획을 세웁니까?", "12. [O/X] 공부하다 모르는 개념이 나오면, 답지를 보기 전 선생님께 질문하거나 끝까지 파고들어 해결합니까?", "13. [O/X] 나보다 성적이 좋은 친구를 시기하거나 질투하기보다, 배울 점을 찾는 파트너로 생각합니까?", "14. [O/X] 전자기기 압수, 엄격한 점호 등 특목고/자사고의 기숙사 규칙을 스트레스 없이 지킬 자신이 있습니까?", "15. [O/X] 주말과 평일 상관없이 매일 일정한 시간에 자고 일어나는 확고한 생활 루틴이 있습니까?", "16. [O/X] 본 진단 결과를 통해 특목고/자사고 합격 가능성과 나의 냉정한 현실을 직면할 준비가 되었습니까?" ]; const step0_detail_2_part1 = [ "1. 지난 1차 검사 이후, 진로 방향이나 깊게 탐구해보고 싶은 점검 분야에 긍정적인 변화나 발전이 있었습니까?", "2. 최근 1개월 동안 유튜브 등 영상 매체를 단순 오락이 아닌 '학습 및 탐구 목적'으로 활용한 사례가 있습니까?", "3. 최근 시험 기간이나 스트레스 상황에서 멘탈 관리를 위해 건전하게 수행한 취미 활동이 있습니까?", "4. 지난 검사 때 설정했던 '목표 고등학교'에 대한 진학 의지가 더 확고해졌습니까, 아니면 흔들림이 있습니까?", "5. 현재 자신의 공부법 중 가장 개선하고 싶은 점은 무엇입니까?", "6. 지난 검사 대비 일주일 평균 '순수 자기주도 학습 시간'이 명확하게 증가했습니까?", "7. [O/X] 최근 1개월 내, 해설지에 의존하지 않고 어려운 수학/과학 문제를 30분 이상 끈질기게 고민해 본 적이 있습니까?", "8. [O/X] 최근 학교 수행평가나 학원 과제를 할 때, 남들이 안 하는 나만의 심화 탐구 자료를 추가로 찾아보았습니까?" ]; const step0_detail_2_part2 = [ "9. [O/X] 지난 1차 검사 이후, 진로와 관련된 독서나 칼럼, 논문 등을 자발적으로 찾아 읽은 경험이 있습니까?", "10. [O/X] 현재 공부 중에 카톡이나 알림이 울려도 즉각 확인하지 않고, 정해진 휴식 시간에만 확인하는 습관이 정착되었습니까?", "11. [O/X] 최근 모의고사나 단원평가에서 예상치 못한 실수를 했을 때, 감정적 동요 없이 즉각적인 약점 분석을 실행했습니까?", "12. [O/X] 최근 1개월 내, 수업 내용 중 이해가 안 가는 부분을 선생님이나 조교님께 자발적으로 질문한 빈도가 늘었습니까?", "13. [O/X] 최근 친구들과 경쟁의식보다는 서로 모르는 문제를 설명해주며 학습적으로 교류한 적이 있습니까?", "14. [O/X] 최근 주말(토/일)에도 늦잠을 자지 않고 평일과 유사한 기상 시간을 스스로 지키고 있습니까?", "15. [O/X] 최근 1개월 내에 늦은 시간 스마트폰 사용 등으로 인해 수면이 부족하여 수업 시간에 존 적이 한 번도 없습니까?", "16. [O/X] 이번 2차 진단을 통해 스스로의 약점을 명확히 직면하고, 다음 목표를 위해 나쁜 습관을 버릴 준비가 되었습니까?" ]; const domains_1 = { elem: { A: ["새로운 것에 '왜?'라는 질문을 던지는가?", "수학/과학 문제를 풀 때 즐거운가?", "궁금한 점을 끝까지 찾아 확인하는가?", "아는 내용을 그림이나 표로 정리하는가?", "과학 실험이나 관찰 일기를 직접 써봤는가?"], B: ["오늘 배운 것을 1분 안에 설명할 수 있는가?", "시키는 사람이 없어도 숙제를 먼저 하는가?", "읽고 싶은 책을 서점에서 직접 고르는가?", "내가 '안다고 착각하는 부분'을 찾아내는가?", "학습 목표 달성 시 스스로 보상을 정하는가?"], C: ["시험 점수가 낮아도 다음엔 잘할 거라 믿는가?", "안 풀리는 문제가 있어도 짜증 내지 않는가?", "공부 잘하는 친구를 보며 배우려 하는가?", "계획을 못 지켰어도 대안을 생각하는가?", "긴장되는 상황에서도 나를 믿는가?"], D: ["약속한 시간에는 스스로 책상에 앉는가?", "공부할 때 스마트폰 등 방해 요소를 치우는가?", "내일 가방을 스스로 챙기는가?", "스마트폰 사용 시간을 약속하고 지키는가?", "일정한 시간에 기상하고 취침하는가?"] }, mid12: { A: ["개념 유도 과정을 스스로 증명해봤는가?", "논리적 비약을 느끼고 관련 서적을 찾아보는가?", "수학 지식을 실생활 문제 해결에 연결하는가?", "주제 탐구 보고서를 직접 작성해봤는가?", "손으로 직접 정리하며 풀어가는가?", "복습 시 새로운 질문이나 원리를 떠오르는가?"], B: ["오늘 배운 내용을 백지에 구조화할 수 있는가?", "나만의 오답 분석법이나 플래너를 쓰는가?", "지시 없이 학습 로드맵을 스스로 결정하는가?", "시간 단축을 위한 나만의 효율 도구를 쓰는가?", "변형 문제를 예측하며 공부하는가?", "1년 뒤 구체적인 목표와 계획이 있는가?"], C: ["잘하는 친구를 시기보다 파트너로 인식하는가?", "계획이 틀어질 때 즉시 수정하여 실천하는가?", "경쟁 환경의 긴장감을 즐거움으로 느끼는가?", "성적이 떨어져도 평온을 유지하려 노력하는가?", "실수 두려움 없이 새로운 도전에 나서는가?", "에너지를 스스로 관리하고 휴식을 취하는가?"], D: ["공부 시 폰을 물리적으로 격리하여 차단하는가?", "순공 시간과 그냥 앉아 있던 시간을 구분하는가?", "규칙적인 수면을 유지하며 밤에 폰을 안 하는가?", "환경을 탓하기보다 직접 정리하는가?", "지루한 반복 학습도 묵묵히 수행하는가?", "주변 분위기에 휩쓸리지 않고 내 페이스를 지키는가?"] }, mid3: { A: ["목표 학교 인재상에 맞는 탐구 사례가 있는가?", "지적 호기심 해결을 위해 논문을 탐독하는가?", "융합 탐구 전 과정을 주도적으로 수행했는가?", "심화 수학 가중치를 견딜 역량을 갖췄는가?", "사회/글로벌 이슈에 대한 비판적 사고가 뚜렷한가?", "탐구 활동이 세특에 팩트 위주로 적혔는가?"], B: ["자소서 소재가 될 킬러 콘텐츠가 3개 이상인가?", "압박 질문에도 논리적으로 답변할 수 있는가?", "지원 동기를 학교 특성에 맞춰 설명하는가?", "두괄식 답변과 근거 제시 말하기가 습관화됐는가?", "나의 공부 방식이 통할 객관적 증거가 있는가?", "인성 영역의 구체적 실천 사례가 있는가?"], C: ["내신 등급이 급락해도 버틸 회복탄력성이 있는가?", "동료를 적이 아닌 파트너로 보고 협업하는가?", "치열한 경쟁 긴장감을 즐거움으로 승화시키는가?", "한 문제에 매몰되지 않고 흐름을 관리하는가?", "실패의 원인을 나의 전략 수정에서 찾는가?", "현재 페이스가 입시 당일까지 지속 가능한가?"], D: ["'3무 문화' 기숙 생활을 견딜 각오가 되었는가?", "외부 강제성 없이 매일 5시간 이상의 순공를 하는가?", "기숙사 규칙 준수 및 자기 절제 능력이 있는가?", "매일 '진짜 공부 시간'을 철저히 기록하는가?", "장소 상관없이 즉시 몰입 모드가 가능한가?", "1점을 더 따기 위한 집요한 학습 근성이 있는가?"] } }; const domains_2 = { elem: { A: ["최근 새로운 호기심이 생겨 부모님/선생님께 질문했는가?", "최근 어려운 문제를 스스로 풀고 성취감을 느꼈는가?", "인터넷이나 책에서 궁금한 점의 해답을 직접 찾았는가?", "학습한 내용을 자신만의 그림이나 마인드맵으로 표현했는가?", "최근 관찰 일기나 간단한 실험 기록을 작성해 보았는가?"], B: ["최근 배운 내용을 거울을 보며 소리 내어 설명해 보았는가?", "부모님 말씀 전에 스스로 숙제를 시작하는 빈도가 늘었는가?", "서점이나 도서관에서 스스로 읽고 싶은 책을 고르는가?", "내가 틀린 문제를 왜 틀렸는지 스스로 말할 수 있는가?", "스스로 정한 공부 목표를 달성하고 보상을 즐겼는가?"], C: ["최근 단원평가를 망쳤어도 '다음엔 잘해야지'라고 다짐했는가?", "풀리지 않는 문제 앞에서 짜증내지 않고 다시 시도하는가?", "친구의 좋은 점을 칭찬하고 나도 따라 해보려 노력하는가?", "계획표를 못 지킨 날, 빈 시간에 보충 공부를 했는가?", "발표나 시험 등 긴장되는 상황에서 심호흡을 하며 극복하는가?"], D: ["최근 일주일 간 약속한 시간에 스스로 책상에 앉았는가?", "공부할 때 스마트폰이나 장난감을 내 시야에서 치우는가?", "엄마의 도움 없이 내일 학교 갈 가방을 완벽히 챙기는가?", "최근 게임이나 스마트폰 사용 약속 시간을 스스로 지켰는가?", "주말에도 평일처럼 일정한 기상/취침 시간을 유지하는가?"] }, mid12: { A: ["최근 한 달 내 수학 개념의 유도 과정을 빈 종이에 써보았는가?", "학원 진도와 무관하게 호기심으로 책이나 자료를 찾아보았는가?", "최근 배운 지식을 실생활이나 다른 과목에 연결해 보았는가?", "수행평가를 위해 교과서 밖의 심화 자료를 분석해 보았는가?", "단순 눈으로 읽지 않고 반드시 손으로 쓰면서 공부하는가?", "복습할 때 스스로 새로운 질문이나 변형 문제를 만들어보는가?"], B: ["최근 오늘 배운 핵심 내용을 백지에 안 보고 적을 수 있는가?", "단순 오답 노트가 아닌 '오답의 논리적 원인'을 분석하는가?", "스스로 일주일 치 학습 분량을 정하고 달성도를 체크하는가?", "자신만의 암기법이나 시간 단축 노하우를 개발해 적용하는가?", "학원 숙제 외에 나의 취약점을 메우는 개인 공부 시간이 있는가?", "최근 나의 진로 목표 달성을 위해 구체적인 단기 계획을 세웠는가?"], C: ["경쟁자의 성과를 시기하지 않고 나의 전략 수정 지표로 삼는가?", "예상치 못한 스케줄 변경에도 당황하지 않고 대안을 실행하는가?", "최근 시험이나 모의고사에서 적절한 긴장감을 즐기며 집중했는가?", "성적이 떨어졌을 때, 슬퍼하는 시간보다 대안을 찾는 시간이 더 짧은가?", "실수할까 봐 두려워서 어려운 문제 도전을 포기하지 않는가?", "최근 학업 스트레스를 핑계로 계획을 미루지 않고 스스로 통제했는가?"], D: ["최근 일주일 간 공부 시 스마트폰을 다른 방에 두고 차단했는가?", "플래너에 적힌 공부 시간에서 '멍 때린 시간'을 솔직히 뺐는가?", "밤늦게 스마트폰을 하느라 다음 날 학교/학원 수업에 졸지 않았는가?", "공부 전 책상 정리에 5분 이상 쓰지 않고 즉시 몰입하는가?", "하기 싫고 지루한 단순 암기 과목도 정해진 시간 동안 묵묵히 했는가?", "쉬는 시간에 주변 분위기에 휩쓸리지 않고 나의 페이스를 지키는가?"] }, mid3: { A: ["최근 목표 학교 인재상에 맞는 새로운 심화 탐구 사례를 기획했는가?", "교과서 밖 지식 확장을 위해 최근 소논문이나 칼럼을 탐독했는가?", "정답이 없는 융합 탐구 과제에서 주도적으로 가설 세우고 검증했는가?", "최근 심화 수학 킬러 문항을 해설지 없이 30분 이상 끈질기게 고민했는가?", "최근 사회/글로벌 이슈를 비판적으로 분석하여 자신의 의견을 정리했는가?", "자신의 탐구 활동 결과를 구체적인 데이터(Fact) 위주로 요약할 수 있는가?"], B: ["지난 검사 이후, 자소서용 킬러 콘텐츠의 논리적 깊이를 더욱 보완했는가?", "나의 연구/탐구 활동에 대한 날카로운 압박 질문을 예상하고 방어 논리를 짰는가?", "지원 동기를 추상적인 말이 아닌, 나의 구체적 경험과 연결하여 설명하는가?", "평소 발표나 대화 시 '결론부터 말하고 근거를 대는' 두괄식 화법을 쓰는가?", "자신의 학습법이 효율적이라는 것을 증명할 1차/2차 진단 데이터나 성적이 있는가?", "최근 리더십이나 갈등 해결 등 인성 영역의 구체적인 실천 사례를 만들었는가?"], C: ["특목고 진학 후 첫 내신에서 4등급을 받아도 멘탈을 회복할 시뮬레이션이 되었는가?", "최근 경쟁 환경 속에서도 친구들과 지식을 나누며 협력적 시너지를 내고 있는가?", "시험이 다가올수록 불안해하기보다, 치열한 긴장감을 성장의 원동력으로 승화시키는가?", "최근 모의고사에서 막히는 문제를 만났을 때, 당황하지 않고 시간 배분을 관리했는가?", "최근의 실패(오답, 성적 하락) 원인을 철저히 자신의 전략 오류에서 찾아 개선했는가?", "현재의 학습 강도와 심리적 안정감이 수능 당일까지 번아웃 없이 지속 가능한가?"], D: ["전자기기 통제, 엄격한 점호 등 기숙사 생활의 압박을 견딜 실전 준비가 끝났는가?", "최근 일주일 간, 학원 지시 없이도 매일 5시간 이상의 '완벽한 순공'을 달성했는가?", "누가 보지 않아도 스스로 정한 엄격한 폰 통제 및 수면 규칙을 100% 지키고 있는가?", "매일 스톱워치를 통해 '진짜 공부 시간'을 측정하고 플래너에 오차 없이 기록하는가?", "주변 소음이나 장소에 상관없이, 책을 펴자마자 1분 내로 즉시 몰입 모드에 들어가는가?", "최상위권 변별을 위해 단 1점의 실수도 용납하지 않는 집요한 학습 근성을 발휘하는가?"] } }; const pressureQuestions = [ {id:"P1", text:"부모님이나 선생님의 기대에 못 미칠까 봐 걱정되는 경우가 많다.", key:"expect", reverse:false}, {id:"P2", text:"좋은 결과를 내야 주변 사람을 실망시키지 않을 것 같다는 생각이 든다.", key:"expect", reverse:false}, {id:"P3", text:"내가 원하는 학교나 진로를 왜 원하는지 내 말로 설명할 수 있다.", key:"ownership", reverse:false}, {id:"P4", text:"혼자 해결되지 않으면 너무 늦기 전에 선생님·부모·주변 사람에게 도움을 요청한다.", key:"help", reverse:false}, {id:"P5", text:"힘들어도 주변 사람에게 티를 내지 않고 혼자 버티는 편이다.", key:"accum", reverse:false}, {id:"P6", text:"중간에 쉬면 뒤처질 것 같아서 쉬는 것이 불편하다.", key:"accum", reverse:false}, {id:"P7", text:"스트레스를 풀 수 있는 나만의 방법이 있고, 쉬고 나면 다시 할 일로 돌아오는 편이다.", key:"release", reverse:false}, {id:"P8", text:"잠깐 쉬려고 시작한 게임·영상·SNS·취미가 너무 길어져 복귀가 어려운 경우가 있다.", key:"reentryBad", reverse:false}, {id:"P9", text:"하루 계획이 무너지거나 시험을 망쳐도 다음날 중요한 것부터 다시 시작할 수 있다.", key:"reentryGood", reverse:false}, {id:"P10", text:"여행·행사·시험 종료 등으로 흐름이 끊기면 원래 공부 리듬을 찾는 데 오래 걸린다.", key:"reentryBad", reverse:false}, {id:"P11", text:"작은 실수 하나 때문에 그 뒤 공부나 시험까지 흔들리는 경우가 있다.", key:"errorBad", reverse:false}, {id:"P12", text:"완벽하게 하지 못하더라도 우선 끝내고 다음에 수정할 수 있다.", key:"errorGood", reverse:false} ]; function renderPressureQuestions(){ const box = document.getElementById('pressure_inputs'); if(!box) return; box.innerHTML = pressureQuestions.map((q,i)=>` <div style="font-size:0.85em; background:#fff; padding:8px 12px; border-radius:7px; border:1px solid #ead8bc; display:flex; justify-content:space-between; align-items:center;"> <span style="flex:1;"><b>${i+1}.</b> ${q.text}</span> <div style="display:flex; align-items:center; width:120px; justify-content:flex-end;"> <input type="range" class="pressure-val" data-pid="${q.id}" min="1" max="10" value="7" oninput="this.nextElementSibling.innerText=this.value" style="width:78px;"> <span style="font-weight:900; color:#9a5a00; width:22px; text-align:right; margin-left:8px;">7</span> </div> </div>`).join(''); } function getPressureValue(id){ const x=document.querySelector(`.pressure-val[data-pid="${id}"]`); return x ? Number(x.value) : 7; } function avgPressure(ids){return ids.reduce((a,id)=>a+getPressureValue(id),0)/ids.length} function calcPressureProfile(){ const expect=avgPressure(['P1','P2']); const ownership=getPressureValue('P3'); const help=getPressureValue('P4'); const accumulation=avgPressure(['P5','P6']); const release=getPressureValue('P7'); const reentry=(11-getPressureValue('P8')+getPressureValue('P9')+11-getPressureValue('P10'))/3; const errorTol=(11-getPressureValue('P11')+getPressureValue('P12'))/2; const pressureControl=(11-expect+ownership)/2; const recoveryHelp=(help+release)/2; const returnTolerance=(reentry+errorTol)/2; return {expect,ownership,help,accumulation,release,reentry,errorTol,pressureControl,recoveryHelp,returnTolerance}; } function pressureLevel(x){return x>=8?'안정':x>=6?'보통':'확인 필요'} function pressureSignals(p){ const r=[]; if(p.expect>=8 && p.ownership<7) r.push(['기대 부담','주변 기대가 자기 목표보다 크게 느껴지는지 상담에서 확인이 필요합니다.']); if(p.accumulation>=8 && p.help<6) r.push(['혼자 참고 버티는 경향','겉으로는 잘 버텨 보여도 힘든 상황을 알리는 시점이 늦을 수 있습니다.']); if(p.reentry<6) r.push(['학습 복귀가 늦음','한 번 흐름이 끊기면 다시 시작하는 데 시간이 걸릴 수 있습니다.']); if(p.errorTol<6) r.push(['작은 실수에 크게 흔들림','작은 실수나 계획 변경이 이후 공부 전체에 번지는지 확인이 필요합니다.']); if(p.release<6) r.push(['스트레스 해소 방법 점검','쉬는 시간을 없애기보다 실제로 회복에 도움이 되는 방법을 찾아야 합니다.']); return r; } let currentSession = "1"; function toggleSession() { currentSession = document.querySelector('input[name="sessionType"]:checked').value; document.getElementById('prevScoreBox').style.display = (currentSession === "2") ? "block" : "none"; renderQuestions(); } function renderQuestions() { const grade = document.getElementById('inGrade').value; const s0Div = document.getElementById('step0_inputs'); s0Div.innerHTML = ""; const currentStep0 = (currentSession === "1") ? step0_short_1 : step0_short_2; currentStep0.forEach((q, i) => { let inputHtml = ""; let wrapperStyle = ""; if(i < 6) { inputHtml = `<input type="text" id="s0_${i}" style="width:100%; padding:10px; font-size:0.9em; border:1px solid #ccc; border-radius:5px;">`; wrapperStyle = "grid-column: 1 / -1;"; } else { inputHtml = `<select id="s0_${i}" style="width:100%; padding:8px; font-size:0.85em; border:1px solid #ccc; border-radius:5px;"><option value="O">O (그렇다)</option><option value="X">X (아니다)</option></select>`; } s0Div.innerHTML += `<div style="${wrapperStyle} margin-bottom:8px;"><label style="font-size:0.85em; color:#555; font-weight:700; margin-bottom:4px; display:block;">${q}</label>${inputHtml}</div>`; }); const container = document.getElementById('main_inputs'); container.innerHTML = ""; const activeDomain = (currentSession === "1") ? domains_1[grade] : domains_2[grade]; for (let d in activeDomain) { let box = document.createElement('div'); box.style.marginBottom = "15px"; box.innerHTML = `<b style="color:var(--primary); font-size:1.05em;">${{A:"탐구(A)", B:"주도(B)", C:"정서(C)", D:"습관(D)"}[d]} 영역</b>`; let grid = document.createElement('div'); grid.style.display="grid"; grid.style.gridTemplateColumns="1fr 1fr"; grid.style.gap="10px"; grid.style.marginTop="5px"; activeDomain[d].forEach((q, i) => { grid.innerHTML += `<div style="font-size:0.85em; background:#f9f9f9; padding:6px 12px; border-radius:6px; border:1px solid #ddd; display:flex; justify-content:space-between; align-items:center;"> <span style="flex:1;">${q}</span> <div style="display:flex; align-items:center; width:110px; justify-content:flex-end;"> <input type="range" class="q-val" data-domain="${d}" min="1" max="10" value="7" oninput="this.nextElementSibling.innerText=this.value" style="width:70px;"> <span style="font-weight:900; color:var(--primary); width:20px; text-align:right; margin-left:10px;">7</span> </div> </div>`; }); box.appendChild(grid); container.appendChild(box); } renderPressureQuestions(); } function setSelectOptions(id, options, keepValue=false){ const el=document.getElementById(id); if(!el) return; const prev=el.value; el.innerHTML=options.map(o=>`<option value="${o[0]}"${o[2]?' selected':''}>${o[1]}</option>`).join(''); if(keepValue && [...el.options].some(o=>o.value===prev)) el.value=prev; } function setFieldLabel(selectId, text){ const el=document.getElementById(selectId); const lab=el?.previousElementSibling; if(lab && lab.tagName==='LABEL') lab.textContent=text; } function updateAcademicInputMode(){ const grade=document.getElementById('inGrade')?.value; const gradeBlock=document.getElementById('gradeAchievementInputBlock'); const foundation=document.getElementById('foundationInputBlock'); const guide=document.getElementById('foundationGuide'); if(!gradeBlock || !foundation) return; const objectiveCommon=[ ['', '미응시 / 객관자료 없음', true], ['100','전국·기관 상위 1% 이내'], ['90','전국·기관 상위 4% 이내'], ['80','전국·기관 상위 11% 이내'], ['65','전국·기관 상위 23% 이내'], ['50','그 이하 / 기초 확인 필요'] ]; if(grade==='elem'){ gradeBlock.style.display='none'; foundation.style.display='block'; if(guide) guide.innerHTML='초5~6은 A/B 성취도 개수를 사용하지 않습니다. <b>현재 교과 기반 · 객관 문제해결 자료 · 심화·확장 · 성장 DNA</b>를 중심으로 성장탐색형 분석을 진행합니다.'; ['Kor','Math','Eng','Sci'].forEach(s=>setSelectOptions('inMock'+s, objectiveCommon)); setFieldLabel('inMockKor','🏆 국어 객관 문제해결 자료 (선택)'); setFieldLabel('inMockMath','🏆 수학 객관 문제해결 자료 (선택)'); setFieldLabel('inMockEng','🏆 영어 객관 문제해결 자료 (선택)'); setFieldLabel('inMockSci','🏆 과학 객관 문제해결 자료 (선택)'); setFieldLabel('inMathLevel','📈 수학 심화·확장'); setSelectOptions('inMathLevel',[ ['', '자료 없음 / 아직 확인하지 않음', true], ['95','상위학년·고난도 개념을 스스로 설명하고 적용'], ['85','현 학년 최상위 응용·심화 문제를 안정적으로 해결'], ['72','현 학년 개념·응용을 안정적으로 이해'], ['60','현 학년 개념은 이해하며 심화를 시작하는 단계'], ['50','현 학년 핵심 개념을 보완하는 단계'] ]); setFieldLabel('inSciLevel','📈 과학 심화·탐구'); setSelectOptions('inSciLevel',[ ['', '자료 없음 / 아직 확인하지 않음', true], ['95','교과 밖 주제까지 스스로 질문·실험·설명 가능'], ['85','현 학년 개념을 바탕으로 심화 탐구를 꾸준히 수행'], ['72','현 학년 개념 이해와 관찰·설명이 안정적'], ['60','현행 개념 중심이며 탐구 경험을 넓히는 단계'], ['50','기초 개념과 과학적 설명을 보완하는 단계'] ]); setFieldLabel('inKorLevel','📖 국어 독해·서술 확장'); setSelectOptions('inKorLevel',[ ['', '자료 없음 / 아직 확인하지 않음', true], ['95','상위학년 장문·비문학을 읽고 근거와 구조를 설명'], ['85','학년 수준 장문 독해·요약·근거 찾기가 안정적'], ['72','현 학년 독해·서술형 수행이 안정적'], ['60','긴 글 독해·요약·서술을 확장하는 단계'], ['50','기초 독해와 문장 표현을 보완하는 단계'] ]); setFieldLabel('inEngLevel','🌐 영어 독해·표현 확장'); setSelectOptions('inEngLevel',[ ['', '자료 없음 / 아직 확인하지 않음', true], ['95','상위학년 원문을 읽고 핵심·근거를 설명 가능'], ['85','학년 수준 이상의 독해·어휘·문장 이해가 안정적'], ['72','현 학년 독해·어휘·문법 기반이 안정적'], ['60','독해·어휘 범위를 넓혀가는 단계'], ['50','기초 어휘·문장 이해를 보완하는 단계'] ]); setFieldLabel('inHisLevel','🌍 사회·역사 배경지식·탐구'); setSelectOptions('inHisLevel',[ ['', '자료 없음 / 아직 확인하지 않음', true], ['95','사건·지역·사회 현상을 연결해 원인과 결과를 설명'], ['85','교과 밖 독서·영상까지 연결해 배경지식을 확장'], ['72','현 학년 사회·역사 개념과 흐름을 안정적으로 이해'], ['60','핵심 개념과 흐름을 넓혀가는 단계'], ['50','기초 개념과 용어 이해를 보완하는 단계'] ]); }else if(grade==='mid12'){ gradeBlock.style.display='block'; foundation.style.display='block'; if(guide) guide.innerHTML='중1~2는 <b>실제 학교 성적이 나온 학기만 A/B 성취도를 입력</b>합니다. 시험 전이라 성적이 없다면 모두 “미이수”로 두고 아래 현재 교과 기반을 입력하면 초기 학업탐색형으로 분석합니다.'; ['Kor','Math','Eng','Sci'].forEach(s=>setSelectOptions('inMock'+s, objectiveCommon)); setFieldLabel('inMockKor','🏆 국어 객관평가·진단 자료 (선택)'); setFieldLabel('inMockMath','🏆 수학 객관평가·진단 자료 (선택)'); setFieldLabel('inMockEng','🏆 영어 객관평가·진단 자료 (선택)'); setFieldLabel('inMockSci','🏆 과학 객관평가·진단 자료 (선택)'); setFieldLabel('inMathLevel','📈 수학 선행·심화'); setSelectOptions('inMathLevel',[ ['', '자료 없음 / 아직 확인하지 않음', true], ['95','고등 공통수학 이상을 이해·적용하며 중등 최상위 심화 안정'], ['85','고등 선행 진행 또는 중등 최상위 심화가 안정적'], ['72','중등 현행 심화·응용이 안정적'], ['60','현행 개념은 안정적이며 심화를 시작하는 단계'], ['50','현행 핵심 개념을 보완하는 단계'] ]); setFieldLabel('inSciLevel','📈 과학 선행·심화'); setSelectOptions('inSciLevel',[ ['', '자료 없음 / 아직 확인하지 않음', true], ['95','통합과학 이상 선행과 중등 심화 탐구가 안정적'], ['85','통합과학 선행 또는 중등 최상위 심화가 안정적'], ['72','중등 현행 개념·심화 문제해결이 안정적'], ['60','현행 개념은 안정적이며 심화 탐구를 시작하는 단계'], ['50','현행 핵심 개념을 보완하는 단계'] ]); setFieldLabel('inKorLevel','📖 국어 심화·독해'); setSelectOptions('inKorLevel',[ ['', '자료 없음 / 아직 확인하지 않음', true], ['95','고1 수준 장문·비문학을 안정적으로 분석'], ['85','중등 고난도 독해·서술 및 예비고 수준 확장'], ['72','중등 현행 독해·서술이 안정적'], ['60','긴 글 독해와 서술을 심화하는 단계'], ['50','기초 독해·서술을 보완하는 단계'] ]); setFieldLabel('inEngLevel','🌐 영어 심화·독해'); setSelectOptions('inEngLevel',[ ['', '자료 없음 / 아직 확인하지 않음', true], ['95','고1 수준 독해·구문을 안정적으로 처리'], ['85','중등 고난도 독해·문법 및 예비고 수준 확장'], ['72','중등 현행 독해·어휘·문법이 안정적'], ['60','독해·구문을 심화하는 단계'], ['50','기초 어휘·문법·독해를 보완하는 단계'] ]); setFieldLabel('inHisLevel','📈 사회·역사 이해·확장'); setSelectOptions('inHisLevel',[ ['', '자료 없음 / 아직 확인하지 않음', true], ['95','고등 통합사회·한국사 수준까지 흐름과 쟁점을 연결'], ['85','중등 역사·사회 흐름을 깊게 이해하고 설명 가능'], ['72','중등 현행 개념과 흐름이 안정적'], ['60','핵심 개념과 흐름을 확장하는 단계'], ['50','기초 개념·용어를 보완하는 단계'] ]); }else{ gradeBlock.style.display='block'; foundation.style.display='none'; setFieldLabel('inMockKor','🏆 국어 전국 수준 / 모의평가'); setFieldLabel('inMockMath','🏆 수학 전국 수준 / 모의평가'); setFieldLabel('inMockEng','🏆 영어 전국 수준 / 모의평가'); setFieldLabel('inMockSci','🏆 과학 전국 수준 / 진단·모의평가'); const mockKorOptions=[['','미응시 / 객관자료 없음',true],['100','전국 상위 1% 이내'],['90','전국 상위 4% 이내 / 1등급 상위'],['80','전국 상위 11% 이내 / 2등급'],['65','전국 상위 23% 이내 / 3등급'],['50','그 이하 / 기초 보완 필요']]; const mockCommon=[['','미응시 / 객관자료 없음',true],['100','전국 상위 1% 이내'],['90','전국 상위 4% 이내'],['80','전국 상위 11% 이내'],['65','전국 상위 23% 이내'],['50','그 이하 / 기초 보완 필요']]; setSelectOptions('inMockKor',mockKorOptions); setSelectOptions('inMockMath',mockKorOptions); setSelectOptions('inMockEng',mockCommon); setSelectOptions('inMockSci',mockCommon); setFieldLabel('inMathLevel','📈 수학 선행/심화'); setSelectOptions('inMathLevel',[['100','고등 미적분/기하 실력 완성'],['85','고등 수학·수1 심화 진행'],['70','고등 공통수학 선행'],['55','중등 심화 위주'],['40','현행 및 후행 보완 필요']], true); setFieldLabel('inSciLevel','📈 과학 선행/심화'); setSelectOptions('inSciLevel',[['100','과탐 I·II 수능 기출 풀이 가능'],['85','과탐 I 심화 및 문제풀이 진행'],['70','고1 통합과학 선행'],['55','중등 과학 심화 위주'],['40','현행 과학 개념 보완 필요']], true); setFieldLabel('inKorLevel','📖 국어 심화·독해 수준'); setSelectOptions('inKorLevel',[['100','고3 수준 고난도 지문 분석'],['85','고1~2 수준 독서·문학 심화'],['70','중등 심화 독해·서술 안정'],['55','중등 내신 중심 독해'],['40','기본 독해·문법 보완']], true); setFieldLabel('inEngLevel','🌐 영어 심화·독해 수준'); setSelectOptions('inEngLevel',[['100','고3 수능 영어 1등급 안정'],['85','고1~2 모의 상위권 수준'],['70','중등 심화 및 예비고1 준비'],['55','중등 내신 중심'],['40','기본 독해·어휘·문법 보완']], true); setFieldLabel('inHisLevel','📈 역사/사회 이해 수준'); setSelectOptions('inHisLevel',[['100','고1 통합사회/한국사 흐름 선행'],['85','중등 역사/사회 흐름 이해 우수'],['70','중등 현행 개념 안정'],['55','핵심 흐름 보완'],['40','기초 개념 보완']], true); } } function renderGradeSelects() { const subjects = [ {id: "kor", name: "국어"}, {id: "eng", name: "영어"}, {id: "mat", name: "수학"}, {id: "sci", name: "과학"}, {id: "soc", name: "사회"}, {id: "his", name: "역사"} ]; const sems = ["21", "22", "31", "32"]; const grade = document.getElementById('inGrade').value; let html = ""; subjects.forEach(subj => { html += `<tr><td style="font-weight:bold; color:var(--primary); background:#f0f4f8;">${subj.name}</td>`; sems.forEach(sem => { html += `<td><select id="g-${subj.id}-${sem}"> <option value="" selected>미이수 / 아직 성적 없음</option> <option value="90">A</option> <option value="70">B</option> <option value="50">C</option> <option value="30">D/E</option> </select></td>`; }); html += `</tr>`; }); document.getElementById('gradeTbody').innerHTML = html; // 학년별 안내: 아직 해당 학기 성적이 없으면 그대로 '미이수' 유지 const guide = document.getElementById('gradeDataGuide'); if(guide){ if(grade === 'elem'){ guide.innerHTML = '초5~6은 학기별 A/B 성취도 분석을 사용하지 않습니다. 아래 <b>현재 교과 기반</b> 입력과 객관자료·선행·심화 자료를 활용합니다.'; }else if(grade === 'mid12'){ guide.innerHTML = '중1~2 학생은 <b>실제로 나온 학기 성적만</b> 입력하세요. 시험 전이라 성적이 전혀 없다면 모두 미이수로 두고 아래 현재 교과 기반을 입력합니다.'; }else{ guide.innerHTML = '중3 학생도 <b>실제로 확정된 학기 성적만</b> 입력하세요. 아직 나오지 않은 3학년 2학기 성적은 미이수로 둡니다.'; } } } window.onload = function() { renderQuestions(); renderGradeSelects(); updateAcademicInputMode(); }; // --- [APEX진단검사6] 프리미엄 오프라인 설문지 인쇄 --- function printStudentQuestionnaire() { const session = document.querySelector('input[name="sessionType"]:checked').value; const grade = document.getElementById('inGrade').value; const gradeText = document.getElementById('inGrade').options[document.getElementById('inGrade').selectedIndex].text; const step0_p1 = session === "1" ? step0_detail_1_part1 : step0_detail_2_part1; const step0_p2 = session === "1" ? step0_detail_1_part2 : step0_detail_2_part2; const printDomains_1 = { elem: { A: ["새로운 것을 배울 때 단순히 외우기보다 '왜 그런지' 이유를 스스로 떠올리며 궁금해하나요?", "어려운 수학 문제나 과학 원리를 풀고 이해해 가는 과정 자체가 재미있고 즐겁게 느껴지나요?", "궁금한 점이 생기면 그냥 넘기지 않고 책, 영상, 검색 등을 통해 끝까지 확인하려고 하나요?", "배운 내용을 글만 읽고 끝내지 않고 그림, 표, 마인드맵 등으로 다시 정리해 보기도 하나요?", "과학 실험이나 관찰 활동을 할 때 내가 본 것과 느낀 점을 직접 기록해 본 경험이 있나요?"], B: ["오늘 학교나 학원에서 배운 중요한 내용을 가족이나 친구에게 짧게 설명할 수 있을 정도로 이해했나요?", "누가 시키지 않아도 오늘 해야 할 숙제나 복습을 스스로 먼저 시작하는 편인가요?", "읽고 싶은 책이나 공부에 도움이 될 책을 부모님이 아닌 내가 직접 골라서 읽어본 적이 있나요?", "공부한 내용 중 내가 제대로 아는 것과 헷갈리며 착각하는 부분을 스스로 구분해 보나요?", "목표를 이루었을 때 스스로 작은 보상을 정해 동기부여를 만드는 습관이 있나요?"], C: ["시험 점수가 기대보다 낮아도 '다음에는 더 잘할 수 있다'고 생각하며 다시 해보려는 마음이 드나요?", "바로 풀리지 않는 문제가 있어도 짜증만 내지 않고 조금 더 차분하게 붙잡고 고민할 수 있나요?", "나보다 공부를 잘하는 친구를 보면 위축되기보다 배울 점을 찾고 싶다는 생각이 드나요?", "계획대로 다 하지 못한 날에도 포기하지 않고 남은 시간에 무엇을 할지 다시 정리하나요?", "발표나 시험처럼 긴장되는 상황에서도 내 실력을 어느 정도 보여줄 수 있다고 믿나요?"], D: ["공부하기로 마음먹은 시간에는 누가 옆에서 말하지 않아도 스스로 책상 앞에 앉을 수 있나요?", "공부할 때 장난감, 스마트폰, 영상 등 집중을 방해하는 것들을 스스로 치우고 시작하나요?", "잠들기 전에 다음 날 학교 준비물이나 가방을 스스로 챙기는 습관이 있나요?", "스마트폰 게임이나 영상 시청 시간을 스스로 정한 약속 안에서 지키려고 노력하나요?", "매일 비슷한 시간에 자고 일어나는 규칙적인 생활 루틴을 유지하고 있나요?"] }, mid12: { A: ["교과서에 나온 공식이나 개념을 그냥 외우기보다 '왜 이런 식이 되는지' 스스로 유도하거나 따져 본 적이 있나요?", "공부하다가 개념 설명이 매끄럽지 않거나 이해가 덜 되면 다른 자료를 찾아 논리의 빈틈을 메워 보나요?", "수학이나 과학에서 배운 내용을 실생활 문제나 뉴스, 사회 현상과 연결해서 생각해 보는 편인가요?", "자유학기 활동이나 수행평가를 할 때 주제를 정하고 자료를 모아 직접 탐구 보고서를 써본 경험이 있나요?", "어려운 내용을 머리로만 넘기지 않고 손으로 써가며 구조를 정리하고 이해하려고 하나요?", "복습하다가 단순 암기에서 끝나지 않고 '그렇다면 왜 이런가?' 같은 새로운 질문이 떠오르기도 하나요?"], B: ["책이나 노트를 덮은 뒤에도 오늘 배운 핵심 내용을 백지에 스스로 구조화해서 정리할 수 있나요?", "나만의 오답 정리 방식이나 학습 플래너를 만들어 꾸준히 기록하고 점검하는 편인가요?", "부모님이나 학원의 지시 없이도 다음 주에 무엇을 공부할지 스스로 정하고 실행해 보나요?", "같은 공부 시간을 더 효율적으로 쓰기 위해 나만의 방법이나 도구를 직접 바꿔 본 적이 있나요?", "배운 단원이 시험이나 모의고사에서 어떻게 응용될지 미리 예상해 보면서 공부하나요?", "1년 뒤 이루고 싶은 학업 목표를 떠올리고, 그것을 위해 필요한 계획을 비교적 구체적으로 세워 보았나요?"], C: ["나보다 공부를 더 잘하는 친구를 볼 때 질투만 하기보다 나도 배워서 성장할 수 있다고 생각하나요?", "계획대로 잘 안 되는 날에도 스트레스에만 머무르지 않고 현실적인 대안을 다시 세우는 편인가요?", "경쟁이 있는 환경을 무조건 부담스럽게만 느끼기보다 나를 성장시키는 자극으로 받아들일 수 있나요?", "성적이 일시적으로 떨어져도 감정적으로 무너지기보다 다음에 무엇을 보완할지 차분히 생각하나요?", "실수할까 봐 새로운 시도를 피하기보다, 도전하면서 배우는 것이 중요하다고 느끼나요?", "지치기 전에 스스로 컨디션을 조절하고 쉬는 시간을 배분하는 등 에너지 관리를 해본 적이 있나요?"], D: ["공부할 때 스마트폰이 방해된다고 느끼면 아예 손이 닿지 않는 곳으로 치우는 등 물리적으로 통제하나요?", "책상에 오래 앉아 있는 시간과 실제로 집중해서 공부한 시간을 구분해 보려는 편인가요?", "늦게까지 SNS나 영상에 빠지지 않고 수면 시간을 일정하게 지키기 위해 노력하나요?", "환경이나 주변 분위기를 탓하기보다 책상 정리나 장소 조정처럼 내가 바꿀 수 있는 부분부터 손보나요?", "지루하고 반복적인 기본기 훈련도 결국 실력을 만든다고 생각하며 끝까지 해내려고 하나요?", "친구들의 분위기에 쉽게 휩쓸리지 않고 나에게 필요한 학습 속도와 페이스를 지키는 편인가요?"] }, mid3: { A: ["목표 학교가 중요하게 보는 독서·융합·탐구 역량에 맞는 활동 사례가 학교생활기록부에 어느 정도 정리되어 있나요?", "지적 호기심이 생겼을 때 교과서 수준에서 멈추지 않고 논문이나 전문 서적까지 찾아 읽어본 경험이 있나요?", "융합 탐구 활동을 할 때 주제 설정부터 자료 수집, 가설 검증, 결론 정리까지 내가 주도한 편인가요?", "수학 비중이 높은 학교나 전형을 준비할 때 버틸 수 있을 만큼 심화 수학 학습이 되어 있다고 느끼나요?", "사회 문제나 글로벌 이슈를 접했을 때 단순히 사실을 아는 데서 그치지 않고 내 관점으로 비판적으로 생각하나요?", "내가 한 탐구 활동이 추상적인 표현이 아니라 구체적인 사실과 결과 중심으로 기록되어 있나요?"], B: ["자기소개서나 면접에서 활용할 수 있을 만큼 나만의 강점이 드러나는 '킬러 콘텐츠'가 3가지 이상 있나요?", "면접에서 예상하지 못한 압박 질문을 받더라도 근거를 들어 차분하고 논리적으로 답변할 수 있나요?", "지원 동기와 앞으로의 학업 계획을 목표 학교의 교육 방향과 연결해서 설명할 수 있나요?", "평소에도 결론부터 말하고 근거를 덧붙이는 식으로 말하는 습관이 어느 정도 자리 잡았나요?", "내 공부 방식이 특목고나 자사고의 높은 학업 강도에서도 통할 것이라는 객관적 근거가 있나요?", "협력, 갈등 해결, 배려 같은 인성 영역에서 실제로 보여줄 수 있는 구체적 사례가 있나요?"], C: ["입학 후 첫 시험에서 기대보다 낮은 등급을 받아도 다시 회복해 낼 수 있을 만큼 멘탈이 단단한 편인가요?", "경쟁 상대를 무조건 이겨야 할 적으로 보기보다 함께 자극을 주고받는 성장 파트너로 볼 수 있나요?", "치열한 경쟁 환경에서 오는 긴장감을 피하고 싶은 부담보다 성장의 자극으로 받아들일 수 있나요?", "한 문제에 지나치게 매달려 전체 시험 흐름을 무너뜨리기보다 시간과 집중을 조절할 수 있나요?", "실패나 성적 하락의 원인을 외부 탓보다 내 전략의 수정 포인트로 바라보는 편인가요?", "지금의 공부 강도와 생활 리듬이 입시가 끝날 때까지 무너지지 않고 지속 가능하다고 느끼나요?"], D: ["자율학교나 기숙형 학교의 엄격한 생활 규칙을 3년 동안 스스로 지킬 각오와 준비가 되어 있나요?", "외부에서 강하게 관리해 주지 않아도 매일 5시간 이상의 순수 공부 시간을 스스로 확보할 수 있나요?", "단체생활 속 규칙 준수와 자기 절제가 필요한 환경에서도 생활 리듬을 무너지지 않게 지킬 수 있나요?", "매일 실제 공부한 시간을 대충이 아니라 구체적으로 기록하고 관리하는 습관이 있나요?", "장소가 바뀌거나 주변에 소음이 있어도 비교적 빠르게 몰입 모드로 전환할 수 있나요?", "원점수 1점을 더 만들기 위해 실수 하나까지 집요하게 점검하는 학습 근성이 형성되어 있나요?"] } }; const activeDomainSet = session === "1" ? printDomains_1 : domains_2; const mainQs = activeDomainSet[grade]; const gradeMeta = { elem: { page1Title: 'Step 1. The Seed (1/2)', page1Sub: '[초등 5~6학년] 지적 호기심과 기초 습관 진단', page2Title: 'Step 1. The Seed (2/2)', page2Sub: '[초등 5~6학년] 지적 호기심과 기초 습관 진단', split: 10 }, mid12: { page1Title: 'Step 2. The Route (1/2)', page1Sub: '[중등 1~2학년] 자기주도학습 체계화 및 계열성 진단', page2Title: 'Step 2. The Route (2/2)', page2Sub: '[중등 1~2학년] 자기주도학습 체계화 및 계열성 진단', split: 12 }, mid3: { page1Title: 'Step 3. The Final (1/2)', page1Sub: '[중등 3학년] 지원 학교 DNA 합치도 및 실전 입시 진단', page2Title: 'Step 3. The Final (2/2)', page2Sub: '[중등 3학년] 지원 학교 DNA 합치도 및 실전 입시 진단', split: 12 } }; const meta = gradeMeta[grade]; const surveyQs = [...mainQs.A, ...mainQs.B, ...mainQs.C, ...mainQs.D]; const renderScoreQuestions = (qs, start, end) => { let h = ''; qs.slice(start, end).forEach((q, i) => { h += `<div class='q-item'><span class='q-text'>${start + i + 1}. ${q}</span><div class='score-row'>`; for (let s = 1; s <= 10; s++) h += `<div class='score-box'>${s}</div>`; h += `</div></div>`; }); return h; }; const box = (txt) => `<span class="print-check">□</span> ${txt}`; const rowChoices = (items) => `<div class="choice-wrap">${items.map(x=>`<span>${box(x)}</span>`).join('')}</div>`; const pressurePrint = pressureQuestions.map((q,i)=>{ let cells=''; for(let s=1;s<=10;s++) cells += `<span class="mini-score">${s}</span>`; return `<div class="compact-q"><span>${i+1}. ${q.text}</span><span class="mini-score-row">${cells}</span></div>`; }).join(''); const baseChoices = ['매우 안정','안정','기본 확보','일부 보완 필요','관찰 자료 없음']; const objectiveChoices = ['상위 1%','상위 4%','상위 11%','상위 23%','그 이하','미응시/자료 없음']; const elemExpansion = { '국어':['상위학년 장문·비문학 분석','학년 수준 장문 독해·요약 안정','현 학년 독해·서술 안정','독해·서술 확장 중','기초 독해·표현 보완','자료 없음'], '수학':['상위학년·고난도 개념 적용','현 학년 최상위 심화 안정','현 학년 개념·응용 안정','심화 시작 단계','핵심 개념 보완','자료 없음'], '영어':['상위학년 원문 독해·설명','학년 이상 독해·어휘 안정','현 학년 독해·문법 안정','독해·어휘 확장 중','기초 어휘·문장 보완','자료 없음'], '과학':['교과 밖 질문·실험·설명','심화 탐구 꾸준히 수행','현 학년 개념·관찰 안정','탐구 경험 확장 중','기초 개념·설명 보완','자료 없음'] }; const midExpansion = { '국어':['고1 수준 장문·비문학 분석','중등 고난도·예비고 확장','중등 현행 독해·서술 안정','심화 중','기초 독해·서술 보완','자료 없음'], '수학':['고등 공통수학 이상+중등 최상위 안정','고등 선행/중등 최상위 심화','중등 현행 심화·응용 안정','심화 시작','현행 핵심 개념 보완','자료 없음'], '영어':['고1 수준 독해·구문 안정','중등 고난도·예비고 확장','중등 현행 독해·문법 안정','심화 중','기초 어휘·문법 보완','자료 없음'], '과학':['통합과학 이상+중등 심화 안정','통합과학 선행/중등 최상위 심화','중등 현행 개념·심화 안정','심화 탐구 시작','현행 핵심 개념 보완','자료 없음'] }; const renderFoundationRows = (expansionMap, titleText) => { const subjects=['국어','수학','영어','과학']; return ` <h3>${titleText}</h3> <table class="print-table"> <thead><tr><th style="width:12%">과목</th><th style="width:29%">현재 교과 기반</th><th style="width:27%">객관 문제해결 자료</th><th>심화·확장 / 선행·심화</th></tr></thead> <tbody> ${subjects.map(s=>`<tr> <td><b>${s}</b></td> <td>${rowChoices(baseChoices)}</td> <td>${rowChoices(objectiveChoices)}</td> <td>${rowChoices(expansionMap[s])}</td> </tr>`).join('')} </tbody> </table>`; }; const renderGradeAchievementTable = () => ` <h3>학교 교과 성취도 — 실제 나온 성적만 기록</h3> <div class="small-note">아직 시험을 보지 않았거나 성적이 나오지 않은 학기는 비워 둡니다. 없는 성적을 추정하지 않습니다.</div> <table class="print-table achievement-table"> <thead><tr><th>과목</th><th>2-1</th><th>2-2</th><th>3-1</th><th>3-2</th></tr></thead> <tbody> ${['국어','영어','수학','과학','사회','역사'].map(s=>`<tr><td><b>${s}</b></td>${[1,2,3,4].map(()=>`<td>□ A □ B □ C □ D/E □ 없음</td>`).join('')}</tr>`).join('')} </tbody> </table>`; const academicPrintPage = grade==='elem' ? ` <div class="page"> <div class="header"><h1>초5~6 학업 성장탐색 기록지</h1><p>성적보다 현재 기반 · 실제 문제해결 · 심화·확장 경험을 기록합니다.</p></div> <div class="q-list"> ${renderFoundationRows(elemExpansion,'현재 학업 기반 · 문제해결 · 심화·확장')} <div class="info-box compact-info"> <b>중요</b> · 초5~6은 선행을 많이 했는지 자체를 높은 점수로 보지 않습니다. 현재 학년 내용을 안정적으로 이해하는지, 실제 문제를 해결하는지, 스스로 질문과 탐구를 확장하는지를 함께 봅니다. </div> <h3>진학 환경 탐색에 필요한 추가 경험</h3> ${rowChoices(['수학·과학 고난도 문제/탐구','독서·비문학·글쓰기','토론·발표·사회/시사','장기 프로젝트·제작','경시·영재원·기관 진단','아직 없음'])} </div> <div class="footer">APEX | 초등 성장탐색 자료</div> </div>` : grade==='mid12' ? ` <div class="page academic-mid-page"> <div class="header"><h1>중1~2 학업자료 기록지 (1/2)</h1><p>시험 전 · 성적 미확정 시 현재 학업 기반을 기록합니다.</p></div> <div class="q-list"> <div class="info-box compact-info"><b>현재 상태</b> □ 학교 시험 전 / 성적 없음 □ 실제 학교 성적 있음</div> ${renderFoundationRows(midExpansion,'현재 교과 기반 · 객관평가 · 선행·심화')} <div class="info-box compact-info" style="margin-top:12px;"> <b>작성 원칙</b> · 학교 시험 전이라면 성적을 예상해서 적지 않습니다. 현재 교과 기반과 실제로 확인된 객관자료·선행·심화 수준만 체크합니다. </div> </div> <div class="footer">APEX | 중1·2 학업자료 1/2</div> </div> <div class="page academic-mid-page"> <div class="header"><h1>중1~2 학업자료 기록지 (2/2)</h1><p>실제 학교 성적이 나온 경우에만 기록합니다.</p></div> <div class="q-list"> ${renderGradeAchievementTable()} <div class="info-box compact-info" style="margin-top:12px;"> <b>중요</b> · 아직 나오지 않은 학기 성적은 비워 둡니다. 실제 학교 성적이 입력되면 APEX는 초기 학업탐색형에서 성장진단형으로 전환됩니다. </div> <h3>추가 메모</h3> <div class="write-line"></div> <div class="write-line"></div> </div> <div class="footer">APEX | 중1·2 학업자료 2/2</div> </div>` : ` <div class="page"> <div class="header"><h1>중3 진학준비 학업자료 기록지</h1><p>실제 교과 성취와 객관평가 · 선행·심화를 기록합니다.</p></div> <div class="q-list"> ${renderGradeAchievementTable()} <h3>객관평가 · 선행·심화 자료</h3> <div class="small-note">국어·수학·영어·과학의 전국 수준/모의평가와 현재 선행·심화 수준을 실제 자료 기준으로 체크합니다.</div> ${rowChoices(['전국 상위 1%','상위 4%','상위 11%','상위 23%','그 이하','미응시/자료 없음'])} <div style="height:12px"></div> <div class="write-line"></div><div class="write-line"></div><div class="write-line"></div> </div> <div class="footer">APEX | 중3 진학준비 자료</div> </div>`; const experiencePrintPage = ` <div class="page"> <div class="header"><h1>학생 경험 · 강점 · 관심 기록</h1><p>성적 밖에서 반복해서 드러나는 학생의 경험을 적습니다.</p></div> <div class="q-list"> <h3>학생 개인 경험</h3> <div class="write-block"><b>1. 내가 잘한다고 느끼는 것 / 특기</b><div class="write-line"></div><div class="write-line"></div></div> <div class="write-block"><b>2. 시간 가는 줄 모르고 하는 취미·몰입 활동</b><div class="write-line"></div><div class="write-line"></div></div> <div class="write-block"><b>3. 1년 이상 오래 해온 활동·경험</b><div class="write-line"></div><div class="write-line"></div></div> <div class="write-block"><b>4. 친구·가족·선생님이 자주 잘한다고 말하는 것</b><div class="write-line"></div><div class="write-line"></div></div> <h3>최근 관심 분야</h3> <div class="write-line"></div><div class="write-line"></div> <h3>현재 진학·진로 생각</h3> ${rowChoices(['과학·영재 탐구','자사고·고강도 학업','외국어·국제 탐구','균형 성장','아직 잘 모르겠음'])} <div class="small-note" style="margin-top:12px;">※ 이 선택 자체로 진학 방향을 결정하지 않습니다. APEX는 실제 학업 기반·경험·성장 패턴과 함께 해석합니다.</div> </div> <div class="footer">APEX | 학생 경험 기록</div> </div>`; let html = ` <html><head><title>APEX 프리미엄 학생용 설문지</title> <style> @import url('https://fonts.googleapis.com/css2?family=Pretendard:wght@400;700;900&display=swap'); :root { --primary: #0047ab; --secondary: #f4f7f9; } @page { size: A4; margin: 0; } * { box-sizing: border-box; -webkit-print-color-adjust: exact; print-color-adjust: exact; } body { font-family: 'Pretendard', sans-serif; background: #eee; margin: 0; padding: 0; color: #333; line-height: 1.4; } .doc-container { width: 210mm; margin: 0 auto; } .page { width: 210mm; height: 296.5mm; padding: 25mm 22mm; background: white; position: relative; page-break-after: always; overflow: hidden; display: flex; flex-direction: column; } .header { text-align: center; border-bottom: 4px solid var(--primary); padding-bottom: 15px; margin-bottom: 25px; } .header h1 { font-size: 2.1em; color: var(--primary); margin: 0; font-weight: 900; } .student-info-bar { display: grid; grid-template-columns: repeat(4, 1fr); gap: 10px; margin-top: 15px; padding: 15px; border: 2px solid #eee; border-radius: 8px; font-weight: bold; font-size: 0.85em; } h3 { border-left: 10px solid var(--primary); padding-left: 15px; color: var(--primary); margin: 25px 0 15px; font-size: 1.25em; } .info-box { background: #f8f9fa; padding: 18px 22px; border-radius: 10px; border: 1px solid #eee; font-size: 0.95em; margin-bottom: 20px; line-height: 1.7; } .q-list { flex: 1; } .q-item { padding: 10px 0; border-bottom: 1px solid #f2f2f2; display: flex; justify-content: space-between; align-items: center; min-height: 40px; } .q-text { font-size: 0.92em; color: #1a1a1a; flex: 1; padding-right: 15px; word-break: keep-all; } .write-line { border-bottom: 1px dashed #bbb; height: 32px; margin-top: 5px; width: 100%; margin-bottom: 10px; } .choice-row { display: flex; gap: 15px; margin-top: 10px; font-size: 0.9em; } .circle { width: 14px; height: 14px; border: 1.5px solid #666; border-radius: 50%; display: inline-block; margin-right: 6px; vertical-align: middle; } .score-row { display: flex; gap: 3px; } .score-box { width: 24px; height: 24px; border: 1px solid #ccc; text-align: center; line-height: 22px; border-radius: 3px; font-size: 0.75em; color: #777; } .print-check { font-weight:900; color:#555; margin-right:2px; } .choice-wrap { display:flex; flex-wrap:wrap; gap:5px 10px; line-height:1.45; font-size:0.78em; } .print-table { width:100%; border-collapse:collapse; margin-top:8px; table-layout:fixed; } .print-table th,.print-table td { border:1px solid #d7dce2; padding:6px 7px; vertical-align:top; font-size:0.72em; line-height:1.35; } .print-table th { background:#f3f6fa; color:#234f9b; font-weight:900; text-align:center; } .achievement-table td { text-align:center; font-size:0.68em; padding:7px 4px; } .compact-q { display:flex; justify-content:space-between; gap:10px; align-items:center; padding:7px 0; border-bottom:1px solid #eee; font-size:0.82em; } .compact-q > span:first-child { flex:1; } .mini-score-row { display:flex; gap:2px; white-space:nowrap; } .mini-score { display:inline-block; width:20px; height:20px; line-height:18px; border:1px solid #bbb; border-radius:2px; text-align:center; font-size:0.72em; color:#666; } .compact-info { padding:10px 13px; margin-top:10px; margin-bottom:10px; font-size:0.82em; } .small-note { font-size:0.75em; color:#666; line-height:1.45; margin:6px 0 10px; } .academic-mid-page { padding-top:18mm; padding-bottom:18mm; } .academic-mid-page .header { margin-bottom:14px; padding-bottom:10px; } .academic-mid-page .header h1 { font-size:1.75em; } .academic-mid-page h3 { margin:14px 0 9px; font-size:1.05em; } .academic-mid-page .print-table th, .academic-mid-page .print-table td { padding:5px 5px; font-size:0.68em; line-height:1.28; } .academic-mid-page .compact-info { padding:8px 10px; margin-bottom:8px; } .write-block { margin-bottom:18px; font-size:0.9em; } .guide-table { width: 100%; border-collapse: collapse; margin-top: 15px; } .guide-table th, .guide-table td { border: 1px solid #ddd; padding: 12px 10px; font-size: 0.85em; text-align: center; } .guide-table th { background: var(--secondary); color: var(--primary); } .domain-box { border: 1px solid #eee; border-left: 6px solid var(--primary); padding: 15px 20px; margin-bottom: 15px; border-radius: 6px; font-size: 0.95em; line-height: 1.6; } .domain-title { font-weight: 900; color: var(--primary); display: block; margin-bottom: 6px; font-size: 1.05em; } .footer { position: absolute; bottom: 15mm; left: 0; width: 100%; text-align: center; font-size: 0.8em; color: #bbb; font-weight: bold; } @media print { body { background: white; } } </style> </head><body><div class="doc-container">`; html += ` <div class="page"> <div class="header"> <h1>APEX 학업역량 정밀진단</h1> <p style="font-weight: bold; color: #666; margin-top: 8px; font-size: 1.1em;">학생 성장 방식 · 학업 기반 · 회복 · 진학 방향 (${session}차 검사)</p> </div> <div class="q-list"> <h3>🔍 APEX 학업역량 정밀진단 개요</h3> <div class="info-box"> APEX는 단순히 현재 성적만 보는 검사가 아닙니다. 탐구·자기주도·정서·학습습관의 4대 영역과 회복·학습복귀, 실제 학업자료를 함께 살펴 <b>학생이 어떻게 배우고, 실행하고, 흔들린 뒤 다시 움직이는지</b>를 확인합니다.<br><br> 초5~6은 성적 경쟁보다 <b>학업 성장 기반과 진학 환경 탐색</b>을, 중1~2는 <b>시험 전 초기 학업 기반과 실제 성적 이후의 성장 흐름</b>을, 중3은 <b>구체적인 진학 준비도</b>를 중심으로 봅니다. </div> <h3>📝 검사 실시 안내</h3> <ul style="font-size: 1em; line-height: 2.2; color: #444; padding-left: 25px;"> <li>기초 정보(Step 0)는 리포트 분석의 배경 데이터가 되므로 상세히 적어주세요.</li> <li>역량 진단(Step 1~3)은 전혀 아님(1점)부터 매우 그러함(10점)까지 체크합니다.</li> <li>정답은 없으며, 본인의 평소 습관과 모습에 가장 가까운 점수를 선택하세요.</li> <li>검사 시간은 <b>약 15분</b> 내외이며, 조용한 환경에서 솔직하게 답변해 주세요.</li> </ul> <div class="student-info-bar" style="margin-top: 120px;"> <div>검사 일시: ________</div> <div>학교명: ________</div> <div>학년/반: ________</div> <div>성 명: ________</div> </div> </div> <div class="footer">Apex Academic Intelligence System</div> </div>`; html += `<div class="page"><div class="header"><h1>Step 0. 기초 정보 및 진로 목표 (1/2)</h1></div><div class="q-list">`; step0_p1.forEach((q, i) => { if (session === "1" && i < 4) { html += `<div class="q-item" style="display:block; border:none; ${i===0 ? 'padding-top:0;' : ''}"><span class="q-text"><b>${q}</b></span><div class="write-line"></div><div class="write-line"></div></div>`; } else if (session === "2" && i < 5) { html += `<div class="q-item" style="display:block; border:none; ${i===0 ? 'padding-top:0;' : ''}"><span class="q-text"><b>${q}</b></span><div class="write-line"></div><div class="write-line"></div></div>`; } else if (session === "1" && i === 4) { html += `<div class="q-item" style="display:block; border:none;"><span class="q-text"><b>${q}</b></span><div class="choice-row"><span><div class="circle"></div> 1. 마스터형</span><span><div class="circle"></div> 2. 완벽주의형</span><span><div class="circle"></div> 3. 팔로워형</span><span><div class="circle"></div> 4. 지능의존형</span></div></div>`; } else if (session === "1" && i === 5) { html += `<div class="q-item" style="display:block; border:none; margin-bottom:10px;"><span class="q-text"><b>${q}</b></span><div style="margin-top:8px; font-weight:bold; color:#444;">사교육 ( )시간 / 순공 ( )시간 / 성적 ( )</div></div>`; } else if (session === "2" && i === 5) { html += `<div class="q-item" style="display:block; border:none; margin-bottom:10px;"><span class="q-text"><b>${q}</b></span><div style="margin-top:8px; font-weight:bold; color:#444;">( )시간 증가 / 감소</div></div>`; } else { html += `<div class="q-item"><span class="q-text">${q}</span><div class="choice-row" style="margin-top:0;"><span><div class="circle"></div> O</span><span><div class="circle"></div> X</span></div></div>`; } }); html += `</div><div class="footer">Apex Academic Intelligence System</div></div>`; html += `<div class="page"><div class="header"><h1>Step 0. 기초 정보 및 진로 목표 (2/2)</h1></div><div class="q-list">`; step0_p2.forEach((q) => { html += `<div class="q-item"><span class="q-text">${q}</span><div class="choice-row" style="margin-top:0;"><span><div class="circle"></div> O</span><span><div class="circle"></div> X</span></div></div>`; }); html += `</div><div class="footer">Apex Academic Intelligence System</div></div>`; html += ` <div class="page"> <div class="header"><h1>${meta.page1Title}</h1><p>${meta.page1Sub}</p></div> <div class="q-list">${renderScoreQuestions(surveyQs, 0, meta.split)}</div> <div class="footer">Apex Academic Intelligence System</div> </div>`; html += ` <div class="page"> <div class="header"><h1>${meta.page2Title}</h1><p>${meta.page2Sub}</p></div> <div class="q-list">${renderScoreQuestions(surveyQs, meta.split, surveyQs.length)}</div> <div class="footer">Apex Academic Intelligence System</div> </div>`; html += ` <div class="page"> <div class="header"><h1>회복탄력성 · 학습복귀 점검</h1><p>기대 부담 · 도움 요청 · 스트레스 해소 · 다시 시작하는 힘</p></div> <div class="q-list"> <div class="small-note">각 문항을 읽고 평소 모습에 가까운 정도를 1~10점으로 체크하세요. 1은 전혀 그렇지 않음, 10은 매우 그러함입니다.</div> ${pressurePrint} </div> <div class="footer">APEX | 회복·학습복귀 12문항</div> </div>`; html += academicPrintPage; html += experiencePrintPage; html += ` <div class="page"> <div class="header"><h1>APEX 4대 핵심 역량 안내</h1></div> <div class="q-list"> <h3>📊 4대 핵심 역량의 의미</h3> <div class="domain-box"><span class="domain-title">🔹 탐구: 질문하고 깊게 이해하는 힘</span>배운 내용을 외우는 데서 멈추지 않고 이유를 묻고, 자료를 찾고, 자신의 질문으로 확장하는 힘입니다.</div> <div class="domain-box"><span class="domain-title">🔹 자기주도: 스스로 계획하고 점검하는 힘</span>자신이 아는 것과 모르는 것을 구분하고, 필요한 공부를 정하고, 계획과 방법을 스스로 조정하는 힘입니다.</div> <div class="domain-box"><span class="domain-title">🔹 정서·회복: 흔들린 뒤 다시 돌아오는 힘</span>실수·실패·긴장 상황에서 감정에만 머무르지 않고 원인을 살피고 다시 학습 흐름으로 돌아오는 힘입니다.</div> <div class="domain-box"><span class="domain-title">🔹 학습습관: 꾸준히 실행할 수 있는 구조</span>집중을 방해하는 환경을 조절하고, 수면·시간·과제·복습을 반복 가능한 생활 구조로 만드는 힘입니다.</div> </div> <div class="footer">Apex Academic Intelligence System | 무단 전재 및 복제를 금합니다.</div> </div>`; html += `</div></body></html>`; const printWin = window.open('', '_blank'); printWin.document.write(html); printWin.document.close(); printWin.focus(); setTimeout(() => { printWin.print(); }, 800); } function renderApexRadar(values){ const host=document.getElementById('radarChartSvg'); if(!host) return; const vals=(values||[]).map(v=>Math.max(0,Math.min(100,Number(v)||0))); const labels=['탐구','자기주도','정서','학습습관']; const cx=160, cy=155, maxR=105; const dirs=[ [0,-1],[1,0],[0,1],[-1,0] ]; const pt=(r,i)=>[cx+dirs[i][0]*r,cy+dirs[i][1]*r]; const grid=[25,50,75,100].map(level=>{ const p=dirs.map((_,i)=>pt(maxR*level/100,i).join(',')).join(' '); return `<polygon points="${p}" fill="none" stroke="${level===100?'#b8c4d6':'#dfe6ef'}" stroke-width="${level===100?1.5:1}"/>`; }).join(''); const axes=dirs.map((_,i)=>{ const p=pt(maxR,i); return `<line x1="${cx}" y1="${cy}" x2="${p[0]}" y2="${p[1]}" stroke="#d7dee9" stroke-width="1"/>`; }).join(''); const dataPts=vals.map((v,i)=>pt(maxR*v/100,i)); const poly=dataPts.map(p=>p.join(',')).join(' '); const dots=dataPts.map((p,i)=>`<circle cx="${p[0]}" cy="${p[1]}" r="5" fill="#b8860b"/><text x="${p[0]+(i===1?10:i===3?-10:0)}" y="${p[1]+(i===0?-10:i===2?18:4)}" text-anchor="${i===1?'start':i===3?'end':'middle'}" font-size="12" font-weight="800" fill="#1A237E">${Math.round(vals[i])}</text>`).join(''); const labelPos=[ [cx,24,'middle'],[294,cy+5,'start'],[cx,302,'middle'],[26,cy+5,'end'] ]; const labelSvg=labels.map((lab,i)=>`<text x="${labelPos[i][0]}" y="${labelPos[i][1]}" text-anchor="${labelPos[i][2]}" font-size="13" font-weight="800" fill="#1A237E">${lab}</text>`).join(''); host.innerHTML=`<svg viewBox="0 0 320 320" width="100%" height="100%" role="img" aria-label="APEX 4대 학업역량 그래프"> ${grid}${axes} <polygon points="${poly}" fill="rgba(26,35,126,0.16)" stroke="#1A237E" stroke-width="3"/> ${dots}${labelSvg} </svg>`; } function apexLevelFromRaw(totalRaw){ if(totalRaw>=211) return '강점 뚜렷'; if(totalRaw>=191) return '안정 성장'; if(totalRaw>=171) return '성장 중'; return '기초 구조 보완'; } function threeAxisOutlook(dna100, readiness, persistence){ if(readiness>=80 && persistence<65) return { title:'현재 성과 유지 관리형', text:'현재 학업 준비도는 높지만 경쟁 강도가 커질 때 회복·복귀 관리가 중요합니다.' }; if(dna100>=75 && persistence>=75 && readiness<75) return { title:'상승 여력형', text:'현재 준비도보다 성장 DNA와 학업 지속력이 강해 이후 상승 가능성을 기대할 수 있습니다.' }; if(dna100>=75 && readiness>=75 && persistence>=75) return { title:'안정 성장형', text:'현재 준비도와 성장 방식, 학업 지속력이 비교적 고르게 갖춰져 있습니다.' }; if(readiness<65 && persistence>=75) return { title:'기초 보강 후 상승형', text:'현재 성적·선행은 보완이 필요하지만 학업 지속력이 있어 기초가 채워지면 상승 가능성이 있습니다.' }; if(persistence<65) return { title:'적응 관리형', text:'현재 수준과 별개로 경쟁이 높아질수록 학습 흐름·회복·도움 요청을 미리 관리하는 것이 중요합니다.' }; return { title:'점진 성장형', text:'한 영역만 보기보다 현재 준비와 성장 패턴을 함께 관리하면 안정적인 향상을 기대할 수 있습니다.' }; } function schoolGrowthOutlook(dna100, persistence, schoolDiff){ if(persistence>=80 && dna100>=75 && schoolDiff>=-3) return '안정 성장 가능'; if(persistence>=72 && dna100>=72) return '적응 후 성장 기대'; if(schoolDiff>=2 && persistence<70) return '초기 적응 관리 필요'; if(persistence<65) return '회복·복귀 관리 필요'; return '학습 구조 보완 후 성장 기대'; } function schoolCheckPoint(gradeScore, mockScore, advanceScore, apexScore, persistence){ const items = [ ['교과 성취', gradeScore], ['문제 해결 수준', mockScore], ['선행·심화', advanceScore], ['학습 방식', apexScore], ['회복·복귀', persistence] ].filter(x=>Number.isFinite(x[1])); items.sort((a,b)=>a[1]-b[1]); return items.slice(0,2).map(x=>x[0]).join(' · ') || '추가 자료 확인'; } function setTodayIfEmpty(){ const dateInput = document.getElementById('inDate'); if(!dateInput) return; if(!dateInput.value){ const now = new Date(); const local = new Date(now.getTime() - now.getTimezoneOffset()*60000).toISOString().slice(0,10); dateInput.value = local; } } function getDnaStage(totalRaw){ const stages=[ {min:231,max:240,label:'최상위 균형형',code:'M'}, {min:221,max:230,label:'심화 탐구형',code:'A+'}, {min:211,max:220,label:'자기주도 안정형',code:'A'}, {min:201,max:210,label:'안정 성장형',code:'B+'}, {min:191,max:200,label:'기본기 확보형',code:'B'}, {min:181,max:190,label:'성장 변동형',code:'C+'}, {min:171,max:180,label:'실행 보완형',code:'C'}, {min:0,max:170,label:'기초 구조 보완형',code:'D'} ]; return stages.find(s=>totalRaw>=s.min&&totalRaw<=s.max)||stages[stages.length-1]; } function gradeLabel(v){ if(!Number.isFinite(v)) return '자료 없음'; if(v>=85) return 'A'; if(v>=65) return 'B'; if(v>=45) return 'C'; return 'D/E'; } function subjectAchievementProfile(values){ const actual=(values||[]).filter(Number.isFinite); if(!actual.length) return {label:'자료 없음', detail:'', trend:'', title:'자료 없음'}; const letters=actual.map(achievementLetter); const c=countLetters(actual); const ratioA=c.total ? c.A/c.total : 0; const ratioB=c.total ? c.B/c.total : 0; let label='성취 혼합'; if(c.A===c.total) label='A 안정'; else if(ratioA>=0.7) label='A 안정'; else if(c.A>c.B && c.A>=c.C+c['D/E']) label='A 우세'; else if(c.A===c.B && c.A>0) label='A/B 혼합'; else if(c.B>c.A && c.B>=c.C+c['D/E']) label='B 우세'; else if((c.C+c['D/E'])>0 && (c.C+c['D/E'])>=Math.max(c.A,c.B)) label='과목 성취 보완'; let trend='추이 판단 자료 부족'; if(letters.length>=2){ const first=actual[0], last=actual[actual.length-1]; const diff=last-first; if(diff>=15) trend='최근 상승'; else if(diff<=-15) trend='최근 하락'; else trend='대체로 유지'; } const detail=letters.join(' → '); return {label,detail,trend,title:`${label}${detail?` · ${detail}`:''}`}; } function scoreLabel(v){ if(!Number.isFinite(v)) return '자료 없음'; if(v>=90) return '최상위'; if(v>=80) return '상위'; if(v>=65) return '중상'; if(v>=50) return '기초'; return '보완'; } function subjectReadiness(gradeV,mockV,advanceV){ const pairs = [[gradeV,0.45],[mockV,0.25],[advanceV,0.30]]; let s=0,w=0; pairs.forEach(([v,wt])=>{ if(Number.isFinite(v)){ s+=v*wt; w+=wt; }}); return w ? s/w : null; } function achievementLetter(v){ if(!Number.isFinite(v)) return null; if(v>=90) return 'A'; if(v>=70) return 'B'; if(v>=50) return 'C'; return 'D/E'; } function countLetters(values){ const c={A:0,B:0,C:0,'D/E':0,total:0}; values.forEach(v=>{ const l=achievementLetter(v); if(l){ c[l]++; c.total++; } }); return c; } function pct(n,d){ return d ? (n/d*100) : null; } function renderAchievementStability(gradeMatrix){ const box=document.getElementById('achievementStabilitySummary'); if(!box) return; const gradeNow=document.getElementById('inGrade')?.value; const anyGrade=(gradeMatrix?Object.values(gradeMatrix).flat().some(Number.isFinite):false); if(gradeNow==='elem'){ box.innerHTML=`<div style="background:#f7fbf8;border:1px solid #cfe6d5;border-radius:10px;padding:10px 12px;"> <b style="color:#216e39;">🌱 초등 성장탐색형</b> <div style="font-size:0.76em;color:#59685d;line-height:1.5;margin-top:4px;">초5~6에서는 A·B 개수나 교과 성취 안정도를 사용하지 않습니다. 현재 교과 기반, 객관 문제해결 자료, 선행·심화, 성장 DNA를 중심으로 봅니다.</div> </div>`; return; } if(!anyGrade){ box.innerHTML=`<div style="background:#f8fbff;border:1px solid #d7e3f4;border-radius:10px;padding:10px 12px;"> <b style="color:#315b8a;">📘 학교 성적 미확정</b> <div style="font-size:0.76em;color:#5d6873;line-height:1.5;margin-top:4px;">아직 실제 A/B 성취도가 없어 교과 성취 안정도는 표시하지 않습니다. 학교 성적이 확보되면 A·B 개수와 학기별 변화 분석이 자동 활성화됩니다.</div> </div>`; return; } const subjects=['kor','eng','mat','sci','soc','his']; const labels={kor:'국어',eng:'영어',mat:'수학',sci:'과학',soc:'사회',his:'역사'}; const year2Vals=[], year3Vals=[], allVals=[], coreVals=[]; const coreSet=new Set(['kor','eng','mat','sci']); subjects.forEach(s=>{ const arr=gradeMatrix[s]||[]; [0,1].forEach(i=>{ if(Number.isFinite(arr[i])) year2Vals.push(arr[i]); }); [2,3].forEach(i=>{ if(Number.isFinite(arr[i])) year3Vals.push(arr[i]); }); arr.forEach(v=>{ if(Number.isFinite(v)){ allVals.push(v); if(coreSet.has(s)) coreVals.push(v); } }); }); const c2=countLetters(year2Vals), c3=countLetters(year3Vals), ca=countLetters(allVals), cc=countLetters(coreVals); const aRatio=pct(ca.A,ca.total), coreARatio=pct(cc.A,cc.total); const lowCount=ca.C+ca['D/E']; const a2=pct(c2.A,c2.total), a3=pct(c3.A,c3.total); let trend='추이 판단 자료 부족'; if(Number.isFinite(a2)&&Number.isFinite(a3)){ const diff=a3-a2; trend = diff>=10 ? `A 비율 상승 (+${diff.toFixed(0)}%p)` : diff<=-10 ? `A 비율 하락 (${diff.toFixed(0)}%p)` : 'A 비율 대체로 유지'; } let label='자료 부족'; let note='확정된 교과 성취 자료가 더 필요합니다.'; if(ca.total>=6){ if(aRatio>=80 && lowCount===0){ label='매우 안정'; note='대부분의 과목에서 A 성취가 반복되어 전과목 안정성이 높게 나타납니다.'; }else if(aRatio>=60 && lowCount<=1){ label='안정'; note='A 중심의 성취가 유지되며 일부 과목만 보완하면 되는 구조입니다.'; }else if((ca.A+ca.B)/ca.total>=0.8){ label='기본 안정'; note='A·B 중심의 기본기는 확보되어 있으나 핵심과목별 강약을 함께 볼 필요가 있습니다.'; }else{ label='과목 편차 확인'; note='전체 평균보다 과목별 성취 편차와 반복적으로 낮아지는 과목을 확인해야 합니다.'; } } const row = (title,c)=>` <tr> <td style="padding:6px;border:1px solid #e1e5ea;font-weight:900;">${title}</td> <td style="padding:6px;border:1px solid #e1e5ea;text-align:center;">${c.A}</td> <td style="padding:6px;border:1px solid #e1e5ea;text-align:center;">${c.B}</td> <td style="padding:6px;border:1px solid #e1e5ea;text-align:center;">${c.C}</td> <td style="padding:6px;border:1px solid #e1e5ea;text-align:center;">${c['D/E']}</td> <td style="padding:6px;border:1px solid #e1e5ea;text-align:center;">${c.total}</td> </tr>`; box.innerHTML=` <div style="background:#fff;border:1px solid #e3e8ef;border-radius:10px;padding:9px 11px;"> <div style="display:flex;justify-content:space-between;align-items:flex-end;gap:12px;margin-bottom:7px;"> <div> <div style="font-weight:900;color:#333;font-size:0.90em;">📚 교과 성취 안정도</div> <div style="font-size:0.70em;color:#777;margin-top:2px;">학년별 A·B·C·D/E 개수와 최근 성취 흐름을 함께 봅니다.</div> </div> <div style="font-weight:900;color:var(--primary);font-size:1.05em;">${label}</div> </div> <table style="width:100%;border-collapse:collapse;font-size:0.71em;"> <thead> <tr style="background:#f5f7fa;"> <th style="padding:6px;border:1px solid #e1e5ea;">구분</th> <th style="padding:6px;border:1px solid #e1e5ea;">A</th> <th style="padding:6px;border:1px solid #e1e5ea;">B</th> <th style="padding:6px;border:1px solid #e1e5ea;">C</th> <th style="padding:6px;border:1px solid #e1e5ea;">D/E</th> <th style="padding:6px;border:1px solid #e1e5ea;">입력 과목수</th> </tr> </thead> <tbody> ${row('2학년',c2)} ${row('3학년',c3)} ${row('전체',ca)} </tbody> </table> <div style="display:grid;grid-template-columns:repeat(3,1fr);gap:7px;margin-top:7px;text-align:center;"> <div style="background:#f8fbff;border-radius:7px;padding:6px;"> <div style="font-size:0.67em;color:#666;">전체 A 비율</div> <b>${Number.isFinite(aRatio)?aRatio.toFixed(0)+'%':'자료 부족'}</b> </div> <div style="background:#f8fbff;border-radius:7px;padding:6px;"> <div style="font-size:0.67em;color:#666;">국·수·영·과 A 비율</div> <b>${Number.isFinite(coreARatio)?coreARatio.toFixed(0)+'%':'자료 부족'}</b> </div> <div style="background:#f8fbff;border-radius:7px;padding:6px;"> <div style="font-size:0.67em;color:#666;">학년별 흐름</div> <b>${trend}</b> </div> </div> <div style="font-size:0.71em;color:#555;line-height:1.45;margin-top:7px;"> <b>해석:</b> ${note}<br> <span style="color:#777;">※ A·B 개수는 교과 평균을 다시 가산하는 점수가 아니라, <b>성취의 안정성·과목 편차·변화 추이</b>를 확인하는 보조 지표로 사용합니다. 같은 정보를 이중으로 점수화하지 않습니다.</span> </div> </div>`; } function renderDnaPosition(totalRaw,avgs){ const box=document.getElementById('dnaPositionSummary'); if(!box) return; const stage=getDnaStage(totalRaw); const ranges=[ {min:231,max:240,label:'최상위 균형형'}, {min:221,max:230,label:'심화 탐구형'}, {min:211,max:220,label:'자기주도 안정형'}, {min:201,max:210,label:'안정 성장형'}, {min:191,max:200,label:'기본기 확보형'}, {min:181,max:190,label:'성장 변동형'}, {min:171,max:180,label:'실행 보완형'}, {min:0,max:170,label:'기초 구조 보완형'} ]; const pairs=[['탐구',avgs.A],['자기주도',avgs.B],['정서·회복',avgs.C],['학습습관',avgs.D]]; const sorted=[...pairs].sort((a,b)=>b[1]-a[1]), strength=sorted[0], check=sorted[sorted.length-1]; box.innerHTML=`<div style="background:#fff;border:1px solid #e1e6ed;border-radius:10px;padding:10px 12px;"> <div style="display:flex;justify-content:space-between;align-items:flex-end;gap:12px;margin-bottom:8px;"> <div><div style="font-size:0.73em;color:#666;">현재 성장 DNA 위치</div><div style="font-size:1.28em;font-weight:900;color:var(--primary);">${stage.label}</div></div> <div style="text-align:right;"><div style="font-size:1.35em;font-weight:900;color:var(--secondary);">${totalRaw.toFixed(1)} / 240</div><div style="font-size:0.70em;color:#666;">${stage.min===0?'170 이하':stage.min+'–'+stage.max} 구간</div></div> </div> <div style="display:grid;grid-template-columns:repeat(8,1fr);gap:3px;"> ${ranges.map(r=>{const active=totalRaw>=r.min&&totalRaw<=r.max;return `<div style="padding:6px 2px;border-radius:6px;text-align:center;font-size:0.62em;font-weight:${active?'900':'600'};background:${active?'#fff3cd':'#f2f4f7'};border:${active?'2px solid #d98b1f':'1px solid #e3e7ec'};color:${active?'#7a4b00':'#777'};">${r.label}</div>`;}).join('')} </div> <div style="margin-top:8px;font-size:0.74em;line-height:1.45;color:#555;"><b>현재 강점:</b> ${strength[0]} ${strength[1].toFixed(1)}점 · <b>우선 확인:</b> ${check[0]} ${check[1].toFixed(1)}점<br><span style="color:#777;">※ 성장 DNA 단계는 4대 역량 원점수의 위치를 보여주는 상담용 구간입니다. 타고난 재능이나 합격 가능성을 뜻하지 않습니다.</span></div> </div>`; } function generateReport() { const info = { date: document.getElementById('inDate').value, school: document.getElementById('inSchool').value, name: document.getElementById('inName').value, gradeVal: document.getElementById('inGrade').value, gradeTxt: document.getElementById('inGrade').options[document.getElementById('inGrade').selectedIndex].text.split(' ')[0], stream: document.getElementById('inStream').value.toUpperCase(), style: document.getElementById('inStyle').value }; const qInps = document.querySelectorAll('.q-val'); const sums = { A: 0, B: 0, C: 0, D: 0 }; const counts = { A: 0, B: 0, C: 0, D: 0 }; qInps.forEach(inp => { sums[inp.dataset.domain] += parseInt(inp.value); counts[inp.dataset.domain]++; }); const avgs = { A: sums.A/counts.A, B: sums.B/counts.B, C: sums.C/counts.C, D: sums.D/counts.D }; // 학년에 따라 일괄 감점하지 않고, 자료 종류와 해석 기준을 다르게 적용합니다. let mentalCalibration = 1.0; let calibText = ""; if (info.gradeVal === 'elem') { calibText = "<div class='trend-badge trend-same' style='margin-left:10px;'>초등 성장탐색 기준</div>"; } else if (info.gradeVal === 'mid12') { calibText = "<div class='trend-badge trend-same' style='margin-left:10px;'>중1·2 성장진단 기준</div>"; } else { calibText = "<div class='trend-badge trend-same' style='margin-left:10px;'>중3 진학준비 기준</div>"; } const totalRaw = (avgs.A + avgs.B + avgs.C + avgs.D) * 6; for(let i=1; i<=10; i++) document.getElementById('p'+i).style.display = "block"; document.getElementById('p3a').style.display = "block"; const operationMode = document.querySelector('input[name="operationMode"]:checked')?.value || 'sejong'; document.getElementById('p7').style.display = "block"; document.getElementById('p8').style.display = operationMode === 'daechi' ? "none" : "block"; // 핵심 그래프는 뒤쪽 계산과 독립적으로 먼저 렌더링해 빈칸을 방지 renderApexRadar([avgs.A*10, avgs.B*10, avgs.C*10, avgs.D*10]); const headerTitle = `APEX 학업역량 정밀진단 리포트 (${currentSession}차)`; const headerHtml = `<div class="title-area"><div><h1 style="font-size:1.7em;">${headerTitle}</h1><div class="sub-text">데이터로 증명하는 최상위권의 합격 DNA</div></div></div>`; ['header-p2','header-p3','header-p3a','header-p4','header-p5','header-p6','header-p7','header-p8','header-p9','header-p10'].forEach(id => document.getElementById(id).innerHTML = headerHtml); document.getElementById('outSessionText').innerText = `${currentSession}차 진단`; document.getElementById('outDate').innerText = info.date; document.getElementById('outSchool').innerText = info.school; document.getElementById('outGrade').innerText = document.getElementById('inGrade').options[document.getElementById('inGrade').selectedIndex].text; document.getElementById('outName').innerText = info.name; const currentStep0Qs = (currentSession === "1") ? step0_short_1 : step0_short_2; const s0Disp = document.getElementById('step0_display'); s0Disp.innerHTML = ""; currentStep0Qs.forEach((q, i) => { let val = ""; if(i < 6) { val = document.getElementById(`s0_${i}`).value; s0Disp.innerHTML += `<div class="survey-item" style="grid-column: 1 / -1; flex-direction: column; align-items: flex-start; padding: 4px 0; border-bottom: 1px dashed #eee; margin-bottom: 2px;"><span class="q" style="font-weight:700; color:#333; margin-bottom:3px; font-size:0.9em;">${q}</span><span class="a" style="color:var(--primary); background:#f4faff; padding:4px 10px; border-radius:6px; width:100%; display:block; font-weight:600; font-size:0.9em;">${val || '-'}</span></div>`; } else { val = document.getElementById(`s0_${i}`).options[document.getElementById(`s0_${i}`).selectedIndex].text; s0Disp.innerHTML += `<div class="survey-item" style="padding: 4px 0; font-size: 0.85em;"><span class="q">${q}</span><span class="a">${val}</span></div>`; } }); const mDisp = document.getElementById('main_survey_display'); mDisp.innerHTML = ""; const activeDomainData = (currentSession === "1") ? domains_1[info.gradeVal] : domains_2[info.gradeVal]; for (let d in activeDomainData) { mDisp.innerHTML += `<h4 style="margin:15px 0 5px 0; color:var(--primary); font-size:1.05em;">[${{A:"탐구(Inquiry)", B:"주도(Self-Directed)", C:"정서(Resilience)", D:"습관(Habit)"}[d]}]</h4><div class="survey-grid" style="margin-top:5px;"></div>`; const lastGrid = mDisp.lastElementChild; activeDomainData[d].forEach((q, i) => { const score = document.querySelectorAll(`.q-val[data-domain="${d}"]`)[i].value; lastGrid.innerHTML += `<div class="survey-item"><span class="q">${q}</span><span class="a">${score}점</span></div>`; }); } const pp = calcPressureProfile(); const pSignals = pressureSignals(pp); document.getElementById('pressureProfileSummary').innerHTML = ` <div style="display:grid; grid-template-columns:repeat(4,1fr); gap:10px; text-align:center;"> <div><b>자기 목표</b><div style="font-size:1.6em;font-weight:900;color:var(--primary);">${pp.ownership.toFixed(1)}</div><small>${pressureLevel(pp.ownership)}</small></div> <div><b>기대 부담 조절</b><div style="font-size:1.6em;font-weight:900;color:var(--primary);">${pp.pressureControl.toFixed(1)}</div><small>${pressureLevel(pp.pressureControl)}</small></div> <div><b>도움 요청·회복</b><div style="font-size:1.6em;font-weight:900;color:var(--primary);">${pp.recoveryHelp.toFixed(1)}</div><small>${pressureLevel(pp.recoveryHelp)}</small></div> <div><b>다시 시작하는 힘</b><div style="font-size:1.6em;font-weight:900;color:var(--primary);">${pp.returnTolerance.toFixed(1)}</div><small>${pressureLevel(pp.returnTolerance)}</small></div> </div> <p style="margin:12px 0 0 0;font-size:0.86em;color:#555;">기존 4대 역량 점수와 함께 해석하는 보조 지표입니다. 학생이 스트레스를 받았을 때 회복하고 다시 공부 흐름으로 돌아오는 방식을 확인합니다.</p>`; const psd=document.getElementById('pressureSurveyDisplay'); psd.innerHTML='<h4 style="color:#9a5a00;margin:8px 0;">12문항 응답</h4><div class="survey-grid"></div>'; const pgrid=psd.lastElementChild; pressureQuestions.forEach((q,i)=>{ pgrid.innerHTML += `<div class="survey-item"><span class="q">${i+1}. ${q.text}</span><span class="a">${getPressureValue(q.id)}점</span></div>`; }); document.getElementById('pressureWatchArea').innerHTML = pSignals.length ? `<h4 style="color:#9a5a00;margin:8px 0;">미리 확인할 부분</h4>` + pSignals.map(s=>`<div class="analysis-box" style="background:#fff8ee;border-left:5px solid #d98b1f;margin:7px 0;padding:10px 13px;"><b>${s[0]}</b><br>${s[1]}</div>`).join('') : `<div class="analysis-box" style="background:#eefaf5;border-left:5px solid #16845b;margin-top:8px;"><b>현재 큰 확인 신호는 두드러지지 않습니다.</b><br>실제 상담 장면과 최근 변화 여부를 함께 확인합니다.</div>`; const overviews = { elem: "<b>Step 1. The Seed 단계</b>는 미래의 영재학교 및 의대 진학 가능성을 결정짓는 '지적 호기심의 씨앗'과 '기초 학습 체질'을 확인하는 고유 진단 과정입니다. 이 시기 학생이 보여주는 Inquiry(탐구) 점수는 단순 성적을 넘어 고교 진학 후 창의융합 활동에서 두각을 나타낼 수 있는 잠재력을 객관적으로 증명합니다.", mid12: "<b>Step 2. The Route 단계</b>는 자유학기제를 활용해 자신의 '계열 적합성'을 데이터로 확정하고 메타인지 기반의 주도적 학습 도구를 체계화하는 골든타임 진단입니다. 지능에만 의존하는 학습에서 벗어나 백지 복습과 엄격한 시간 관리 습관이 정착되었는지를 정밀하게 측정하여 대입 개편 환경에서의 경쟁력을 확보합니다.", mid3: "<b>Step 3. The Final 단계</b>는 실제 9개 명문 고교의 입학 요강을 반영하여 생기부 내 탐구 사례가 학교 인재상에 부합하는지, 자소서 및 면접용 '킬러 콘텐츠'가 실재하는지를 분석합니다. 특히 입학 후 전교 1등이 겪게 될 내신 급락 현실을 견딜 수 있는 '경쟁·시험 환경에서 흐름을 유지하고 회복하는 힘'을 보는 지표를 측정하여 최종 합격 가능성을 증명합니다." }; document.getElementById('step_overview_box').innerHTML = overviews[info.gradeVal]; document.getElementById('resTotal').innerText = `${totalRaw.toFixed(1)} / 240`; document.getElementById('totalBoxTitle').innerText = currentSession === "1" ? "학업역량 정밀진단 종합 지수 (거품 제거 전 원점수)" : "2차 진단 종합 지수 (추이 반영)"; const badge = document.getElementById('trendBadge'); if (currentSession === "2") { const prevScore = parseFloat(document.getElementById('inPrevScore').value || 0); if(prevScore > 0) { const diff = (totalRaw - prevScore).toFixed(1); badge.style.display = "inline-block"; if (diff > 0) { badge.className = "trend-badge trend-up"; badge.innerText = `▲ ${diff}점 상승`; } else if (diff < 0) { badge.className = "trend-badge trend-down"; badge.innerText = `▼ ${Math.abs(diff)}점 하락`; } else { badge.className = "trend-badge trend-same"; badge.innerText = `- 유지`; } } else { badge.style.display = "none"; } } else { badge.style.display = "none"; } let tierText = ""; let summaryText = ""; if (totalRaw >= 231) { tierText = "최상위 균형형"; summaryText = "학생은 전 영역에서 결점이 없는 완벽한 밸런스를 보여주는 최상위 인재입니다. 탁월한 탐구력(Inquiry)과 무너지지 않는 회복탄력성(Resilience)의 결합을 통해 전국구 의대 및 영재학교 진학 시에도 최상위권 경쟁력을 유지할 수 있습니다. 이미 완성된 입시 근력을 바탕으로 압도적인 생기부 킬러 콘텐츠를 기획하십시오."; } else if (totalRaw >= 221) { tierText = "심화 탐구형"; summaryText = "학생은 지적 호기심을 바탕으로 한 탐구 역량이 독보적인 수준입니다. 과학고 및 전국 단위 자사고의 최상위 트랙에 진학하기에 충분한 학업적 깊이를 갖추고 있습니다. 고난도 수학/과학 융합 탐구 보고서를 집중적으로 생산하여 본인만의 천재성을 서류로 입증하는 단계로 넘어가야 합니다."; } else if (totalRaw >= 211) { tierText = "자기주도 안정형"; summaryText = "메타인지 기반의 주도성(Self-Directed)과 습관(Habit) 영역이 매우 우수합니다. 높은 엉덩이의 힘을 바탕으로 한 완벽한 내신 1.0 관리 전략이 주효하며, 지역인재 의대 트랙 공략의 적기입니다. 다만 최상위권 변별을 위한 심화 탐구 역량에 10%의 아쉬움이 있으므로 이 부분을 집중 보완해야 합니다."; } else if (totalRaw >= 201) { tierText = "안정 성장형"; summaryText = "학생은 높은 성실도를 바탕으로 흔들림 없는 기초 체력을 확보하고 있습니다. 공주사대부고, 한일고 등 엄격한 규칙이 적용되는 기숙형 자율학교 환경에서 두각을 나타낼 수 있는 훌륭한 자산입니다. 이제는 수동적인 성실함을 넘어 스스로 질문을 던지고 파고드는 능동적 지적 호기심을 점화할 때입니다."; } else if (totalRaw >= 191) { tierText = "기본기 확보형"; summaryText = "기본적인 학업 체력은 양호하나, 특목·자사고의 치열한 경쟁을 압도하기에는 2% 부족한 상태입니다. 특히 고난도 과제를 마주했을 때의 회복탄력성과 심화 탐구 역량을 보완한다면 폭발적인 반등이 가능합니다. 주도적인 백지 복습을 통해 지식의 깊이를 더하는 훈련이 시급합니다."; } else if (totalRaw >= 181) { tierText = "성장 변동형"; summaryText = "학생은 학습 잠재력은 있으나 정서적 기복과 습관의 불균형으로 인해 외부 환경에 크게 의존하는 경향을 보입니다. 스마트폰 등 유혹에 대한 환경 통제 훈련과 명확한 동기부여가 시급합니다. 무리한 특목고 지원보다는 확실한 생활 루틴을 잡고 자존감을 회복하는 것이 선결 과제입니다."; } else if (totalRaw >= 171) { tierText = "실행 보완형"; summaryText = "지능이나 이해력 등 잠재력은 존재하지만, 이를 결과로 만들어낼 실행력(습관, 주도성)이 심각하게 부족한 상태입니다. 현재 상태로 고강도 경쟁 학교에 진학 시 적응에 큰 어려움을 겪을 수 있습니다. 차라리 일반고로 진학하여 최상위 내신을 선점하는 전략을 권장하며, 강력한 생활 통제가 필요합니다."; } else { tierText = "기초 구조 보완형"; summaryText = "누적된 학습 결손과 메타인지의 심각한 결핍이 데이터로 나타나고 있습니다. 무리한 선행 진도는 무의미하며, 학원 지시에만 의존하는 수동적 태도를 당장 버려야 합니다. 전문가와의 긴급 상담을 통해 스마트폰 격리, 수면 루틴 확립 등 학업 체질을 근본적으로 바꾸는 극약 처방이 즉시 가동되어야 합니다."; } document.getElementById('resTier').innerText = tierText; document.getElementById('resSummary').innerHTML = summaryText; renderDnaPosition(totalRaw, avgs); if(info.style === 'master' && (avgs.B < 6 || avgs.D < 6)) { document.getElementById('mismatchArea').innerHTML = `<div class="mismatch-box"><b>⚠️ [The Illusionist] 메타인지 결핍 경고:</b> 학생은 스스로를 '마스터형'으로 인식하고 있으나 실제 주도성(B) 및 습관(D) 지표는 평균 이하입니다. 이는 본인의 학습 통제력을 과대평가하고 있음을 의미하며, 입학 후 자기주도 시간 확보 실패 시 성적이 급락할 관리 필요이 매우 큽니다.</div>`; } else { document.getElementById('mismatchArea').innerHTML = ""; } const domainNames = {A:"탐구(Inquiry)", B:"주도(Self-Directed)", C:"정서(Resilience)", D:"습관(Habit)"}; const getAnalysis = (avg, domain) => { const level = avg >= 9 ? 'Master' : (avg >= 7 ? 'Proficient' : (avg >= 5 ? 'Developing' : 'Critical')); const levelTxt = {Master:"전문가 (Master)", Proficient:"숙련 (Proficient)", Developing:"발전 (Developing)", Critical:"결손 주의 (Critical)"}[level]; const tagClass = `tag-${level.toLowerCase()}`; let intro = ""; let content = ""; if(domain === 'A') { intro = "탐구 역량은 단순 문제 풀이를 넘어 교과 개념에 의문을 갖고 가설을 세워 검증하는 '지적 호기심'의 척도입니다."; if(avg >= 9) content = "<b>[Master 특성]</b> 가설 설정 및 검증 능력이 탁월하여 STEAM형 면접에 최적화된 독보적 강점을 지닙니다. 현상의 원리에 대해 스스로 질문하며 난제 해결을 즐깁니다. <br><br><b>[전략 제언]</b> 이 지적 에너지를 실제 산출물로 연결하여 생기부의 팩트로 증명하는 고도화 과정이 필요합니다."; else if(avg >= 7) content = "<b>[Proficient 특성]</b> 교과 개념에 대한 이해도와 탐구 의지는 양호하나, 아직 스스로 심화 주제를 기획하고 끝까지 파고드는 Deep-Dive 경험이 다소 부족합니다. <br><br><b>[전략 제언]</b> 전문가와 함께 점검 분야의 작은 주제부터 가설-검증 프로세스를 경험하며 지적 확장성을 증명해야 합니다."; else if(avg >= 5) content = "<b>[Developing 특성]</b> 수동적인 지식 습득에 머물러 있어 정답이 없는 심화 주제나 창의융합 과제를 다룰 때 뚜렷한 한계를 드러낼 수 있습니다. <br><br><b>[전략 제언]</b> 무리한 선행보다는 '왜?'라는 질문을 던지고 스스로 답을 찾는 기초 탐구 훈련이 시급합니다."; else content = "<b>[Critical 특성]</b> 지적 호기심이 부족하고 단순 암기에만 의존하는 경향이 강해 고난도 융합 과제 수행에 큰 어려움이 예상됩니다. <br><br><b>[긴급 처방]</b> 흥미를 유발할 수 있는 실생활 연계형 기초 탐구부터 시작하여 학업에 대한 거부감을 줄여야 합니다."; } else if(domain === 'B') { intro = "주도 역량은 자신이 아는 것과 모르는 것을 구분하고 효율적으로 학습 로드맵을 설계하는 '메타인지' 능력입니다."; if(avg >= 9) content = "<b>[Master 특성]</b> 학습 우선순위를 스스로 결정하고 백지 복습을 통해 공부 구멍을 메우는 메타인지가 매우 우수합니다. 방대한 학습량을 요구하는 특목고에서도 절대 페이스를 잃지 않을 경쟁력입니다.<br><br><b>[전략 제언]</b> 자신의 공부 방식이 효과적임을 입증할 객관적 결과 데이터들을 누적하여 서류의 신뢰도를 극대화하십시오."; else if(avg >= 7) content = "<b>[Proficient 특성]</b> 주어진 과제는 성실히 수행하지만, 학원이나 가이드에 일정 부분 의존하는 경향이 있습니다. 입학 후 자율학습 시간에 효율 저하를 겪을 수 있습니다.<br><br><b>[전략 제언]</b> 지시받지 않은 스스로의 공부 비중을 늘리고 백지 구조화 복습을 통해 공부의 주도권을 완전히 가져와야 합니다."; else if(avg >= 5) content = "<b>[Developing 특성]</b> 학습 계획은 세우나 실천력이 떨어지고 기분이나 외부 환경에 따라 학습량 기복이 심하게 나타납니다.<br><br><b>[전략 제언]</b> 거창한 계획보다는 매일 100% 달성 가능한 최소한의 루틴을 정하고, 1분 설명하기 등을 통해 진짜 아는 것인지 점검해야 합니다."; else content = "<b>[Critical 특성]</b> 독립적인 학습 설계 능력이 전무하며 누군가의 강제나 지시 없이는 공부를 시작하지 못하는 상태입니다.<br><br><b>[긴급 처방]</b> 스스로 오늘 할 분량을 정하고 점검하는 '셀프 플래닝' 기초 훈련을 통해 무기력을 타파해야 합니다."; } else if(domain === 'C') { intro = "정서 역량은 실패를 분석하고 성장의 발판으로 삼는 '회복탄력성'과 치열한 경쟁 환경에서의 '생존력'입니다."; if(avg >= 9) content = "<b>[Master 특성]</b> 경쟁 환경의 긴장감을 즐거움으로 승화시키는 정서적 근육이 훌륭하여 일시적 성적 하락에도 전혀 흔들리지 않습니다. 의대 정시까지 완주할 수 가장 믿음직한 심리적 자산입니다.<br><br><b>[전략 제언]</b> 지금의 안정적인 마인드셋을 지속적으로 유지하며 입시 당일까지 지치지 않도록 꾸준한 에너지 관리와 휴식을 병행하십시오."; else if(avg >= 7) content = "<b>[Proficient 특성]</b> 전반적으로 긍정적이나, 고난도 문제나 예상치 못한 실수 앞에서 일시적으로 당황하거나 위축되는 경향이 있습니다.<br><br><b>[전략 제언]</b> 성적 하락을 실패가 아닌 전략 수정의 신호로 받아들이는 유연성 훈련과 멘탈 케어가 병행되면 완벽해집니다."; else if(avg >= 5) content = "<b>[Developing 특성]</b> 완벽주의 성향이나 결과에 대한 압박감으로 인해 실패를 두려워하며, 이는 슬럼프를 장기화시킬 큰 관리 필요 요소입니다.<br><br><b>[전략 제언]</b> 결과 중심의 평가보다는 과정에서의 작은 성장을 칭찬하여 학업 자존감과 효능감을 회복하는 것이 최우선입니다."; else content = "<b>[Critical 특성]</b> 작은 좌절에도 쉽게 무기력해지고 실패의 원인을 외부로 돌리는 회피 성향이 관찰됩니다. 고강도 경쟁 환경에서 중도 포기 확률이 높습니다.<br><br><b>[긴급 처방]</b> 치열한 환경 진입을 잠시 보류하고, 심리적 안정감을 줄 수 있는 환경에서 성공 경험을 누적시켜야 합니다."; } else { intro = "습관 역량은 스마트폰 등 온갖 유혹을 물리적으로 차단하고 '진짜 공부 시간'을 집요하게 사수하는 힘입니다."; if(avg >= 9) content = "<b>[Master 특성]</b> 외부 유혹을 완벽히 차단하고 정해진 시간을 사수하는 환경 통제력이 이미 체질화되어 있습니다. 엄격한 기숙 생활에서 최고 효율을 낼 결정적 증거입니다.<br><br><b>[전략 제언]</b> 루틴을 기반으로 수능 최저 기준을 여유 있게 충족할 수 있도록 전략 과목의 원점수 1점 관리에 집요함을 발휘하십시오."; else if(avg >= 7) content = "<b>[Proficient 특성]</b> 기본적인 학습 루틴은 갖춰져 있으나, 스마트폰 등 특정 유혹에 가끔 흔들리며 실제 집중 시간의 밀도가 살짝 아쉽습니다.<br><br><b>[전략 제언]</b> 스마트폰을 물리적으로 완전 격리하고 단 하나의 개념에 깊이 침잠해보는 Deep-Work 연습을 통해 체질을 한 단계 업그레이드 하십시오."; else if(avg >= 5) content = "<b>[Developing 특성]</b> 책상에 앉아있는 시간 대비 실제 몰입도가 현저히 낮습니다. 기숙사형 학교 진학 시 성적 급락으로 직결될 관리 필요이 매우 큽니다.<br><br><b>[전략 제언]</b> 스스로 환경을 통제하기 어려운 상태이므로, 학원이나 부모님의 물리적인 스마트폰 차단 및 환경 격리 조치가 필요합니다."; else content = "<b>[Critical 특성]</b> 디지털 기기에 대한 통제력이 상실되어 있으며, 매일의 기본 수면/기상 루틴마저 흔들리고 있는 심각한 상태입니다.<br><br><b>[긴급 처방]</b> 선행 학습보다 매일 같은 시간에 자고 일어나는 생활 규칙과 전자기기 사용 엄격 통제가 즉시 선행되어야 합니다."; } return `<div class="analysis-box"><b style="font-size:1.25em; color:var(--primary); display:block; margin-bottom:5px;">🔹 ${domainNames[domain]}: ${(avg*10).toFixed(0)}점</b><div class="rubric-tag ${tagClass}" style="margin-bottom:15px;">${levelTxt}</div><br>${intro}<br><br>${content}</div>`; }; document.getElementById('domainPart1').innerHTML = getAnalysis(avgs.A, 'A') + getAnalysis(avgs.B, 'B'); document.getElementById('domainPart2').innerHTML = getAnalysis(avgs.C, 'C') + getAnalysis(avgs.D, 'D'); // ------------------------------------------------------------- // [V26 학업 지속력 지수 및 7P 렌더링 최적화] // ------------------------------------------------------------- let survivalRawCalib = (((avgs.C * 6) + (avgs.D * 4)) * mentalCalibration).toFixed(1); let survivalStatus = survivalRawCalib >= 85 ? "안정" : (survivalRawCalib >= 70 ? "점검" : "관리 필요"); let survivalColor = survivalRawCalib >= 85 ? "#2e7d32" : (survivalRawCalib >= 70 ? "#f57c00" : "#d32f2f"); let indexHtml = ""; if (info.gradeVal === 'elem') { const seed = (((avgs.A * 6) + (avgs.D * 4)) * mentalCalibration).toFixed(1); indexHtml = ` <div style="display:grid; grid-template-columns: 1fr 1.2fr; gap:15px; margin-bottom: 25px;"> <div> <h3>🌱 초등 잠재력 씨앗 지수</h3> <div class="analysis-box" style="height: 140px; padding:15px;"> <div style="text-align:center; margin-top:10px;"><span style="font-size:2em; font-weight:900; color:var(--primary);">${seed}점</span></div> <p style="font-size:0.8em; color:#555; text-align:center; margin-top:10px;">지적 호기심과 기초 습관 결합도<br>85점 이상 시 영재성 발현 단계</p> </div> </div> <div> <h3>🛡️ 학업 지속력 지수</h3> <div class="analysis-box" style="height: 140px; border-left: 5px solid ${survivalColor}; padding:15px;"> <div style="text-align:center; margin-top:0;"> <span style="font-size:2em; font-weight:900; color:var(--primary);">${survivalRawCalib}점</span> <span style="color:${survivalColor}; font-weight:bold; font-size:1.1em; margin-left:10px;">[${survivalStatus}]</span> </div> <p style="font-size:0.8em; color:#555; text-align:center; margin-top:10px; line-height:1.4;">${calibText}<br><span style="color:#d32f2f; font-weight:bold;">70점 미만 시 고교 매칭 페널티 감점 적용</span></p> </div> </div> </div> `; } else if (info.gradeVal === 'mid12') { const nat = (((avgs.A * 7) + (avgs.B * 3)) * mentalCalibration).toFixed(1); const hum = (((avgs.B * 7) + (avgs.A * 3)) * mentalCalibration).toFixed(1); indexHtml = ` <div style="display:grid; grid-template-columns: 1fr 1.2fr; gap:15px; margin-bottom: 20px;"> <div> <h3 style="margin-top:15px;">🧭 계열 적합성 (자연/인문)</h3> <div class="analysis-box" style="height: 130px; padding:15px;"> <div style="display:flex; justify-content:space-around; margin-top:5px;"> <div style="text-align:center;"><div style="font-size:1.4em; font-weight:900; color:var(--secondary);">${nat}점</div><div style="font-size:0.8em; font-weight:bold;">자연/의학</div></div> <div style="text-align:center;"><div style="font-size:1.4em; font-weight:900; color:#d32f2f;">${hum}점</div><div style="font-size:0.8em; font-weight:bold;">인문/사회</div></div> </div> <p style="font-size:0.75em; color:#555; text-align:center; margin-top:10px;">격차 5점 이상 시 해당 계열 우세<br>5점 이내 시 <b>'창의 융합형(영재고형)'</b></p> </div> </div> <div> <h3 style="margin-top:15px;">🛡️ 학업 지속력 지수</h3> <div class="analysis-box" style="height: 130px; border-left: 5px solid ${survivalColor}; padding:15px;"> <div style="text-align:center; margin-top:0;"> <span style="font-size:1.8em; font-weight:900; color:var(--primary);">${survivalRawCalib}점</span> <span style="color:${survivalColor}; font-weight:bold; font-size:1.1em; margin-left:10px;">[${survivalStatus}]</span> </div> <p style="font-size:0.76em; color:#555; text-align:center; margin-top:8px; line-height:1.45;">고강도 내신·시험 환경에서 학습 흐름을 유지하고 다시 회복하는 힘을 보는 지표입니다.<br><b>90점 이상</b>은 최상위권 안착 가능, <b>75점 미만</b>은 환경 적응형 성적 하락을 경고합니다.</p> </div> </div> </div> `; } else { indexHtml = ` <h3>🛡️ 학업 지속력 지수</h3> <div class="analysis-box" style="border-left: 5px solid ${survivalColor}; padding:15px 20px;"> <div style="display:flex; align-items:center; margin-bottom:5px;"> <span style="font-size:2em; font-weight:900; color:var(--primary);">${survivalRawCalib}점</span> <span style="color:${survivalColor}; font-weight:bold; font-size:1.1em; margin-left:15px; background:#f0f0f0; padding:4px 12px; border-radius:8px;">[${survivalStatus}]</span> ${calibText} </div> <span style="font-size:0.85em; color:#444;">특목고 입학 후 5등급 이하 추락(심해어)을 방어하는 '경쟁·시험 환경에서 흐름을 유지하고 회복하는 힘'을 보는 지표입니다. <b>70점 미만 시 아래 고교 선발 매칭 점수에서 일부 보정이 적용됩니다.</b></span> </div> `; } const legacyGradeIndexArea = document.getElementById('gradeIndexArea'); if (legacyGradeIndexArea) legacyGradeIndexArea.innerHTML = indexHtml; // ------------------------------------------------------------- // [V26 알고리즘 초정밀 연산] // ------------------------------------------------------------- const getG = (subj, sem) => { const raw = document.getElementById(`g-${subj}-${sem}`).value; return raw === "" ? null : Number(raw); }; const meanAvailable = arr => { const vals = arr.filter(v => Number.isFinite(v)); return vals.length ? vals.reduce((a,b)=>a+b,0)/vals.length : null; }; const weightedAvailable = (arr, weights) => { let sum=0, wsum=0; arr.forEach((v,i)=>{ if(Number.isFinite(v)){ sum += v*weights[i]; wsum += weights[i]; } }); return wsum ? sum/wsum : null; }; const meanNonNull = vals => { const x=vals.filter(v=>Number.isFinite(v)); return x.length ? x.reduce((a,b)=>a+b,0)/x.length : null; }; const safeVal = (v, fallback=0) => Number.isFinite(v) ? v : fallback; const kor = [getG('kor','21'), getG('kor','22'), getG('kor','31'), getG('kor','32')]; const eng = [getG('eng','21'), getG('eng','22'), getG('eng','31'), getG('eng','32')]; const mat = [getG('mat','21'), getG('mat','22'), getG('mat','31'), getG('mat','32')]; const sci = [getG('sci','21'), getG('sci','22'), getG('sci','31'), getG('sci','32')]; const soc = [getG('soc','21'), getG('soc','22'), getG('soc','31'), getG('soc','32')]; const his = [getG('his','21'), getG('his','22'), getG('his','31'), getG('his','32')]; const gradeMatrix = {kor,eng,mat,sci,soc,his}; renderAchievementStability(gradeMatrix); // 실제 입력된 학기만 계산: 없는 학기는 A나 0점으로 간주하지 않음 const ssWeights = [0.2,0.3,0.5,0]; const ss_kor = weightedAvailable(kor, ssWeights); const ss_eng = weightedAvailable(eng, ssWeights); const ss_mat = weightedAvailable(mat, ssWeights); const ss_sci = weightedAvailable(sci, ssWeights); const ss_soc = weightedAvailable(soc, ssWeights); const ss_his = weightedAvailable(his, ssWeights); const bi_kor = meanAvailable(kor); const bi_eng = meanAvailable(eng); const bi_mat = meanAvailable(mat); const bi_sci = meanAvailable(sci); const bi_soc = meanAvailable(soc); const bi_his = meanAvailable(his); // 교과 입력량/학기 수 const gradeArrays = [kor,eng,mat,sci,soc,his]; const enteredGradeCount = gradeArrays.flat().filter(v=>Number.isFinite(v)).length; const gradeCompleteness = Math.round((enteredGradeCount/24)*100); const semesterIds = [0,1,2,3]; const availableSemesterCount = semesterIds.filter(i => gradeArrays.some(arr=>Number.isFinite(arr[i]))).length; const gradeDataStage = availableSemesterCount===0 ? '예비' : availableSemesterCount<=2 ? '잠정' : '정식'; const readBase = id => { const raw=document.getElementById(id)?.value ?? ""; return raw==="" ? null : Number(raw); }; const baseKor=readBase('inBaseKor'); const baseMath=readBase('inBaseMath'); const baseEng=readBase('inBaseEng'); const baseSci=readBase('inBaseSci'); const isElementary = info.gradeVal==='elem'; const isMidEarly = info.gradeVal==='mid12' && availableSemesterCount===0; const academicMode = isElementary ? '초등 성장탐색형' : isMidEarly ? '중1·2 초기 학업탐색형' : info.gradeVal==='mid12' ? '중1·2 성장진단형' : '중3 진학준비형'; const modeBanner=document.getElementById('academicModeBanner'); if(modeBanner){ const modeDesc = isElementary ? '학교 A/B 성취도를 사용하지 않고 현재 교과 기반·객관 문제해결 자료·심화·확장·성장 DNA를 중심으로 봅니다.' : isMidEarly ? '학교 시험 전 단계입니다. A/B 성취도를 추정하지 않고 초기 학업자료로 분석하며, 첫 성적 이후 성장진단형으로 전환됩니다.' : info.gradeVal==='mid12' ? '실제 학교 성취도와 학업 확장 자료를 함께 보며 학기별 변화와 성장 흐름을 확인합니다.' : '실제 교과 성취도·객관 수준·선행·심화·학업 지속력을 함께 보며 진학 준비도를 확인합니다.'; modeBanner.innerHTML=`<div style="background:#eef6ff;border:1px solid #cfe0f5;border-radius:9px;padding:8px 11px;font-size:0.75em;line-height:1.45;"><b style="color:#234f9b;">${academicMode}</b> · ${modeDesc}</div>`; } // 학교별 계산용 교과값도 실제 존재하는 자료만 사용 const sangsanParts = []; if(Number.isFinite(ss_mat)) sangsanParts.push([ss_mat,100]); if(Number.isFinite(ss_kor)) sangsanParts.push([ss_kor,70]); if(Number.isFinite(ss_eng)) sangsanParts.push([ss_eng,70]); if(Number.isFinite(ss_sci)) sangsanParts.push([ss_sci,40]); const socHisSs = meanNonNull([ss_soc,ss_his]); if(Number.isFinite(socHisSs)) sangsanParts.push([socHisSs,40]); const sangsanWeightSum = sangsanParts.reduce((a,x)=>a+x[1],0); const gpaSangsan = sangsanWeightSum ? sangsanParts.reduce((a,x)=>a+x[0]*x[1],0)/sangsanWeightSum : null; const gpaBukil = meanNonNull([bi_kor,bi_eng,bi_mat,bi_sci,bi_soc,bi_his]); const gpaForeign = bi_eng; const gpaSciMath = meanNonNull([ss_mat,ss_sci]); // 백분위 및 선행(정량 지표) const readOptionalScore = id => { const raw = document.getElementById(id)?.value ?? ""; return raw === "" ? null : Number(raw); }; const mockKor = readOptionalScore('inMockKor'); const mockMath = readOptionalScore('inMockMath'); const mockEng = readOptionalScore('inMockEng'); const mockSci = readOptionalScore('inMockSci'); // 이전 수식 호환용 집계값: 자료가 있는 과목만 평균 const mockSciMath = meanNonNull([mockMath, mockSci]); const mockKorEng = meanNonNull([mockKor, mockEng]); const readLevelScore = id => { const raw=document.getElementById(id)?.value ?? ""; return raw==="" ? null : Number(raw); }; const mScale = readLevelScore('inMathLevel'); const sScale = readLevelScore('inSciLevel'); const kScale = readLevelScore('inKorLevel'); const eScale = readLevelScore('inEngLevel'); const hScale = readLevelScore('inHisLevel'); const getMental = (wa, wb, wc, wd) => { let rawMental = (((wa*avgs.A + wb*avgs.B + wc*avgs.C + wd*avgs.D) / (10*(wa+wb+wc+wd))) * 100); return rawMental * mentalCalibration; }; let survivalPenalty = 1.0; // V26+에서는 아래 학업 지속력 지수 계산 후 재설정 const calcFinal = (gpa_w, adv_w, mental_w) => { if(!Number.isFinite(gpa_w)) return null; let score = gpa_w + adv_w + mental_w; score = score * survivalPenalty; return Math.min(99.5, Math.max(0, score)).toFixed(1); }; const calcFinalNoPenalty = (gpa_w, adv_w, mental_w) => { if(!Number.isFinite(gpa_w)) return null; let score = gpa_w + adv_w + mental_w; return Math.min(99.5, Math.max(0, score)).toFixed(1); }; // [V26] 학교별 수식 정밀 계산 const advGeneral = meanNonNull([mockKor, mockMath, mockEng, mockSci, mScale, sScale, kScale, eScale, hScale]); // [V26+] 교과 성적·모의평가·선행/심화도를 실제 결과에 반영 const gradeNatural = meanNonNull([ Number.isFinite(bi_mat)?bi_mat*0.35:null, Number.isFinite(bi_sci)?bi_sci*0.30:null, Number.isFinite(bi_eng)?bi_eng*0.15:null, Number.isFinite(bi_kor)?bi_kor*0.10:null, Number.isFinite(meanNonNull([bi_soc,bi_his]))?meanNonNull([bi_soc,bi_his])*0.10:null ]); // 위 가중평균을 단순 평균하지 않고, 존재하는 항목의 원래 비중을 재정규화 const weightedSubjects = pairs => { let s=0,w=0; pairs.forEach(([v,wt])=>{ if(Number.isFinite(v)){s+=v*wt; w+=wt;} }); return w ? s/w : null; }; const gradeNaturalWeighted = weightedSubjects([ [bi_mat,0.35],[bi_sci,0.30],[bi_eng,0.15],[bi_kor,0.10],[meanNonNull([bi_soc,bi_his]),0.10] ]); const gradeHumanWeighted = weightedSubjects([ [bi_kor,0.30],[bi_eng,0.30],[bi_soc,0.20],[bi_his,0.10],[bi_mat,0.10] ]); const weightedOptional = pairs => { let s=0,w=0; pairs.forEach(([v,wt])=>{ if(Number.isFinite(v)){ s += v*wt; w += wt; } }); return w ? s/w : null; }; const mockNatural = weightedOptional([ [mockMath,0.45],[mockSci,0.30],[mockEng,0.15],[mockKor,0.10] ]); const mockHuman = weightedOptional([ [mockKor,0.35],[mockEng,0.35],[mockMath,0.15],[mockSci,0.15] ]); const advanceNatural = weightedOptional([ [mScale,0.42],[sScale,0.33],[kScale,0.08],[eScale,0.12],[hScale,0.05] ]); const advanceHuman = weightedOptional([ [kScale,0.35],[eScale,0.35],[hScale,0.15],[mScale,0.08],[sScale,0.07] ]); const baseNatural = weightedOptional([ [baseMath,0.36],[baseSci,0.29],[baseKor,0.18],[baseEng,0.17] ]); const baseHuman = weightedOptional([ [baseKor,0.38],[baseEng,0.32],[baseMath,0.15],[baseSci,0.15] ]); // 성적 전 단계는 교과 성적을 추정하지 않고 현재 기반·객관자료·확장 수준·성장 DNA를 함께 봅니다. const dnaFoundationNatural = Math.max(0,Math.min(100,(avgs.A*0.58 + avgs.B*0.42)*10)); const dnaFoundationHuman = Math.max(0,Math.min(100,(avgs.B*0.55 + avgs.A*0.45)*10)); const dnaBase100 = Math.max(0,Math.min(100,(totalRaw/240)*100)); let naturalReadiness, humanReadiness; if(isElementary){ naturalReadiness = weightedOptional([ [baseNatural,0.45],[mockNatural,0.15],[advanceNatural,0.15],[dnaFoundationNatural,0.25] ]); humanReadiness = weightedOptional([ [baseHuman,0.45],[mockHuman,0.15],[advanceHuman,0.15],[dnaFoundationHuman,0.25] ]); }else if(isMidEarly){ naturalReadiness = weightedOptional([ [baseNatural,0.40],[mockNatural,0.20],[advanceNatural,0.20],[dnaFoundationNatural,0.20] ]); humanReadiness = weightedOptional([ [baseHuman,0.40],[mockHuman,0.20],[advanceHuman,0.20],[dnaFoundationHuman,0.20] ]); }else{ const hasMockData = [mockKor,mockMath,mockEng,mockSci].some(v=>Number.isFinite(v)); let gradeWeight, mockWeight, advanceWeight; if(availableSemesterCount<=2){ gradeWeight=0.45; mockWeight=hasMockData?0.20:0.00; advanceWeight=hasMockData?0.35:0.55; }else{ gradeWeight=0.50; mockWeight=hasMockData?0.20:0.00; advanceWeight=hasMockData?0.30:0.50; } naturalReadiness = weightedOptional([ [gradeNaturalWeighted,gradeWeight],[mockNatural,mockWeight],[advanceNatural,advanceWeight] ]); humanReadiness = weightedOptional([ [gradeHumanWeighted,gradeWeight],[mockHuman,mockWeight],[advanceHuman,advanceWeight] ]); } naturalReadiness = Number.isFinite(naturalReadiness)?Math.max(0,Math.min(100,naturalReadiness)):0; humanReadiness = Number.isFinite(humanReadiness)?Math.max(0,Math.min(100,humanReadiness)):0; const overallAcademicReadiness = Math.max(naturalReadiness,humanReadiness); // 회복탄력성·학습복귀 1~10 → 0~100 환산 const ppNow = calcPressureProfile(); const pressureRecovery100 = ((ppNow.recoveryHelp + ppNow.returnTolerance) / 2) * 10; // 학업 지속력 지수: // 정서 30% + 습관 25% + 자기주도 15% + 회복·도움요청 15% + 학습복귀·오차허용 15% let learningPersistence = ( avgs.C*10*0.30 + avgs.D*10*0.25 + avgs.B*10*0.15 + ppNow.recoveryHelp*10*0.15 + ppNow.returnTolerance*10*0.15 ) * mentalCalibration; learningPersistence = Math.max(0,Math.min(100,learningPersistence)); const readinessLevel = x => x>=85?'매우 높음':x>=75?'높음':x>=65?'보통':x>=55?'보완 필요':'우선 보완'; const growthBaseLevel = x => x>=85?'성장 기반 매우 안정':x>=75?'성장 기반 안정':x>=65?'기본 기반 확보':x>=55?'확장·보완 중':'기초 확인 필요'; const earlyBaseLevel = x => x>=85?'초기 기반 매우 안정':x>=75?'초기 기반 안정':x>=65?'기본 기반 확보':x>=55?'자료 보완 필요':'우선 확인 필요'; const signalLevel = x => x>=85?'매우 강함':x>=75?'강함':x>=65?'안정':x>=55?'확인 중':'자료 보완'; const persistenceLevel = x => x>=85?'안정':x>=70?'점검':'관리 필요'; const streamGap = Math.abs(naturalReadiness-humanReadiness); const streamGuide = isElementary ? (streamGap < 5 ? '두 방향의 탐색 신호가 비슷합니다. 지금은 계열을 좁히기보다 다양한 문제해결 경험을 이어가는 편이 좋습니다.' : naturalReadiness > humanReadiness ? '현재 관찰 자료에서는 수학·과학 탐구 쪽 확장 신호가 조금 더 강합니다.' : '현재 관찰 자료에서는 언어·사회 탐구 쪽 확장 신호가 조금 더 강합니다.') : isMidEarly ? (streamGap < 5 ? '두 계열의 초기 신호 차이가 크지 않습니다. 첫 학교 성적과 실제 수행 자료 이후 다시 확인합니다.' : naturalReadiness > humanReadiness ? '현재 자료에서는 이공계열 초기 준비 신호가 조금 더 높습니다.' : '현재 자료에서는 인문계열 초기 준비 신호가 조금 더 높습니다.') : (streamGap < 5 ? '두 계열의 차이가 크지 않아 융합 가능성이 있습니다.' : naturalReadiness > humanReadiness ? '현재 입력 자료에서는 이공계열 준비도가 더 높게 나타납니다.' : '현재 입력 자료에서는 인문계열 준비도가 더 높게 나타납니다.'); const earlyAcademic = isElementary || isMidEarly; const academicTitle = isElementary ? '📚 학업 성장 기반 · 계열 탐색' : isMidEarly ? '📚 초기 학업 기반 · 계열 탐색' : '📚 학업 준비도 · 계열 적합도'; const overallLabel = isElementary ? growthBaseLevel(overallAcademicReadiness) : isMidEarly ? earlyBaseLevel(overallAcademicReadiness) : readinessLevel(overallAcademicReadiness); const naturalLabel = earlyAcademic ? signalLevel(naturalReadiness) : naturalReadiness.toFixed(1)+'점'; const humanLabel = earlyAcademic ? signalLevel(humanReadiness) : humanReadiness.toFixed(1)+'점'; const earlyDataCount = [baseNatural,baseHuman,mockNatural,mockHuman,advanceNatural,advanceHuman].filter(Number.isFinite).length; const dataNotice = isElementary ? `※ 초5~6은 선행량을 높게 평가하지 않습니다. 현재 교과 기반·객관 문제해결 자료·심화 경험·성장 DNA를 함께 보고, 없는 자료는 감점하지 않습니다.${earlyDataCount<2?' 현재 입력 자료가 적어 탐색 결과로만 해석합니다.':''}` : isMidEarly ? `※ 학교 시험 전에는 A/B 성취도를 추정하지 않습니다. 첫 학교 성적이 확보되면 성장진단형으로 자동 전환됩니다.${earlyDataCount<2?' 현재 입력 자료가 적어 초기 참고 결과로 해석합니다.':''}` : (gradeDataStage==='잠정'?'※ 1~2개 학기 자료가 반영된 잠정 결과입니다. 이후 성적이 추가되면 다시 계산됩니다.':'※ 실제 교과 성취와 입력된 객관자료·선행·심화 자료를 함께 반영합니다.'); const academicHtml = ` <h3 style="margin-top:8px;">${academicTitle} <span style="font-size:0.65em;color:#666;">[${academicMode}]</span></h3> <div class="analysis-box" style="background:#fff;border-left:6px solid var(--secondary);padding:14px 18px;"> <div style="display:grid;grid-template-columns:repeat(3,1fr);gap:12px;text-align:center;"> <div> <div style="font-size:0.78em;color:#666;">${isElementary?'현재 학업 성장 기반':isMidEarly?'현재 초기 학업 기반':'종합 학업 준비도'}</div> ${earlyAcademic ? `<div style="font-size:1.35em;font-weight:900;color:var(--primary);margin-top:5px;">${overallLabel}</div>` : `<div style="font-size:1.8em;font-weight:900;color:var(--primary);">${overallAcademicReadiness.toFixed(1)}점</div><b>${overallLabel}</b>`} </div> <div> <div style="font-size:0.78em;color:#666;">${isElementary?'수학·과학 탐색 신호':'이공계열 준비도'}</div> <div style="font-size:${earlyAcademic?'1.35em':'1.8em'};font-weight:900;color:#1976d2;margin-top:5px;">${naturalLabel}</div> <small>${isElementary?'현재 기반·문제해결·탐구 경험':'수학·과학 중심 자료'}</small> </div> <div> <div style="font-size:0.78em;color:#666;">${isElementary?'언어·사회 탐색 신호':'인문계열 준비도'}</div> <div style="font-size:${earlyAcademic?'1.35em':'1.8em'};font-weight:900;color:#8e44ad;margin-top:5px;">${humanLabel}</div> <small>${isElementary?'독해·표현·배경지식 경험':'국어·영어 중심 자료'}</small> </div> </div> <div style="margin-top:10px;padding-top:9px;border-top:1px solid #eee;font-size:0.82em;color:#555;"> ${streamGuide}<br> ${!earlyAcademic?`<b>교과 데이터:</b> ${gradeDataStage} · ${availableSemesterCount}개 학기 반영 · 입력 충족도 ${gradeCompleteness}%<br>`:''} ${dataNotice} </div> </div>`; const persistenceHtml = ` <h3 style="margin-top:12px;">🛡️ 학업 지속력 지수</h3> <div class="analysis-box" style="background:#fff;border-left:6px solid ${learningPersistence>=85?'#2e7d32':learningPersistence>=70?'#f57c00':'#d32f2f'};padding:14px 18px;"> <div style="display:flex;align-items:center;gap:12px;flex-wrap:wrap;"> <span style="font-size:1.9em;font-weight:900;color:var(--primary);">${learningPersistence.toFixed(1)}점</span> <b>[${persistenceLevel(learningPersistence)}]</b> </div> <div style="font-size:0.84em;color:#555;margin-top:7px;"> 경쟁·시험 환경에서 학습 흐름을 유지하고, 흔들린 뒤 다시 회복해 공부로 돌아오는 힘을 봅니다.<br> 정서·습관·자기주도·회복·학습복귀를 종합해 산출합니다. </div> </div>`; const ar1=document.getElementById('academicReadinessArea'); const ar2=document.getElementById('academicReadinessAreaDaechi'); if(ar1) ar1.innerHTML=academicHtml+persistenceHtml; if(ar2) ar2.innerHTML=academicHtml+persistenceHtml; const dna100 = Math.max(0,Math.min(100,(totalRaw/240)*100)); const overallOutlook = isElementary ? { title: growthBaseLevel(overallAcademicReadiness), text: overallAcademicReadiness>=75 ? '현재 교과 기반과 성장 방식이 비교적 안정적입니다. 선행량보다 실제 문제해결·독해·탐구 경험을 넓히며 강점을 확인하는 단계입니다.' : overallAcademicReadiness>=65 ? '기본 학업 기반은 확보되어 있습니다. 부족으로 단정하기보다 실제 문제해결과 심화 경험을 넓혀 어떤 영역에서 강점이 반복되는지 확인합니다.' : '현재 자료만으로 수준을 단정하기보다 교과 기반과 실제 문제해결 경험을 추가로 확인하는 것이 우선입니다.' } : isMidEarly ? { title: earlyBaseLevel(overallAcademicReadiness), text: overallAcademicReadiness>=75 ? '학교 시험 전 자료 기준으로 초기 학업 기반이 비교적 안정적입니다. 첫 학교 성적과 수행 자료가 확보되면 다시 확인합니다.' : overallAcademicReadiness>=65 ? '기본 학업 기반은 확보되어 있습니다. 첫 학교 성적이 나오기 전까지 객관 문제해결 자료와 학습 흐름을 더 확인합니다.' : '현재 자료만으로 낮다고 단정하지 않고, 첫 학교 성적과 객관자료를 추가해 판단하는 단계입니다.' } : threeAxisOutlook(dna100, overallAcademicReadiness, learningPersistence); const schoolAxisBox = document.getElementById('schoolThreeAxisSummary'); if(schoolAxisBox){ schoolAxisBox.innerHTML = ` <div style="display:grid;grid-template-columns:repeat(3,1fr);gap:8px;text-align:center;"> <div style="background:#f8fbff;border:1px solid #dbe6f3;border-radius:9px;padding:8px 10px;"> <div style="font-size:0.72em;color:#666;">성장 DNA</div> <div style="font-size:1.35em;font-weight:900;color:var(--primary);">${totalRaw.toFixed(1)} / 240</div> <div style="font-size:0.72em;font-weight:800;">${apexLevelFromRaw(totalRaw)}</div> </div> <div style="background:#f8fbff;border:1px solid #dbe6f3;border-radius:9px;padding:8px 10px;"> <div style="font-size:0.72em;color:#666;">${isElementary?'학업 성장 기반':isMidEarly?'초기 학업 기반':'현재 학업 준비도'}</div> ${earlyAcademic ? `<div style="font-size:1.08em;font-weight:900;color:#1976d2;margin-top:5px;">${overallLabel}</div><div style="font-size:0.68em;color:#777;margin-top:3px;">정량 등급이 아닌 상담용 상태</div>` : `<div style="font-size:1.35em;font-weight:900;color:#1976d2;">${overallAcademicReadiness.toFixed(1)}점</div><div style="font-size:0.72em;font-weight:800;">${readinessLevel(overallAcademicReadiness)}</div>`} </div> <div style="background:#f8fbff;border:1px solid #dbe6f3;border-radius:9px;padding:8px 10px;"> <div style="font-size:0.72em;color:#666;">학업 지속력</div> <div style="font-size:1.35em;font-weight:900;color:#2e7d32;">${learningPersistence.toFixed(1)}점</div> <div style="font-size:0.72em;font-weight:800;">${persistenceLevel(learningPersistence)}</div> </div> </div>`; } const streamFitBox = document.getElementById('streamFitSummary'); if(streamFitBox){ const naturalFitLegacy = Math.max(0,Math.min(100, ((avgs.A*7 + avgs.B*3) / 10) * 10 * mentalCalibration)); const humanFitLegacy = Math.max(0,Math.min(100, ((avgs.B*7 + avgs.A*3) / 10) * 10 * mentalCalibration)); const fitGap = Math.abs(naturalFitLegacy-humanFitLegacy); let fitText = ''; if(fitGap < 5){ fitText = '두 계열의 차이가 크지 않아 융합형 가능성을 함께 볼 수 있습니다.'; }else if(naturalFitLegacy > humanFitLegacy){ fitText = '현재 학습 성향에서는 자연·의학 계열이 조금 더 우세하게 나타납니다.'; }else{ fitText = '현재 학습 성향에서는 인문·사회 계열이 조금 더 우세하게 나타납니다.'; } streamFitBox.innerHTML = ` <div style="background:#fff;border:1px solid #e3e8ef;border-radius:9px;padding:8px 11px;"> <div style="font-weight:900;color:#333;font-size:0.88em;margin-bottom:5px;">🧭 계열 적합성</div> <div style="display:grid;grid-template-columns:1fr 1fr;gap:8px;text-align:center;"> <div style="background:#f7fbff;border-radius:7px;padding:6px;"> <div style="font-size:0.70em;color:#666;">자연·의학</div> <div style="font-size:1.20em;font-weight:900;color:#1976d2;">${naturalFitLegacy.toFixed(1)}점</div> </div> <div style="background:#fbf8ff;border-radius:7px;padding:6px;"> <div style="font-size:0.70em;color:#666;">인문·사회</div> <div style="font-size:1.20em;font-weight:900;color:#8e44ad;">${humanFitLegacy.toFixed(1)}점</div> </div> </div> <div style="font-size:0.70em;color:#666;margin-top:5px;text-align:center;">${fitText}</div> </div>`; } const subjectProfileBox = document.getElementById('subjectProfileSummary'); if(subjectProfileBox){ const subjectRows = [ {name:'국어', values:kor, grade:bi_kor, base:baseKor, mock:mockKor, advance:kScale}, {name:'수학', values:mat, grade:bi_mat, base:baseMath, mock:mockMath, advance:mScale}, {name:'영어', values:eng, grade:bi_eng, base:baseEng, mock:mockEng, advance:eScale}, {name:'과학', values:sci, grade:bi_sci, base:baseSci, mock:mockSci, advance:sScale} ].map(x=>{ const currentBase = Number.isFinite(x.grade) ? x.grade : (Number.isFinite(x.base)?x.base:null); const earlyReadiness = isElementary ? weightedOptional([[currentBase,0.50],[x.mock,0.15],[x.advance,0.15],[dnaBase100,0.20]]) : isMidEarly ? weightedOptional([[currentBase,0.45],[x.mock,0.20],[x.advance,0.20],[dnaBase100,0.15]]) : null; const readiness = (isElementary || isMidEarly) ? earlyReadiness : subjectReadiness(currentBase,x.mock,x.advance); return {...x,currentBase,readiness}; }); const noSchoolGradeMode = availableSemesterCount===0; const profileTitle = isElementary ? '📑 초등 과목별 성장탐색 프로필' : isMidEarly ? '📑 중1·2 초기 학업탐색 프로필' : '📑 과목별 학업 준비도 프로필'; const col1Title = noSchoolGradeMode ? '현재 교과 기반' : '교과 성취'; const col2Title = isElementary ? '객관 문제해결 자료' : '상대평가·모의'; const col3Title = isElementary ? '심화·확장' : '선행·심화'; const col4Title = isElementary ? '학업 성장 기반' : isMidEarly ? '초기 학업 기반' : '종합 준비도'; subjectProfileBox.innerHTML = ` <div style="background:#fff;border:1px solid #e3e8ef;border-radius:10px;padding:9px 11px;"> <div style="font-weight:900;color:#333;font-size:0.90em;margin-bottom:7px;">${profileTitle}</div> <table style="width:100%;border-collapse:collapse;font-size:0.72em;"> <thead> <tr style="background:#f5f7fa;"> <th style="padding:6px;border:1px solid #e1e5ea;">과목</th> <th style="padding:6px;border:1px solid #e1e5ea;">${col1Title}</th> <th style="padding:6px;border:1px solid #e1e5ea;">${col2Title}</th> <th style="padding:6px;border:1px solid #e1e5ea;">${col3Title}</th> <th style="padding:6px;border:1px solid #e1e5ea;">${col4Title}</th> </tr> </thead> <tbody> ${subjectRows.map(r=>` <tr> <td style="padding:6px;border:1px solid #e1e5ea;font-weight:900;text-align:center;">${r.name}</td> <td style="padding:6px;border:1px solid #e1e5ea;text-align:center;"> ${noSchoolGradeMode ? (Number.isFinite(r.base) ? `<b>${r.base>=90?'매우 안정':r.base>=80?'안정':r.base>=68?'기본 확보':'일부 보완'}</b><div style="font-size:0.72em;color:#777;margin-top:2px;">관찰 기반</div>` : '<span style="color:#888;">관찰 자료 없음</span>') : (()=>{const p=subjectAchievementProfile(r.values);return `<b>${p.label}</b>${p.detail?`<div style="font-size:0.78em;color:#777;margin-top:2px;">${p.detail}</div>`:''}${p.trend?`<div style="font-size:0.72em;color:#8a6d1f;margin-top:1px;">${p.trend}</div>`:''}`})()} </td> <td style="padding:6px;border:1px solid #e1e5ea;text-align:center;"> ${Number.isFinite(r.mock) ? (earlyAcademic ? `<b>${scoreLabel(r.mock)}</b><div style="font-size:0.70em;color:#777;">객관자료 있음</div>` : `${r.mock.toFixed(0)}점 · ${scoreLabel(r.mock)}`) : '자료 없음'} </td> <td style="padding:6px;border:1px solid #e1e5ea;text-align:center;"> ${Number.isFinite(r.advance) ? (earlyAcademic ? `<b>${r.advance>=88?'확장 매우 활발':r.advance>=78?'확장 활발':r.advance>=68?'현행 심화 안정':r.advance>=58?'확장 시작':'기초 보완'}</b>` : r.advance.toFixed(0)+'점') : '<span style="color:#888;">자료 없음</span>'} </td> <td style="padding:6px;border:1px solid #e1e5ea;text-align:center;font-weight:900;color:var(--primary);"> ${Number.isFinite(r.readiness) ? (isElementary ? growthBaseLevel(r.readiness) : isMidEarly ? earlyBaseLevel(r.readiness) : r.readiness.toFixed(1)+'점') : '자료 부족'} </td> </tr>`).join('')} </tbody> </table> <div style="font-size:0.69em;color:#777;margin-top:6px;"> ※ ${noSchoolGradeMode ? (isElementary ? '초5~6은 학교 성적을 추정하지 않습니다. 현재 교과 기반은 관찰 자료이며, 객관자료가 없는 항목은 제외하고 심화·확장과 성장 DNA를 함께 해석합니다.' : '학교 시험 전에는 A/B 성취도를 추정하지 않습니다. 현재 교과 기반·객관자료·선행·심화로 초기 학업상태를 보고, 실제 학교 성적이 확보되면 성장진단형으로 전환합니다.') : '국어·수학·영어·과학의 교과 성취, 상대평가·모의, 선행·심화를 같은 표에서 봅니다. 교과 성취는 학기별 분포와 흐름을 표시하며 자료가 없는 항목은 0점으로 처리하지 않습니다.'} </div> </div>`; } const readinessDetailBox = document.getElementById('readinessDetailSummary'); if(readinessDetailBox){ readinessDetailBox.innerHTML = ` <div style="background:#fff;border:1px solid #e3e8ef;border-radius:9px;padding:9px 11px;"> <div style="font-weight:900;color:#333;font-size:0.88em;margin-bottom:6px;">📚 ${isElementary?'학업 성장 기반 세부':isMidEarly?'초기 학업 기반 세부':'현재 학업 준비도 세부'}</div> <div style="display:grid;grid-template-columns:repeat(3,1fr);gap:8px;text-align:center;"> <div style="background:#f8fbff;border-radius:7px;padding:7px;"> <div style="font-size:0.70em;color:#666;">${isElementary?'종합 성장 기반':isMidEarly?'종합 초기 기반':'종합 준비도'}</div> <div style="font-size:${earlyAcademic?'0.98em':'1.20em'};font-weight:900;color:var(--primary);">${earlyAcademic?overallLabel:overallAcademicReadiness.toFixed(1)+'점'}</div> </div> <div style="background:#f7fbff;border-radius:7px;padding:7px;"> <div style="font-size:0.70em;color:#666;">${isElementary?'수학·과학 탐색':'이공계열 준비도'}</div> <div style="font-size:${earlyAcademic?'0.98em':'1.20em'};font-weight:900;color:#1976d2;">${earlyAcademic?signalLevel(naturalReadiness):naturalReadiness.toFixed(1)+'점'}</div> </div> <div style="background:#fbf8ff;border-radius:7px;padding:7px;"> <div style="font-size:0.70em;color:#666;">${isElementary?'언어·사회 탐색':'인문계열 준비도'}</div> <div style="font-size:${earlyAcademic?'0.98em':'1.20em'};font-weight:900;color:#8e44ad;">${earlyAcademic?signalLevel(humanReadiness):humanReadiness.toFixed(1)+'점'}</div> </div> </div> <div style="font-size:0.71em;color:#666;margin-top:6px;text-align:center;"> ${earlyAcademic?'성적을 추정하지 않고 입력된 자료만으로 해석합니다. 없는 자료는 감점하지 않습니다.':`교과 데이터 ${gradeDataStage} · 실제 입력된 ${availableSemesterCount}개 학기 반영`} </div> </div>`; } survivalPenalty = learningPersistence < 70 ? 0.95 : 1.0; // 기존 C/D만으로 계산되던 생존지수 화면을 V26+ 지표로 교체 const gi=document.getElementById('gradeIndexArea'); if(gi){ gi.innerHTML = ` <div style="display:grid;grid-template-columns:1fr 1fr;gap:12px;margin-bottom:12px;"> <div class="analysis-box" style="padding:13px;"> <b>${isElementary?'탐색 방향 비교':'계열 비교'}</b><br> ${earlyAcademic ? `<span style="font-size:1.08em;font-weight:900;color:#1976d2;">${isElementary?'수학·과학':'이공'} ${signalLevel(naturalReadiness)}</span> <span style="margin:0 8px;color:#aaa;">|</span> <span style="font-size:1.08em;font-weight:900;color:#8e44ad;">${isElementary?'언어·사회':'인문'} ${signalLevel(humanReadiness)}</span>` : `<span style="font-size:1.35em;font-weight:900;color:#1976d2;">이공 ${naturalReadiness.toFixed(1)}</span> <span style="margin:0 8px;color:#aaa;">|</span> <span style="font-size:1.35em;font-weight:900;color:#8e44ad;">인문 ${humanReadiness.toFixed(1)}</span>`} <div style="font-size:0.78em;color:#555;margin-top:6px;">${streamGuide}</div> </div> <div class="analysis-box" style="padding:13px;"> <b>학업 지속력</b><br> <span style="font-size:1.55em;font-weight:900;color:var(--primary);">${learningPersistence.toFixed(1)}점</span> <span style="font-weight:bold;margin-left:8px;">[${persistenceLevel(learningPersistence)}]</span> <div style="font-size:0.78em;color:#555;margin-top:6px;">학습 흐름 유지·회복·재진입을 함께 봅니다.</div> </div> </div>`; } // [V26+] 학교 매칭은 실제 교과수준 + 모의수준 + 선행/심화 + APEX 역량을 함께 반영 // 주의: 아래 점수는 절대적 합격확률이 아니라 "현재 준비도 기준 학교 적합 점수"입니다. const schoolScore = ({grade, mock, advance, apex, persistence, noPersistencePenalty=false}) => { if(!Number.isFinite(grade)) return null; let score = weightedOptional([ [grade,0.42],[mock,0.20],[advance,0.20],[apex,0.13],[persistence,0.05] ]); if(!Number.isFinite(score)) return null; if(!noPersistencePenalty && learningPersistence < 70) score *= 0.96; return Math.max(0,Math.min(99.5,score)).toFixed(1); }; const apexScience = getMental(5.0,3.0,1.0,1.0); const apexAutonomy = getMental(2.0,4.5,1.5,2.0); const apexBalanced = getMental(2.5,3.0,2.0,2.5); const apexHuman = getMental(2.0,4.0,2.5,1.5); const schools = [ { name:"세종과학예술영재", score: schoolScore({ grade:gpaSciMath, mock:weightedOptional([[mockMath,0.55],[mockSci,0.45]]), advance:(mScale*0.55+sScale*0.45), apex:apexScience, persistence:learningPersistence }), gradeComponent:gpaSciMath, mockComponent:weightedOptional([[mockMath,0.55],[mockSci,0.45]]), advanceComponent:(mScale*0.55+sScale*0.45), apexComponent:apexScience, target:"92.5점", basis:"수학·과학 교과 수준, 수과 모의수준, 수학·과학 심화도, 탐구·주도 역량" }, { name:"충남과학고", score: schoolScore({ grade:gpaSciMath, mock:weightedOptional([[mockMath,0.55],[mockSci,0.45]]), advance:(mScale*0.50+sScale*0.50), apex:apexScience, persistence:learningPersistence }), gradeComponent:gpaSciMath, mockComponent:weightedOptional([[mockMath,0.55],[mockSci,0.45]]), advanceComponent:(mScale*0.50+sScale*0.50), apexComponent:apexScience, target:"90.0점", basis:"수학·과학 교과 수준과 심화도 중심" }, { name:"상산고 (의대 전국)", score: schoolScore({ grade:gpaSangsan, mock:weightedOptional([[mockMath,0.45],[mockSci,0.20],[mockEng,0.20],[mockKor,0.15]]), advance:(mScale*0.45+sScale*0.18+kScale*0.10+eScale*0.17+hScale*0.10), apex:apexBalanced, persistence:learningPersistence }), gradeComponent:gpaSangsan, mockComponent:weightedOptional([[mockMath,0.45],[mockSci,0.20],[mockEng,0.20],[mockKor,0.15]]), advanceComponent:(mScale*0.45+sScale*0.18+kScale*0.10+eScale*0.17+hScale*0.10), apexComponent:apexBalanced, target:"88.0점", basis:"주요 교과 수준, 수학 중심 선행·심화, 국어·영어 학업 수준, 종합 학업역량" }, { name:"북일고 (자사고)", score: schoolScore({ grade:gpaBukil, mock:meanNonNull([mockKor,mockMath,mockEng,mockSci]), advance:(mScale*0.30+kScale*0.15+eScale*0.22+sScale*0.18+hScale*0.15), apex:apexAutonomy, persistence:learningPersistence }), gradeComponent:gpaBukil, mockComponent:meanNonNull([mockKor,mockMath,mockEng,mockSci]), advanceComponent:(mScale*0.30+kScale*0.15+eScale*0.22+sScale*0.18+hScale*0.15), apexComponent:apexAutonomy, target:"85.0점", basis:"전과목 교과 수준, 모의수준, 국어·영어 심화, 자기주도형 선행 준비" }, { name:"공주사대부고", score: schoolScore({ grade:gpaBukil, mock:meanNonNull([mockKor,mockMath,mockEng,mockSci]), advance:advGeneral, apex:apexBalanced, persistence:learningPersistence }), gradeComponent:gpaBukil, mockComponent:meanNonNull([mockKor,mockMath,mockEng,mockSci]), advanceComponent:advGeneral, apexComponent:apexBalanced, target:"86.0점", basis:"전과목 교과 수준과 전체 학업 준비도" }, { name:"한일고 (자율학교)", score: schoolScore({ grade:gpaBukil, mock:meanNonNull([mockKor,mockMath,mockEng,mockSci]), advance:advGeneral, apex:apexAutonomy, persistence:learningPersistence }), gradeComponent:gpaBukil, mockComponent:meanNonNull([mockKor,mockMath,mockEng,mockSci]), advanceComponent:advGeneral, apexComponent:apexAutonomy, target:"87.5점", basis:"교과 수준, 자기주도, 생활관리, 종합 선행 준비" }, { name:"대전외고/세종국제", score: schoolScore({ grade:gpaForeign, mock:weightedOptional([[mockEng,0.55],[mockKor,0.30],[mockMath,0.10],[mockSci,0.05]]), advance:(eScale*0.52+kScale*0.23+hScale*0.15+mScale*0.06+sScale*0.04), apex:apexHuman, persistence:learningPersistence }), gradeComponent:gpaForeign, mockComponent:weightedOptional([[mockEng,0.55],[mockKor,0.30],[mockMath,0.10],[mockSci,0.05]]), advanceComponent:(eScale*0.52+kScale*0.23+hScale*0.15+mScale*0.06+sScale*0.04), apexComponent:apexHuman, target:"84.5점", basis:"영어 교과수준, 영어 심화도, 국어 독해·심화도, 국어·영어 모의수준, 인문 준비도" }, { name:"세종고 (의대 거점)", score: schoolScore({ grade:gpaBukil, mock:weightedOptional([[mockMath,0.40],[mockSci,0.25],[mockEng,0.20],[mockKor,0.15]]), advance:(mScale*0.36+sScale*0.23+kScale*0.08+eScale*0.18+hScale*0.15), apex:apexBalanced, persistence:learningPersistence }), gradeComponent:gpaBukil, mockComponent:weightedOptional([[mockMath,0.40],[mockSci,0.25],[mockEng,0.20],[mockKor,0.15]]), advanceComponent:(mScale*0.36+sScale*0.23+kScale*0.08+eScale*0.18+hScale*0.15), apexComponent:apexBalanced, target:"82.0점", basis:"교과수준, 수학·과학 중심 준비도, 국어·영어 심화 수준" }, { name:"지역우수 일반고", score: schoolScore({ grade:gpaBukil, mock:meanNonNull([mockKor,mockMath,mockEng,mockSci]), advance:advGeneral, apex:apexBalanced, persistence:learningPersistence, noPersistencePenalty:true }), gradeComponent:gpaBukil, mockComponent:meanNonNull([mockKor,mockMath,mockEng,mockSci]), advanceComponent:advGeneral, apexComponent:apexBalanced, target:"75.0점", basis:"교과수준과 전반적 학업 준비도" } ]; const schoolPageTitle=document.getElementById('schoolPageTitle'); const schoolPageIntro=document.getElementById('schoolPageIntro'); const schoolLegend=document.getElementById('schoolLegend'); const sGrid = document.getElementById('schoolGrid'); if (sGrid) sGrid.innerHTML = ""; // 초등 및 학교 성적이 없는 중1~2는 개별 학교 점수 대신 '학교 유형/진학 방향'을 탐색합니다. const evidenceCount = (...vals) => vals.filter(v=>Number.isFinite(v)).length; const evidenceNames = pairs => pairs.filter(x=>Number.isFinite(x[1])).map(x=>x[0]); const elemDirections = [ { key:'science', name:'과학·영재 탐구형', examples:'향후 탐색 예시: 영재학교·과학고·과학중점 환경', signal:weightedOptional([ [baseNatural,0.34],[mockNatural,0.18],[advanceNatural,0.18],[dnaFoundationNatural,0.20],[learningPersistence,0.10] ]), evidence:evidenceCount(baseNatural,mockNatural,advanceNatural), evidenceList:evidenceNames([['현재 수학·과학 기반',baseNatural],['객관 문제해결 자료',mockNatural],['수학·과학 심화·탐구',advanceNatural]]), next:'고난도 문제를 오래 붙드는지, 스스로 질문을 만들고 탐구를 확장하는지 확인' }, { key:'intense', name:'자사고·고강도 학업형', examples:'향후 탐색 예시: 자사고·자율학교·고강도 학업 환경', signal:weightedOptional([ [weightedOptional([[baseKor,0.2],[baseMath,0.3],[baseEng,0.2],[baseSci,0.3]]),0.34], [meanNonNull([mockKor,mockMath,mockEng,mockSci]),0.16], [advGeneral,0.15], [Math.max(0,Math.min(100,(avgs.B*0.55+avgs.D*0.45)*10)),0.20], [learningPersistence,0.15] ]), evidence:evidenceCount( weightedOptional([[baseKor,1],[baseMath,1],[baseEng,1],[baseSci,1]]), meanNonNull([mockKor,mockMath,mockEng,mockSci]), advGeneral ), evidenceList:evidenceNames([ ['전과목 현재 기반',weightedOptional([[baseKor,1],[baseMath,1],[baseEng,1],[baseSci,1]])], ['객관 문제해결 자료',meanNonNull([mockKor,mockMath,mockEng,mockSci])], ['심화·확장 경험',advGeneral] ]), next:'높은 학습량에서도 스스로 계획하고 생활 리듬을 유지하는지 확인' }, { key:'language', name:'외국어·국제 탐구형', examples:'향후 탐색 예시: 외고·국제고·언어·국제 탐구 환경', signal:weightedOptional([ [baseHuman,0.34],[mockHuman,0.18],[advanceHuman,0.18],[dnaFoundationHuman,0.20],[learningPersistence,0.10] ]), evidence:evidenceCount(baseHuman,mockHuman,advanceHuman), evidenceList:evidenceNames([['국어·영어 현재 기반',baseHuman],['언어 객관자료',mockHuman],['독해·언어·사회 확장',advanceHuman]]), next:'긴 글 독해, 자기 생각 표현, 사회·시사 주제에 대한 질문과 토론 경험을 확인' }, { key:'balanced', name:'균형 성장형', examples:'향후 탐색 예시: 우수 일반고·다양한 선택과목 환경', signal:weightedOptional([ [weightedOptional([[baseKor,1],[baseMath,1],[baseEng,1],[baseSci,1]]),0.40], [meanNonNull([mockKor,mockMath,mockEng,mockSci]),0.12], [advGeneral,0.12], [dnaBase100,0.21], [learningPersistence,0.15] ]), evidence:evidenceCount( weightedOptional([[baseKor,1],[baseMath,1],[baseEng,1],[baseSci,1]]), meanNonNull([mockKor,mockMath,mockEng,mockSci]), advGeneral ), evidenceList:evidenceNames([ ['국·수·영·과 현재 기반',weightedOptional([[baseKor,1],[baseMath,1],[baseEng,1],[baseSci,1]])], ['객관 문제해결 자료',meanNonNull([mockKor,mockMath,mockEng,mockSci])], ['심화·확장 경험',advGeneral] ]), next:'특정 진학 방향을 서두르기보다 1~2년간 어떤 강점이 반복되는지 확인' } ]; const renderDirectionCards = (directions, middle=false) => { const sorted=[...directions].sort((a,b)=>(b.signal??-1)-(a.signal??-1)); const topKey=sorted[0]?.key; const secondKey=sorted[1]?.key; return directions.map(d=>{ let label, color, text; const enough=d.evidence>=2; const minimal=d.evidence>=1; if(!minimal){ label=middle?'판단 유보':'아직 판단 유보'; color='#777'; text='현재 학업·객관·심화 자료가 충분하지 않아 방향을 정하지 않습니다. 경험과 실제 수행 자료를 먼저 확보합니다.'; }else if(d.key===topKey && enough && Number.isFinite(d.signal) && d.signal>=76){ label=middle?'우선 검토':'탐색 우선'; color='#2e7d32'; text=middle ? '현재 확보된 자료에서 이 방향의 신호가 가장 일관되게 나타납니다. 실제 학교 성적과 활동 자료가 추가되면 구체적인 학교 검토로 넘어갑니다.' : '현재 확보된 자료에서 이 방향의 신호가 가장 일관되게 나타납니다. 특정 학교 합격 가능성이 아니라 앞으로 경험을 우선 확장해 볼 방향입니다.'; }else if((d.key===topKey || d.key===secondKey) && enough && Number.isFinite(d.signal) && d.signal>=66){ label='가능성 확인'; color='#1565c0'; text='관련 신호가 보이지만 한 방향으로 확정할 단계는 아닙니다. 실제 수행 장면과 추가 객관자료로 반복 여부를 확인합니다.'; }else if(enough){ label=middle?'자료 더 확인':'경험 더 필요'; color='#8a6d1f'; text='일부 관련 자료는 있으나 현재 강점이 반복적으로 확인되지는 않았습니다. 다음 경험에서 반응을 더 관찰합니다.'; }else{ label=middle?'자료 더 필요':'경험 더 필요'; color='#8a6d1f'; text='한 종류의 자료만으로는 방향을 판단하지 않습니다. 다른 형태의 실제 경험이나 객관자료를 추가합니다.'; } const ev=d.evidenceList.length ? d.evidenceList.join(' · ') : '추가 자료 필요'; return `<div class="school-card" style="text-align:left;border-left:5px solid ${color};"> <div class="status-badge" style="display:inline-block;background:#f4f6f8;color:${color};">${label}</div> <div style="font-weight:900;color:#222;font-size:1.08em;margin-top:5px;">${d.name}</div> <div style="font-size:0.76em;color:#777;margin-top:2px;">${d.examples}</div> <div style="font-size:0.80em;color:#555;line-height:1.5;margin-top:8px;">${text}</div> <div style="margin-top:8px;padding-top:7px;border-top:1px solid #eee;font-size:0.74em;line-height:1.5;color:#666;"> <b>현재 확인된 근거 ${d.evidence}종</b> · ${ev}<br> <b>다음 확인</b> · ${d.next} </div> </div>`; }).join(''); }; if(isElementary){ if(schoolPageTitle) schoolPageTitle.innerHTML='🏫 진학 환경 방향 탐색'; if(schoolPageIntro) schoolPageIntro.innerHTML='초5~6에서는 특정 학교를 점수로 매칭하지 않습니다. <b>어떤 학교 환경을 앞으로 경험해 볼 가치가 있는지</b>를 4가지 방향으로 탐색합니다. 점수가 높더라도 학업·객관·심화 자료 중 서로 다른 근거가 충분하지 않으면 상위 판정을 주지 않습니다.'; if(schoolLegend) schoolLegend.innerHTML='탐색 우선 · 가능성 확인 · 경험 더 필요 · 아직 판단 유보'; if(sGrid) sGrid.innerHTML=renderDirectionCards(elemDirections,false); }else if(isMidEarly){ const midDirections=elemDirections.map(d=>({ ...d, examples:d.key==='science' ? '향후 검토 유형: 영재학교·과학고·과학중점' : d.key==='intense' ? '향후 검토 유형: 자사고·자율학교·고강도 학업 환경' : d.key==='language' ? '향후 검토 유형: 외고·국제고·언어·국제 탐구 환경' : '향후 검토 유형: 우수 일반고·다양한 선택과목 환경' })); if(schoolPageTitle) schoolPageTitle.innerHTML='🏫 중1·2 진학 방향 초기 탐색'; if(schoolPageIntro) schoolPageIntro.innerHTML='학교 시험 전이거나 실제 성적 자료가 아직 없는 중1~2는 개별 학교 점수를 표시하지 않습니다. <b>현재 교과 기반·객관평가·선행·심화·APEX 성장 신호</b>를 바탕으로 학교 유형을 먼저 좁히고, 첫 학교 성적 이후 구체적인 학교 준비도로 전환합니다.'; if(schoolLegend) schoolLegend.innerHTML='우선 검토 · 가능성 확인 · 자료 더 필요 · 판단 유보'; if(sGrid) sGrid.innerHTML=renderDirectionCards(midDirections,true); }else{ if(schoolPageTitle) schoolPageTitle.innerHTML='🏫 주요 고교 현재 준비도'; if(schoolPageIntro) schoolPageIntro.innerHTML='실제 학교 성적이 확보된 중1~3은 <b>교과 수준·객관평가·과목별 선행·심화·APEX 학업역량</b>을 함께 보고 학교별 현재 준비 상태와 보완 방향을 확인합니다. 합격 확률이 아니라 상담용 준비도입니다.'; if(schoolLegend) schoolLegend.innerHTML='<span class="gap-plus">현재 준비도 충분</span> · <span style="color:#1565c0;">도전 가능·보완 필요</span> · <span class="gap-minus">준비도 추가 보완 필요</span>'; schools.forEach(s => { if(s.score===null || s.score===undefined){ sGrid.innerHTML += `<div class="school-card" style="border-left:5px solid #9e9e9e;"> <div style="font-weight:900;font-size:1.05em;">${s.name}</div> <div class="status-badge" style="background:#eeeeee;color:#555;">성적 자료 추가 필요</div> <div style="font-size:0.82em;color:#666;margin-top:8px;">현재 입력된 자료만으로는 이 학교의 정량 준비도를 계산하기 어렵습니다.</div> </div>`; return; } let sc = parseFloat(s.score); let tg = parseFloat(s.target.replace('점','')); let diff = (sc - tg).toFixed(1); let badge = (diff >= 2.0) ? 'stable' : (diff >= -3.0 ? 'challenge' : 'caution'); let badgeTxt = badge === 'stable' ? '현재 준비도 충분' : (badge === 'challenge' ? '도전 가능·보완 필요' : '준비도 추가 보완 필요'); let gapClass = diff >= 0 ? 'gap-plus' : 'gap-minus'; let gapStr = diff > 0 ? `+${diff}` : `${diff}`; sGrid.innerHTML += `<div class="school-card ${badge==='stable' ? 'gold' : ''}" style="text-align:left;"> <div class="status-badge badge-${badge}" style="display:inline-block;">${badgeTxt}</div> <div style="font-weight:900; color:#222; font-size:1.05em; margin-top:5px;">${s.name}</div> <div class="school-score" style="margin:3px 0 1px 0;">${s.score}점</div> <div class="target-avg">권장 평균: ${s.target}</div> <div class="gap-indicator ${gapClass}" style="margin-top:2px;">현재 준비 차이 ${gapStr}점</div> <div style="margin-top:7px;padding-top:7px;border-top:1px solid #eee;font-size:0.76em;line-height:1.45;color:#555;"> <b style="color:#333;">반영 요소</b> · ${s.basis || "교과·객관평가·선행·APEX 역량"} </div> </div>`; }); } // 진로·탐구·학생부 + 개인 실행전략 const domainScores = {A:avgs.A, B:avgs.B, C:avgs.C, D:avgs.D}; const domainLabel = {A:'탐구', B:'자기주도', C:'회복·정서', D:'학습습관'}; const sortedDomains = Object.entries(domainScores).sort((a,b)=>b[1]-a[1]); const strongest = sortedDomains[0][0]; const weakest = sortedDomains[sortedDomains.length-1][0]; const interestText = (document.getElementById('s0_0')?.value || '').trim(); const talentText = (document.getElementById('inTalent')?.value || '').trim(); const hobbyText = (document.getElementById('inHobby')?.value || '').trim(); const longExpText = (document.getElementById('inLongExperience')?.value || '').trim(); const praiseText = (document.getElementById('inPraise')?.value || '').trim(); const goalText = (document.getElementById('s0_3')?.value || '').trim(); const gradeName = info.gradeTxt || ''; const streamKor = info.stream==='NATURAL' ? '이공·의학' : (info.stream==='HUMAN' ? '인문·사회' : '융합'); const careerByStrength = { A:'원리·문제 발견형 강점이 보입니다. 진로를 직업명 하나로 빨리 확정하기보다, 어떤 문제를 깊게 파고드는지부터 좁혀가는 방식이 맞습니다.', B:'목표를 구조화하고 스스로 계획하는 강점이 보입니다. 프로젝트 기획·경영·연구 설계처럼 목표와 과정을 연결하는 경험이 진로 확인에 도움이 됩니다.', C:'사람·상황을 조율하고 다시 회복하는 힘을 확인할 필요가 있습니다. 사람을 이해하고 협력하는 활동 속에서 진로 적합성이 더 잘 드러날 수 있습니다.', D:'꾸준히 실행하고 반복하는 강점이 보입니다. 실제 결과물이 남는 제작·실험·훈련형 경험을 통해 진로를 확인하는 방식이 적합합니다.' }; const careerRiskByWeak = { A:'다만 관심 분야를 교과 질문으로 바꾸는 경험이 부족하면 진로가 막연해질 수 있습니다.', B:'다만 부모·학원 계획을 따르는 것과 스스로 선택하는 것을 구분하는 점검이 필요합니다.', C:'다만 실패나 경쟁 뒤 회복 속도가 느리다면 진로 선택도 “잘할 수 있는 것”보다 “실패하지 않을 것”으로 좁아질 수 있습니다.', D:'다만 관심은 많아도 꾸준한 실행 기록이 부족하면 진로가 말로만 남을 수 있습니다.' }; const experienceParts = [ talentText ? `<b>특기</b> ${talentText}` : '', hobbyText ? `<b>취미·몰입</b> ${hobbyText}` : '', longExpText ? `<b>오래 한 경험</b> ${longExpText}` : '', praiseText ? `<b>주변 평가</b> ${praiseText}` : '' ].filter(Boolean); const experienceBox = document.getElementById('experienceProfileBox'); if(experienceBox){ experienceBox.innerHTML = experienceParts.length ? `<b>학생 개인 경험 프로필</b><br>${experienceParts.join(' · ')}<br><span style="font-size:0.78em;color:#666;">이 경험을 진로·교과 질문·주제탐구로 연결해 학생마다 다른 결과물을 설계합니다.</span>` : `<b>학생 개인 경험 프로필</b><br><span style="color:#777;">특기·취미·오래 한 경험을 입력하면 진로와 주제탐구 전략이 더 개인화됩니다.</span>`; } const experienceSeed = longExpText || hobbyText || talentText || interestText || '현재 관심 활동'; const careerHtml = ` <b style="font-size:1.05em;">① 진로 방향 — ${streamKor} 계열을 기준으로 ‘경험으로 확인’</b><br> ${interestText ? `현재 관심 표현: <b>${interestText}</b><br>` : ''} ${goalText ? `현재 목표 표현: <b>${goalText}</b><br>` : ''} ${careerByStrength[strongest]} ${careerRiskByWeak[weakest]}<br> <span style="color:#555;"><b>다음 행동:</b> 직업명을 하나 더 찾기보다 <b>${experienceSeed}</b>에서 “내가 직접 확인해보고 싶은 질문 1개”를 정합니다.</span>`; let inquiryLevel, inquiryAction; if(avgs.A>=8 && overallAcademicReadiness>=75){ inquiryLevel='심화 확장형'; inquiryAction='교과 개념 하나를 대학 기초 개념·최근 연구의 한계·반례와 연결해 “왜 기존 설명만으로 충분하지 않은가?”까지 확장합니다.'; }else if(avgs.A>=6){ inquiryLevel='교과 연결형'; inquiryAction='수업에서 배운 개념 하나를 실제 현상이나 진로 관심과 연결해, 질문 → 근거 찾기 → 비교 → 나의 결론 순서로 짧은 탐구를 완성합니다.'; }else{ inquiryLevel='질문 형성형'; inquiryAction='거창한 보고서보다 수업 중 “왜?”가 생긴 개념 하나를 고르고, 자료 2개를 비교해 1쪽짜리 탐구부터 완성합니다.'; } const inquiryHtml = ` <b style="font-size:1.05em;">② 주제탐구 — ${inquiryLevel}</b><br> ${inquiryAction}<br> <span style="color:#555;"><b>주제 선정 기준:</b> 진로 이름을 억지로 붙이기보다 <b>교과 개념 + ${experienceSeed} + 실제 질문</b>이 만나는 지점을 우선합니다.</span>`; let recordFocus=[]; if(avgs.B<6.5) recordFocus.push('학생이 직접 선택한 이유와 계획을 말로 남기기'); if(avgs.D<6.5) recordFocus.push('한 번의 큰 활동보다 수업·수행에서 반복 기록 만들기'); if(avgs.A<6.5) recordFocus.push('활동 나열보다 질문이 어떻게 깊어졌는지 보여주기'); if(avgs.C<6.5) recordFocus.push('실패·수정·재도전 과정을 결과와 함께 남기기'); if(recordFocus.length===0) recordFocus.push('강점 활동을 교과별로 흩뜨리지 말고 하나의 성장 흐름으로 연결하기'); const recordHtml = ` <b style="font-size:1.05em;">③ 생기부 관리 — 기록보다 ‘수업 안에서 증거 만들기’</b><br> ${recordFocus.map((x,i)=>`${i+1}. ${x}`).join('<br>')}<br> <span style="color:#555;"><b>관리 원칙:</b> 활동 개수를 늘리기보다 <b>질문 → 행동 → 결과 → 수정 → 다음 질문</b>의 흐름이 학생의 실제 수업·수행평가·교내 탐구에서 보이도록 관리합니다.</span>`; const actionOutlook = threeAxisOutlook((totalRaw/240)*100, overallAcademicReadiness, learningPersistence); document.getElementById('careerStrategyBox').innerHTML = careerHtml; document.getElementById('inquiryStrategyBox').innerHTML = inquiryHtml; document.getElementById('recordStrategyBox').innerHTML = recordHtml; const profileBox = document.getElementById('strategyProfileSummary'); if(profileBox){ profileBox.innerHTML = ` <b>진단 기반 전략 프로필</b> · 강점 <b>${domainLabel[strongest]}</b> / 우선 보완 <b>${domainLabel[weakest]}</b> / 현재 준비도 <b>${readinessLevel(overallAcademicReadiness)}</b> / 학업 지속력 <b>${persistenceLevel(learningPersistence)}</b><br> <span style="color:#555;">${actionOutlook.text}</span>`; } const deliverables = [ '진로: 관심 분야를 확인할 경험 또는 질문 1개', '탐구: 교과 개념과 연결된 완성 결과물 1개' ]; if(avgs.B<6.5) deliverables.push('학생부: 학생이 직접 선택한 이유·계획 기록'); else if(avgs.A<6.5) deliverables.push('학생부: 질문이 깊어진 과정 기록'); else deliverables.push('학생부: 활동 간 연결성과 다음 질문 기록'); const dBox = document.getElementById('deliverableBox'); if(dBox){ dBox.innerHTML = `<b>이번 단계에서 남길 핵심 산출물</b><br>${deliverables.map((x,i)=>`${i+1}. ${x}`).join('<br>')}`; } // 4주 실행 로드맵: 약점 조합에 따라 실제 행동을 다르게 제시 const actionNotes=[]; if(ppNow.help<6) actionNotes.push('막힌 문제를 혼자 오래 끌지 말고 48시간 안에 질문 1개 만들기'); if(ppNow.reentry<6) actionNotes.push('흐름이 깨진 날 100% 복구 대신 20분 복귀 과제부터 시작하기'); if(ppNow.errorTol<6) actionNotes.push('완벽하게 끝내기보다 80% 완성 후 제출·수정하는 연습하기'); if(avgs.D<6.5) actionNotes.push('하루 핵심 과제 3개만 정하고 완료 여부를 매일 기록하기'); if(avgs.B<6.5) actionNotes.push('주간 계획 중 최소 1개는 학생이 직접 선택하고 이유까지 적기'); if(avgs.A<6.5) actionNotes.push('매주 교과 질문 1개를 정해 자료 2개 비교하기'); if(actionNotes.length<3) actionNotes.push('한 주에 한 번 배운 내용을 1분 설명으로 정리하기'); if(actionNotes.length<3) actionNotes.push('주간 말미에 잘된 행동 1개와 바꿀 행동 1개를 기록하기'); document.getElementById('personalActionSummary').innerHTML = ` <b>현재 상담 핵심: ${actionOutlook.title}</b><br> 강점은 <b>${domainLabel[strongest]}</b>, 우선 보완 영역은 <b>${domainLabel[weakest]}</b>입니다. 현재 학업 준비도와 학업 지속력을 함께 보아, 다음 4주는 “더 많이 하기”보다 <b>성장 가능성을 실제 행동으로 확인하는 기간</b>으로 운영합니다.`; const priorityActions = actionNotes.slice(0,3); const priorityBox = document.getElementById('priorityActionBox'); if(priorityBox){ priorityBox.innerHTML = ` <div style="display:grid;grid-template-columns:repeat(3,1fr);gap:7px;"> ${priorityActions.map((x,i)=>` <div style="background:#fff;border:1px solid #e2e7ee;border-radius:8px;padding:8px 9px;font-size:0.74em;line-height:1.4;"> <b style="color:var(--primary);">우선순위 ${i+1}</b><br>${x} </div>`).join('')} </div>`; } const weekRows = [ {week:'1주',action:`${experienceSeed}에서 진로 질문 1개 확정 + 왜 궁금한지 학생 말로 정리`,output:'질문 카드 1장 / 관심 이유 3문장',check:'학생이 스스로 설명 가능'}, {week:'2주',action:'교과 개념과 연결해 자료 2개 비교·정리',output:'자료 비교표 + 핵심 근거 3개',check:'교과 개념이 실제로 사용됨'}, {week:'3주',action:'탐구 결과물 완성 + 반론·한계 또는 수정점 1개 추가',output:'1~2쪽 탐구 결과물 / 발표 초안',check:'학생 판단이 문장으로 남음'}, {week:'4주',action:`행동 교정 확인: ${priorityActions[0] || '주간 행동 1개 수정'} + 다음 질문 연결`,output:'AAR 1장 / 다음 행동 1개',check:'무엇이 바뀌었는지 확인'} ]; const fourWeekBody = document.getElementById('fourWeekPlanBody'); if(fourWeekBody){ fourWeekBody.innerHTML = weekRows.map(r=>` <tr> <td style="padding:6px;border:1px solid #dfe5ec;font-weight:900;text-align:center;">${r.week}</td> <td style="padding:6px;border:1px solid #dfe5ec;line-height:1.4;">${r.action}</td> <td style="padding:6px;border:1px solid #dfe5ec;line-height:1.4;">${r.output}</td> <td style="padding:6px;border:1px solid #dfe5ec;line-height:1.4;">${r.check}</td> </tr>`).join(''); } const nextConsult = document.getElementById('nextConsultBox'); if(nextConsult){ nextConsult.innerHTML = ` <b>다음 상담에서 확인할 것</b><br> ① 관심 분야가 더 구체적인 질문으로 바뀌었는가 · ② 탐구 결과물에 학생의 판단이 들어갔는가 · ③ ${domainLabel[weakest]} 영역의 행동이 실제로 한 가지라도 달라졌는가 · ④ 학습 흐름이 깨졌을 때 다시 돌아오는 시간이 짧아졌는가`; } window.scrollTo({ top: document.getElementById('p1').offsetTop, behavior: 'smooth' }); } setTodayIfEmpty(); </script> <script> /* ===== SG 플랫폼 연동 브리지 (APEX V26) ===== */ (function(){ 'use strict'; var MODE='admin'; // 'admin' | 'student' var NOSAVE=false; // 복원 후 리포트 재생성 때는 저장 신호를 보내지 않음 var GRADES={elem:1,mid12:1,mid3:1}; function $(id){return document.getElementById(id);} function post(m){try{window.parent.postMessage(m,'*');}catch(e){}} function todayStr(){var d=new Date();return new Date(d.getTime()-d.getTimezoneOffset()*60000).toISOString().slice(0,10);} function gradeKey(g){g=String(g||'');if(GRADES[g])return g;if(/초/.test(g))return 'elem';if(/중\s*3/.test(g))return 'mid3';if(/중\s*[12]/.test(g))return 'mid12';return '';} function inputRoot(){return document.querySelector('.container > .no-print')||document.body;} function syncSpan(el){var n=el.nextElementSibling;if(n&&n.tagName==='SPAN')n.innerText=el.value;} /* ── 입력값 스냅샷 ── */ function snapshot(){ var root=inputRoot(), f={}; root.querySelectorAll('input[id],select[id],textarea[id]').forEach(function(el){ if(el.type==='radio')return; f[el.id]=(el.type==='checkbox')?!!el.checked:el.value; }); var q=[],qd=[]; document.querySelectorAll('.q-val').forEach(function(el){q.push(el.value);qd.push(el.dataset.domain||'');}); var p={}; document.querySelectorAll('.pressure-val').forEach(function(el){p[el.dataset.pid]=el.value;}); var sess=document.querySelector('input[name="sessionType"]:checked'); var mode=document.querySelector('input[name="operationMode"]:checked'); return {v:'V26',session:sess?sess.value:'1',mode:mode?mode.value:'sejong',fields:f,q:q,qd:qd,p:p}; } /* ── 복원 ── */ function setRadio(name,val){ var r=document.querySelector('input[name="'+name+'"][value="'+val+'"]'); if(r){r.checked=true;return true;}return false; } function fillFields(f){ Object.keys(f||{}).forEach(function(id){ var el=$(id);if(!el)return; if(el.type==='checkbox')el.checked=!!f[id]; else{ if(el.tagName==='SELECT'){ var ok=false;for(var i=0;i<el.options.length;i++){if(el.options[i].value===String(f[id])){ok=true;break;}} if(!ok)return; } el.value=f[id]; } }); } function restore(s){ if(!s)return; if(s.session)setRadio('sessionType',s.session); if(s.mode)setRadio('operationMode',s.mode); try{if(typeof toggleSession==='function')toggleSession();}catch(e){console.warn(e);} var g=$('inGrade'); if(g&&s.fields&&s.fields.inGrade){ g.value=s.fields.inGrade; try{renderQuestions();}catch(e){} try{renderGradeSelects();}catch(e){} try{updateAcademicInputMode();}catch(e){} } fillFields(s.fields); var qs=document.querySelectorAll('.q-val'); // 도메인 순서가 같으면 인덱스로, 아니면 도메인별 순서로 복원 var byDom={}; (s.q||[]).forEach(function(v,i){var d=(s.qd||[])[i]||'';(byDom[d]=byDom[d]||[]).push(v);}); var cnt={}; qs.forEach(function(el,i){ var d=el.dataset.domain||''; var k=cnt[d]||0;cnt[d]=k+1; var v=(byDom[d]&&byDom[d][k]!==undefined)?byDom[d][k]:(s.q||[])[i]; if(v!==undefined){el.value=v;syncSpan(el);} }); document.querySelectorAll('.pressure-val').forEach(function(el){ var v=(s.p||{})[el.dataset.pid];if(v!==undefined){el.value=v;syncSpan(el);} }); setTimeout(function(){fillFields(s.fields);},60); } function setReadonly(on){ inputRoot().querySelectorAll('input,select,textarea').forEach(function(el){el.disabled=!!on;}); } /* ── 결과 요약 (관리자 저장용) ── */ function avgs(){ var su={A:0,B:0,C:0,D:0},co={A:0,B:0,C:0,D:0}; document.querySelectorAll('.q-val').forEach(function(el){var d=el.dataset.domain;if(su[d]===undefined)return;su[d]+=parseInt(el.value,10);co[d]++;}); var o={};['A','B','C','D'].forEach(function(d){o[d]=co[d]?+(su[d]/co[d]).toFixed(2):0;}); return o; } function txt(id){var e=$(id);return e?(e.innerText||e.textContent||'').trim():'';} function buildResult(){ var snap=snapshot(), f=snap.fields||{}; var a=avgs(); var gSel=$('inGrade'); var gTxt=gSel&&gSel.selectedIndex>=0?gSel.options[gSel.selectedIndex].text.split(' ')[0]:''; var raw=Math.round((a.A+a.B+a.C+a.D)*6); var s0={};for(var i=0;i<16;i++){var el=$('s0_'+i);if(el)s0['q'+i]=el.value;} return {ver:'V26',session:snap.session,date:f.inDate||'',school:f.inSchool||'',name:f.inName||'', gradeVal:f.inGrade||'',gradeTxt:gTxt,stream:String(f.inStream||'').toUpperCase(),style:f.inStyle||'', avgs:a,totalRaw:raw,totalAdj:raw,tier:txt('resTier'),totalText:txt('resTotal'), mode:snap.mode,s0:s0,snapshot:snap}; } /* ── 기존 함수 감싸기 ── */ if(typeof window.generateReport==='function'){ var _gen=window.generateReport; window.generateReport=function(){ var r=_gen.apply(this,arguments); if(!NOSAVE&&MODE==='admin'){post({type:'APEX_SAVE',result:buildResult()});} return r; }; } var _origPrint=window.print.bind(window); window.print=function(){ try{ var f=snapshot().fields||{};var dt=String(f.inDate||'').replace(/-/g,''); var sess=(snapshot().session||'1'); post({type:'APEX_SET_TITLE',title:'APEX 학업역량 정밀진단_'+(f.inName||'학생')+'_'+sess+'차진단'+(dt?('_'+dt):'')}); }catch(e){} setTimeout(_origPrint,120); }; window.addEventListener('afterprint',function(){post({type:'APEX_PRINT_DONE'});}); /* ── 학생 작성 모드 ── */ function enterStudentMode(){ MODE='student'; var st=document.createElement('style'); st.textContent='.sm-hide{display:none!important}body{background:#f5f7fb}.container{padding-bottom:90px!important}'+ '#smBar{position:fixed;left:0;right:0;bottom:0;z-index:9999;background:#fff;border-top:1px solid #dfe5ef;padding:10px 12px;display:flex;gap:8px;box-shadow:0 -4px 14px rgba(0,0,0,.08)}'+ '#smBar button{flex:1;border:none;border-radius:10px;padding:13px 8px;font-size:15px;font-weight:800;cursor:pointer}'+ '@media print{#smBar{display:none!important}}'; document.head.appendChild(st); var root=inputRoot(); var h2=root.querySelector('h2');if(h2)h2.innerText='🎯 APEX 학업역량 진단 (학생 작성)'; var hb=root.querySelector('button[onclick="printStudentQuestionnaire()"]');if(hb)hb.classList.add('sm-hide'); var gb=root.querySelector('button[onclick="generateReport()"]');if(gb)gb.classList.add('sm-hide'); var om=document.querySelector('input[name="operationMode"]'); if(om){var box=om.closest('div[style*="grid-column"]');if(box)box.classList.add('sm-hide');} var bar=document.createElement('div');bar.id='smBar'; bar.innerHTML='<button id="smDraft" style="background:#eef1fb;color:#3b5bdb">💾 임시저장</button><button id="smSubmit" style="background:#3b5bdb;color:#fff">✅ 제출하기</button>'; document.body.appendChild(bar); $('smDraft').onclick=function(){post({type:'APEX_STUDENT_SUBMIT',final:false,snapshot:snapshot(),result:buildResult()});}; $('smSubmit').onclick=function(){post({type:'APEX_STUDENT_SUBMIT',final:true,snapshot:snapshot(),result:buildResult()});}; } window.addEventListener('message',function(e){ var d=e.data||{}; if(d.type==='APEX_INIT_STUDENT'){ try{ if(d.mode==='student'&&MODE!=='student')enterStudentMode(); var n=$('inName');if(n)n.value=d.name||''; var sc=$('inSchool');if(sc)sc.value=d.school||''; var dt=$('inDate');if(dt)dt.value=todayStr(); var gk=gradeKey(d.grade),g=$('inGrade'); if(g&&gk){g.value=gk;try{renderQuestions();renderGradeSelects();updateAcademicInputMode();}catch(_){}} }catch(err){console.warn('APEX init',err);} }else if(d.type==='APEX_RESTORE'){ try{ NOSAVE=true; if(d.mode==='student'&&MODE!=='student')enterStudentMode(); restore(d.snapshot); if(d.name&&!$('inName').value)$('inName').value=d.name; if(d.school&&!$('inSchool').value)$('inSchool').value=d.school; if(d.hideInputs){inputRoot().style.display='none';} if(d.readonly){setReadonly(true);var _b=$('smBar');if(_b&&_b.parentNode)_b.parentNode.removeChild(_b);} if(d.report||d.print){ setTimeout(function(){ try{window.generateReport();}catch(err){console.warn('리포트 생성 오류',err);} NOSAVE=false; if(d.print){setTimeout(function(){window.print();},1300);} },150); }else{NOSAVE=false;} post({type:'APEX_RESTORED'}); }catch(err){NOSAVE=false;console.warn('APEX restore',err);post({type:'APEX_RESTORE_ERROR',message:String(err&&err.message||err)});} }else if(d.type==='APEX_DO_PRINT'){ window.print(); }else if(d.type==='APEX_GET_SNAPSHOT'){ post({type:'APEX_SNAPSHOT',snapshot:snapshot(),result:buildResult()}); } }); post({type:'APEX_READY'}); })(); </script> </body></html>
<!DOCTYPE html> <!-- saved from url=(0174)file:///C:/Users/user/Downloads/APEX_%ED%95%99%EB%B6%80%EB%AA%A8_%EC%84%B1%EC%9E%A5%EA%B4%80%EC%B0%B0%EC%A7%84%EB%8B%A8_V29_%ED%95%9C%EA%B8%80%EC%99%84%EC%84%B1%EB%B3%B8.html --> <html lang="ko"><head><meta http-equiv="Content-Type" content="text/html; charset=UTF-8"> <meta name="viewport" content="width=device-width,initial-scale=1"> <title>APEX 학부모 성장관찰 진단 V29</title> <style> :root{--p:#1A237E;--b:#1A73E8;--g:#2E7D32;--o:#b26a00;--r:#b3261e;--bg:#f5f7fb;--bd:#dfe5ef;--mut:#6b7280} *{box-sizing:border-box} body{margin:0;background:var(--bg);font-family:Pretendard,'Noto Sans KR',Arial,sans-serif;color:#263238} .wrap{max-width:980px;margin:auto;padding:16px} .card{background:#fff;border:1px solid var(--bd);border-radius:16px;padding:20px;margin-bottom:14px;box-shadow:0 8px 22px rgba(20,35,80,.06)} h1{color:var(--p);margin:0 0 6px} h2{font-size:19px;color:var(--p);border-left:6px solid var(--b);padding-left:10px;margin-top:4px} h3{font-size:15px;color:#333;margin:12px 0 6px} .sub{font-size:13px;color:var(--mut);line-height:1.55} .notice{background:#f8fbff;border-left:5px solid var(--b);padding:12px;border-radius:10px;font-size:13px;line-height:1.6} .notice.gold{background:#fffaf0;border-left-color:#d98b1f} .grid{display:grid;grid-template-columns:repeat(auto-fit,minmax(210px,1fr));gap:10px} .field{display:flex;flex-direction:column;gap:5px} .field label{font-size:12px;font-weight:800;color:var(--p)} input,select,textarea{width:100%;padding:9px;border:1px solid #cfd8e3;border-radius:8px;font:inherit;background:#fff} textarea{min-height:66px;resize:vertical} .checks{display:flex;flex-wrap:wrap;gap:7px;margin-top:7px} .ck{border:1px solid var(--bd);border-radius:20px;padding:6px 10px;font-size:12px;background:#fff} .ck input{width:auto;margin-right:4px} .q{padding:11px 0;border-bottom:1px solid #eef1f5} .q:last-child{border-bottom:0} .q b{font-size:13px;line-height:1.5} .small{font-size:11px;color:#777;line-height:1.45;margin-top:4px} .scaleRow{display:grid;grid-template-columns:1fr 180px;gap:12px;align-items:center;margin-top:7px} .scaleRow select{padding:7px} .btn{border:0;border-radius:10px;padding:11px 16px;font-weight:900;cursor:pointer} .primary{background:var(--p);color:#fff}.light{background:#eef3ff;color:var(--p)} .result{display:none} .box{border:1px solid var(--bd);border-radius:12px;padding:12px;margin:8px 0} .pill{display:inline-block;border-radius:20px;padding:4px 9px;font-size:11px;font-weight:900;margin:2px;background:#eef3ff;color:var(--p)} .pill.good{background:#edf7ee;color:#236b2a}.pill.watch{background:#fff6df;color:#8a5a00}.pill.check{background:#fff0ef;color:#9f241f} .reportGrid{display:grid;grid-template-columns:repeat(3,1fr);gap:8px;margin:10px 0} .metric{border:1px solid var(--bd);border-radius:10px;padding:10px;text-align:center;background:#fafbfe} .metric .k{font-size:11px;color:#666}.metric .v{font-size:18px;font-weight:900;color:var(--p);margin-top:3px} @media(max-width:680px){.wrap{padding:9px}.scaleRow{grid-template-columns:1fr}.reportGrid{grid-template-columns:1fr}} @media print{.noPrint{display:none!important}body{background:#fff}.card{box-shadow:none;border:none;break-inside:avoid}.wrap{max-width:none;padding:0}} </style> </head> <body> <div class="wrap"> <div class="card noPrint"> <h1>APEX 학부모 성장관찰 진단 V29</h1> <div class="sub">학부모 장기 관찰 기반 경험 · 강점 · 기대 · 회복 진단</div> <div class="notice gold" style="margin-top:12px"> <b>성적표에는 나오지 않지만, 오랜 관찰자인 부모님만 알고 있는 아이의 모습이 있습니다.</b><br> 이 진단은 부모의 판단을 ‘정답’으로 삼지 않습니다. 아이가 반복해서 보여준 행동, 성장의 장면, 압박을 받을 때의 반응과 회복 과정을 학생 진단과 함께 비교해 <b>숨은 강점·미경험 영역·관찰 차이</b>를 찾기 위한 자료입니다. </div> </div> <div class="card noPrint"> <h2>기본 정보</h2> <div class="grid"> <div class="field"><label>학생명</label><input id="name"></div> <div class="field"><label>학교</label><input id="school"></div> <div class="field"><label>학년</label><input id="grade"></div> <div class="field"><label>작성자와 학생 관계</label><select id="relation"><option>어머니</option><option>아버지</option><option>보호자</option><option>기타</option></select></div> <div class="field"><label>작성일</label><input id="date" type="date"></div> </div> </div> <div class="card noPrint"> <h2>1. 경험 인벤토리</h2> <div class="sub">활동의 화려함보다 <b>얼마나 오래 했는지, 스스로 계속했는지, 몰입했는지</b>를 봅니다.</div> <div class="q"><b>P1. 아이가 지금까지 경험한 활동을 모두 선택해주세요.</b><div id="actChecks" class="checks"><label class="ck"><input type="checkbox" name="activities" value="수학">수학</label><label class="ck"><input type="checkbox" name="activities" value="과학">과학</label><label class="ck"><input type="checkbox" name="activities" value="국어·글쓰기">국어·글쓰기</label><label class="ck"><input type="checkbox" name="activities" value="영어·외국어">영어·외국어</label><label class="ck"><input type="checkbox" name="activities" value="사회·역사">사회·역사</label><label class="ck"><input type="checkbox" name="activities" value="정보·AI">정보·AI</label><label class="ck"><input type="checkbox" name="activities" value="피아노">피아노</label><label class="ck"><input type="checkbox" name="activities" value="바이올린·현악">바이올린·현악</label><label class="ck"><input type="checkbox" name="activities" value="노래·작곡">노래·작곡</label><label class="ck"><input type="checkbox" name="activities" value="밴드">밴드</label><label class="ck"><input type="checkbox" name="activities" value="미술·디자인">미술·디자인</label><label class="ck"><input type="checkbox" name="activities" value="사진·공예">사진·공예</label><label class="ck"><input type="checkbox" name="activities" value="레고·조립·만들기">레고·조립·만들기</label><label class="ck"><input type="checkbox" name="activities" value="로봇·3D프린팅">로봇·3D프린팅</label><label class="ck"><input type="checkbox" name="activities" value="코딩">코딩</label><label class="ck"><input type="checkbox" name="activities" value="게임">게임</label><label class="ck"><input type="checkbox" name="activities" value="영상편집·유튜브">영상편집·유튜브</label><label class="ck"><input type="checkbox" name="activities" value="SNS 콘텐츠">SNS 콘텐츠</label><label class="ck"><input type="checkbox" name="activities" value="축구">축구</label><label class="ck"><input type="checkbox" name="activities" value="야구">야구</label><label class="ck"><input type="checkbox" name="activities" value="농구">농구</label><label class="ck"><input type="checkbox" name="activities" value="수영·운동">수영·운동</label><label class="ck"><input type="checkbox" name="activities" value="연극·뮤지컬">연극·뮤지컬</label><label class="ck"><input type="checkbox" name="activities" value="댄스·발표">댄스·발표</label><label class="ck"><input type="checkbox" name="activities" value="학생회·동아리">학생회·동아리</label><label class="ck"><input type="checkbox" name="activities" value="봉사·행사기획">봉사·행사기획</label><label class="ck"><input type="checkbox" name="activities" value="요리·베이킹">요리·베이킹</label><label class="ck"><input type="checkbox" name="activities" value="여행·해외생활">여행·해외생활</label><label class="ck"><input type="checkbox" name="activities" value="중고거래·판매">중고거래·판매</label><label class="ck"><input type="checkbox" name="activities" value="반려동물·식물">반려동물·식물</label><label class="ck"><input type="checkbox" name="activities" value="기타">기타</label></div></div> <div class="q"><b>P2. 2년 이상 지속한 활동은 무엇입니까?</b><textarea id="longActivities" placeholder="예: 피아노 6년, 축구 4년, 그림 3년"></textarea></div> <div class="q"><b>P3. 부모가 시키지 않아도 스스로 계속한 활동은 무엇입니까?</b><textarea id="selfActivities"></textarea></div> <div class="q"><b>P4. 결과와 관계없이 유난히 몰입했던 활동은 무엇입니까?</b><textarea id="immersedActivities"></textarea></div> <div class="q"><b>P5. 아이에게 가장 의미 있었다고 생각되는 경험을 최대 5개 적어주세요.</b><textarea id="topActivities"></textarea></div> </div> <div class="card noPrint"> <h2>2. 반복 행동 · 강점 관찰</h2> <div class="sub">한 번 잘한 장면보다 여러 상황에서 반복된 행동을 찾습니다.</div> <div id="strengthSection"><div class="q"><b>P6. 가족이 아이에게 자주 부탁하는 일은 무엇입니까?</b><div class="small">최대 3개 정도를 중심으로 선택해주세요.</div><div class="checks"><label class="ck"><input type="checkbox" name="familyHelp" value="설명">설명</label><label class="ck"><input type="checkbox" name="familyHelp" value="검색">검색</label><label class="ck"><input type="checkbox" name="familyHelp" value="디지털 문제 해결">디지털 문제 해결</label><label class="ck"><input type="checkbox" name="familyHelp" value="계획">계획</label><label class="ck"><input type="checkbox" name="familyHelp" value="정리">정리</label><label class="ck"><input type="checkbox" name="familyHelp" value="만들기">만들기</label><label class="ck"><input type="checkbox" name="familyHelp" value="디자인">디자인</label><label class="ck"><input type="checkbox" name="familyHelp" value="의견 묻기">의견 묻기</label><label class="ck"><input type="checkbox" name="familyHelp" value="동생 돌보기">동생 돌보기</label><label class="ck"><input type="checkbox" name="familyHelp" value="분위기 조정">분위기 조정</label></div></div><div class="q"><b>P7. 친구들이 아이를 자주 찾는 이유는 무엇입니까?</b><div class="small">최대 3개 정도를 중심으로 선택해주세요.</div><div class="checks"><label class="ck"><input type="checkbox" name="friendReason" value="공부 질문">공부 질문</label><label class="ck"><input type="checkbox" name="friendReason" value="고민 상담">고민 상담</label><label class="ck"><input type="checkbox" name="friendReason" value="재미">재미</label><label class="ck"><input type="checkbox" name="friendReason" value="같이하면 일이 잘됨">같이하면 일이 잘됨</label><label class="ck"><input type="checkbox" name="friendReason" value="아이디어">아이디어</label><label class="ck"><input type="checkbox" name="friendReason" value="리더 역할">리더 역할</label><label class="ck"><input type="checkbox" name="friendReason" value="정보">정보</label><label class="ck"><input type="checkbox" name="friendReason" value="게임·운동 등 특정 능력">게임·운동 등 특정 능력</label></div></div><div class="q"><b>P8. 팀이나 가족 활동에서 자연스럽게 맡는 역할은 무엇입니까?</b><div class="small">최대 3개 정도를 중심으로 선택해주세요.</div><div class="checks"><label class="ck"><input type="checkbox" name="naturalRole" value="아이디어">아이디어</label><label class="ck"><input type="checkbox" name="naturalRole" value="자료조사">자료조사</label><label class="ck"><input type="checkbox" name="naturalRole" value="계획">계획</label><label class="ck"><input type="checkbox" name="naturalRole" value="실행">실행</label><label class="ck"><input type="checkbox" name="naturalRole" value="의견정리">의견정리</label><label class="ck"><input type="checkbox" name="naturalRole" value="발표">발표</label><label class="ck"><input type="checkbox" name="naturalRole" value="분위기">분위기</label><label class="ck"><input type="checkbox" name="naturalRole" value="오류찾기">오류찾기</label><label class="ck"><input type="checkbox" name="naturalRole" value="마무리">마무리</label></div></div><div class="q"><b>P9. 다른 사람보다 비교적 쉽게 해낸다고 느끼는 것은 무엇입니까?</b><div class="small">최대 3개 정도를 중심으로 선택해주세요.</div><div class="checks"><label class="ck"><input type="checkbox" name="easySkill" value="설명">설명</label><label class="ck"><input type="checkbox" name="easySkill" value="분석">분석</label><label class="ck"><input type="checkbox" name="easySkill" value="암기">암기</label><label class="ck"><input type="checkbox" name="easySkill" value="수리">수리</label><label class="ck"><input type="checkbox" name="easySkill" value="글쓰기">글쓰기</label><label class="ck"><input type="checkbox" name="easySkill" value="그림·디자인">그림·디자인</label><label class="ck"><input type="checkbox" name="easySkill" value="조립">조립</label><label class="ck"><input type="checkbox" name="easySkill" value="운동">운동</label><label class="ck"><input type="checkbox" name="easySkill" value="게임전략">게임전략</label><label class="ck"><input type="checkbox" name="easySkill" value="사람관계">사람관계</label><label class="ck"><input type="checkbox" name="easySkill" value="검색">검색</label><label class="ck"><input type="checkbox" name="easySkill" value="정리">정리</label></div></div><div class="q"><b>P10. 주변에서 반복적으로 칭찬받은 부분은 무엇입니까?</b><div class="small">최대 3개 정도를 중심으로 선택해주세요.</div><div class="checks"><label class="ck"><input type="checkbox" name="repeatPraise" value="설명">설명</label><label class="ck"><input type="checkbox" name="repeatPraise" value="집중">집중</label><label class="ck"><input type="checkbox" name="repeatPraise" value="끈기">끈기</label><label class="ck"><input type="checkbox" name="repeatPraise" value="분석">분석</label><label class="ck"><input type="checkbox" name="repeatPraise" value="창의">창의</label><label class="ck"><input type="checkbox" name="repeatPraise" value="배려">배려</label><label class="ck"><input type="checkbox" name="repeatPraise" value="리더십">리더십</label><label class="ck"><input type="checkbox" name="repeatPraise" value="정리">정리</label><label class="ck"><input type="checkbox" name="repeatPraise" value="표현">표현</label><label class="ck"><input type="checkbox" name="repeatPraise" value="운동">운동</label><label class="ck"><input type="checkbox" name="repeatPraise" value="음악">음악</label><label class="ck"><input type="checkbox" name="repeatPraise" value="만들기">만들기</label></div></div></div> </div> <div class="card noPrint"> <h2>3. 놀랐던 순간 · 숨은 능력</h2> <div class="q"> <b>P11. “우리 아이가 이런 것도 잘했나?” 하고 놀랐던 적이 있습니까?</b> <select id="surpriseFreq"><option value="4">자주 있었다</option><option value="3">몇 번 있었다</option><option value="2">잘 모르겠다</option><option value="1">거의 없었다</option></select> </div> <div class="q"><b>P12. 어떤 상황이었습니까?</b><div id="surpriseChecks" class="checks"><label class="ck"><input type="checkbox" name="surprise" value="학업">학업</label><label class="ck"><input type="checkbox" name="surprise" value="발표">발표</label><label class="ck"><input type="checkbox" name="surprise" value="여행·해외생활">여행·해외생활</label><label class="ck"><input type="checkbox" name="surprise" value="친구관계">친구관계</label><label class="ck"><input type="checkbox" name="surprise" value="위기 상황">위기 상황</label><label class="ck"><input type="checkbox" name="surprise" value="운동">운동</label><label class="ck"><input type="checkbox" name="surprise" value="음악·예술">음악·예술</label><label class="ck"><input type="checkbox" name="surprise" value="게임">게임</label><label class="ck"><input type="checkbox" name="surprise" value="만들기">만들기</label><label class="ck"><input type="checkbox" name="surprise" value="디지털·코딩">디지털·코딩</label><label class="ck"><input type="checkbox" name="surprise" value="행사·조직활동">행사·조직활동</label><label class="ck"><input type="checkbox" name="surprise" value="기타">기타</label></div></div> <div class="q"><b>P13. 그 상황에서 아이가 실제로 한 행동을 한 문장으로 적어주세요.</b><textarea id="surpriseStory"></textarea></div> </div> <div class="card noPrint"> <h2>4. 성장 전환점</h2> <div class="sub">현재 수준 자체보다 <b>무엇이 어떻게 좋아졌는지</b>를 봅니다.</div> <div class="q"><b>P14. 예전에는 어려웠지만 크게 좋아진 부분은 무엇입니까?</b><select id="growArea"><option>특별히 없음</option><option>공부습관</option><option>성적</option><option>수학</option><option>국어</option><option>영어</option><option>과학</option><option>글쓰기</option><option>발표</option><option>친구관계</option><option>감정조절</option><option>운동</option><option>음악·예술</option><option>자신감</option><option>시간관리</option><option>책임감</option><option>기타</option></select></div> <div class="q"><b>P15. 변화가 시작된 시기는 언제입니까?</b><select id="growWhen"><option>최근 3개월</option><option>최근 6개월</option><option>최근 1년</option><option>1년 이상 전</option><option>잘 모르겠다</option></select></div> <div class="q"><b>P16. 변화의 계기는 무엇이었습니까?</b><select id="growTrigger"><option>실패 경험</option><option>성적 하락</option><option>선생님</option><option>부모</option><option>친구</option><option>대회·프로젝트</option><option>작은 성공</option><option>좋아하는 것을 발견</option><option>환경 변화</option><option>스스로 필요성을 느낌</option></select></div> <div class="q"><b>P17. 아이가 실제로 바꾼 행동은 무엇입니까?</b><select id="growAction"><option>반복연습</option><option>계획 세우기</option><option>질문하기</option><option>자료탐색</option><option>도움 요청</option><option>방법 변경</option><option>실패 원인 분석</option><option>환경 변경</option><option>시간 사용 변경</option></select></div> <div class="q"><b>P18. 비슷한 다른 상황에서도 성장하는 모습을 보였습니까?</b><select id="growTransfer"><option value="5">매우 자주 보였다</option><option value="4">자주 보였다</option><option value="3">가끔 보였다</option><option value="2">드물었다</option><option value="1">거의 없었다</option><option value="">경험이 없어 잘 모르겠다</option></select></div> </div> <div class="card noPrint"> <h2>5. 에너지 · 환경</h2> <div class="q"><b>P19. 하고 난 후 오히려 에너지가 살아나는 활동은 무엇입니까?</b><textarea id="energyUp"></textarea></div> <div class="q"><b>P20. 잘하기는 하지만 끝나면 많이 지쳐하는 활동은 무엇입니까?</b><textarea id="energyDown"></textarea></div> <div class="q"><b>P21. 아이의 능력이 가장 잘 드러나는 환경은 무엇입니까?</b><div id="envBest" class="checks"><label class="ck"><input type="checkbox" name="envBest" value="경쟁적인 환경">경쟁적인 환경</label><label class="ck"><input type="checkbox" name="envBest" value="안정적인 환경">안정적인 환경</label><label class="ck"><input type="checkbox" name="envBest" value="혼자 집중할 때">혼자 집중할 때</label><label class="ck"><input type="checkbox" name="envBest" value="소수 팀">소수 팀</label><label class="ck"><input type="checkbox" name="envBest" value="큰 팀">큰 팀</label><label class="ck"><input type="checkbox" name="envBest" value="엄격한 관리">엄격한 관리</label><label class="ck"><input type="checkbox" name="envBest" value="자유로운 환경">자유로운 환경</label><label class="ck"><input type="checkbox" name="envBest" value="좋은 지도자가 있을 때">좋은 지도자가 있을 때</label><label class="ck"><input type="checkbox" name="envBest" value="잘하는 또래가 있을 때">잘하는 또래가 있을 때</label><label class="ck"><input type="checkbox" name="envBest" value="새로운 사람·문화가 있을 때">새로운 사람·문화가 있을 때</label></div></div> <div class="q"><b>P22. 반대로 아이가 가장 위축되는 환경은 무엇입니까?</b><div id="envWorst" class="checks"><label class="ck"><input type="checkbox" name="envWorst" value="경쟁적인 환경">경쟁적인 환경</label><label class="ck"><input type="checkbox" name="envWorst" value="안정적인 환경">안정적인 환경</label><label class="ck"><input type="checkbox" name="envWorst" value="혼자 집중할 때">혼자 집중할 때</label><label class="ck"><input type="checkbox" name="envWorst" value="소수 팀">소수 팀</label><label class="ck"><input type="checkbox" name="envWorst" value="큰 팀">큰 팀</label><label class="ck"><input type="checkbox" name="envWorst" value="엄격한 관리">엄격한 관리</label><label class="ck"><input type="checkbox" name="envWorst" value="자유로운 환경">자유로운 환경</label><label class="ck"><input type="checkbox" name="envWorst" value="좋은 지도자가 있을 때">좋은 지도자가 있을 때</label><label class="ck"><input type="checkbox" name="envWorst" value="잘하는 또래가 있을 때">잘하는 또래가 있을 때</label><label class="ck"><input type="checkbox" name="envWorst" value="새로운 사람·문화가 있을 때">새로운 사람·문화가 있을 때</label></div></div> </div> <div class="card noPrint"> <h2>6. 부모 기대 · 어려움이 드러나는 방식</h2> <div class="sub">부모의 기대가 높고 낮음을 평가하려는 것이 아니라, <b>아이에게 어떻게 전달되고 체감되는지</b>를 확인합니다.</div> <div id="expectSection"><div class="q"><div class="scaleRow"><b>P23. 부모는 성적·진학에 대한 기대를 자주 표현하는 편입니까?</b><select id="p23"> <option value="">해당 경험이 없어 잘 모르겠다</option> <option value="1">1 · 거의 없었다</option> <option value="2">2 · 드물었다</option> <option value="3">3 · 가끔 있었다</option> <option value="4">4 · 자주 있었다</option> <option value="5">5 · 매우 자주 있었다</option> </select></div></div><div class="q"><div class="scaleRow"><b>P24. 기대에 못 미친 결과를 받았을 때 아이가 먼저 이야기합니까?</b><select id="p24"> <option value="">해당 경험이 없어 잘 모르겠다</option> <option value="1">1 · 거의 없었다</option> <option value="2">2 · 드물었다</option> <option value="3">3 · 가끔 있었다</option> <option value="4">4 · 자주 있었다</option> <option value="5">5 · 매우 자주 있었다</option> </select></div></div><div class="q"><div class="scaleRow"><b>P25. 힘들어도 괜찮다고 말하며 혼자 해결하려는 편입니까?</b><select id="p25"> <option value="">해당 경험이 없어 잘 모르겠다</option> <option value="1">1 · 거의 없었다</option> <option value="2">2 · 드물었다</option> <option value="3">3 · 가끔 있었다</option> <option value="4">4 · 자주 있었다</option> <option value="5">5 · 매우 자주 있었다</option> </select></div></div><div class="q"><div class="scaleRow"><b>P26. 부모나 선생님을 실망시킬까 봐 결과를 걱정한다고 느낀 적이 있습니까?</b><select id="p26"> <option value="">해당 경험이 없어 잘 모르겠다</option> <option value="1">1 · 거의 없었다</option> <option value="2">2 · 드물었다</option> <option value="3">3 · 가끔 있었다</option> <option value="4">4 · 자주 있었다</option> <option value="5">5 · 매우 자주 있었다</option> </select></div></div></div> </div> <div class="card noPrint"> <h2>7. 스트레스 해소 · 회복 · 학습복귀</h2> <div class="sub">최근 3개월을 떠올려 응답해주세요. 경험이 없다면 ‘해당 경험이 없어 잘 모르겠다’를 선택하세요.</div> <div id="recoverySection"><div class="q"><div class="scaleRow"><b>P27. 친구·운동·취미·영상·음악 등으로 스트레스를 풀고 다시 할 일로 돌아옵니까?</b><select id="p27"> <option value="">해당 경험이 없어 잘 모르겠다</option> <option value="1">1 · 거의 없었다</option> <option value="2">2 · 드물었다</option> <option value="3">3 · 가끔 있었다</option> <option value="4">4 · 자주 있었다</option> <option value="5">5 · 매우 자주 있었다</option> </select></div></div><div class="q"><div class="scaleRow"><b>P28. 한 번 공부 흐름이 깨지면 원래 리듬을 회복하는 데 오래 걸립니까?</b><select id="p28"> <option value="">해당 경험이 없어 잘 모르겠다</option> <option value="1">1 · 거의 없었다</option> <option value="2">2 · 드물었다</option> <option value="3">3 · 가끔 있었다</option> <option value="4">4 · 자주 있었다</option> <option value="5">5 · 매우 자주 있었다</option> </select></div></div><div class="q"><div class="scaleRow"><b>P29. 작은 실수나 계획 변경에도 크게 예민해지는 편입니까?</b><select id="p29"> <option value="">해당 경험이 없어 잘 모르겠다</option> <option value="1">1 · 거의 없었다</option> <option value="2">2 · 드물었다</option> <option value="3">3 · 가끔 있었다</option> <option value="4">4 · 자주 있었다</option> <option value="5">5 · 매우 자주 있었다</option> </select></div></div><div class="q"><div class="scaleRow"><b>P30. 평소에는 잘하다가 어느 순간 갑자기 의욕이 크게 떨어진 적이 있습니까?</b><select id="p30"> <option value="">해당 경험이 없어 잘 모르겠다</option> <option value="1">1 · 거의 없었다</option> <option value="2">2 · 드물었다</option> <option value="3">3 · 가끔 있었다</option> <option value="4">4 · 자주 있었다</option> <option value="5">5 · 매우 자주 있었다</option> </select></div></div></div> </div> <div class="card noPrint"> <h2>8. 학생–학부모 관찰 차이 · 미경험 가능성</h2> <div class="q"><b>P31. 아이는 별것 아니라고 생각하지만, 부모가 보기에는 잘한다고 생각하는 것은 무엇입니까?</b><textarea id="hiddenStrength"></textarea></div> <div class="q"><b>P32. 아직 충분히 경험하지 않아 능력이 드러나지 않았다고 생각되는 분야는 무엇입니까?</b><textarea id="noExperience"></textarea></div> <div class="notice" style="margin-top:10px"> <b>중요:</b> ‘경험이 없다’는 것은 능력이 낮다는 뜻이 아닙니다. APEX에서는 이런 영역을 <b>미경험 영역</b>로 분리해 봅니다. </div> </div> <div class="card noPrint"> <h2>상담 보조 항목</h2> <div class="q"><b>부모님이 현재 바라는 진로나 교육 방향</b><textarea id="parentHope"></textarea></div> <div class="q"><b>아이가 실제로 이야기하는 진로나 관심 방향</b><textarea id="studentHope"></textarea></div> <div class="q"> <b>기대를 조금 낮추거나 결과 이야기를 덜 했을 때 오히려 더 편안하고 잘하는 것 같다고 느낀 적이 있습니까?</b> <select id="expectReliefFlag"><option value="4">자주 있다</option><option value="3">가끔 있다</option><option value="2">잘 모르겠다</option><option value="1">거의 없다</option></select> <div class="small">※ 이 항목은 점수화하지 않고 상담 참고 신호로만 사용합니다.</div> </div> <div class="q"><b>이 설문에서 묻지 않았지만 상담자가 꼭 알아야 할 아이의 모습</b><textarea id="extra"></textarea></div> </div> <div class="card noPrint"> <button class="btn primary" onclick="saveParent()">💾 학부모 진단 결과 보기 · 저장</button> <button class="btn light" onclick="window.print()">🖨 인쇄</button> </div> <div id="result" class="card result"></div> </div> <script> const ACTIVITIES=['수학','과학','국어·글쓰기','영어·외국어','사회·역사','정보·AI','피아노','바이올린·현악','노래·작곡','밴드','미술·디자인','사진·공예','레고·조립·만들기','로봇·3D프린팅','코딩','게임','영상편집·유튜브','SNS 콘텐츠','축구','야구','농구','수영·운동','연극·뮤지컬','댄스·발표','학생회·동아리','봉사·행사기획','요리·베이킹','여행·해외생활','중고거래·판매','반려동물·식물','기타']; const STR=[ ['familyHelp','P6. 가족이 아이에게 자주 부탁하는 일은 무엇입니까?','설명,검색,디지털 문제 해결,계획,정리,만들기,디자인,의견 묻기,동생 돌보기,분위기 조정'], ['friendReason','P7. 친구들이 아이를 자주 찾는 이유는 무엇입니까?','공부 질문,고민 상담,재미,같이하면 일이 잘됨,아이디어,리더 역할,정보,게임·운동 등 특정 능력'], ['naturalRole','P8. 팀이나 가족 활동에서 자연스럽게 맡는 역할은 무엇입니까?','아이디어,자료조사,계획,실행,의견정리,발표,분위기,오류찾기,마무리'], ['easySkill','P9. 다른 사람보다 비교적 쉽게 해낸다고 느끼는 것은 무엇입니까?','설명,분석,암기,수리,글쓰기,그림·디자인,조립,운동,게임전략,사람관계,검색,정리'], ['repeatPraise','P10. 주변에서 반복적으로 칭찬받은 부분은 무엇입니까?','설명,집중,끈기,분석,창의,배려,리더십,정리,표현,운동,음악,만들기'] ]; const SUR=['학업','발표','여행·해외생활','친구관계','위기 상황','운동','음악·예술','게임','만들기','디지털·코딩','행사·조직활동','기타']; const ENV=['경쟁적인 환경','안정적인 환경','혼자 집중할 때','소수 팀','큰 팀','엄격한 관리','자유로운 환경','좋은 지도자가 있을 때','잘하는 또래가 있을 때','새로운 사람·문화가 있을 때']; const EXPECT_Q=[ ['p23','P23. 부모는 성적·진학에 대한 기대를 자주 표현하는 편입니까?'], ['p24','P24. 기대에 못 미친 결과를 받았을 때 아이가 먼저 이야기합니까?'], ['p25','P25. 힘들어도 괜찮다고 말하며 혼자 해결하려는 편입니까?'], ['p26','P26. 부모나 선생님을 실망시킬까 봐 결과를 걱정한다고 느낀 적이 있습니까?'] ]; const RECOVERY_Q=[ ['p27','P27. 친구·운동·취미·영상·음악 등으로 스트레스를 풀고 다시 할 일로 돌아옵니까?'], ['p28','P28. 한 번 공부 흐름이 깨지면 원래 리듬을 회복하는 데 오래 걸립니까?'], ['p29','P29. 작은 실수나 계획 변경에도 크게 예민해지는 편입니까?'], ['p30','P30. 평소에는 잘하다가 어느 순간 갑자기 의욕이 크게 떨어진 적이 있습니까?'] ]; function e(s){return String(s??'').replace(/[&<>"']/g,m=>({'&':'&','<':'<','>':'>','"':'"',"'":'''}[m]))} function val(id){return document.getElementById(id)?.value||''} function selected(name){return [...document.querySelectorAll(`input[name="${name}"]:checked`)].map(x=>x.value)} function checks(arr,name){return arr.map(x=>`<label class="ck"><input type="checkbox" name="${name}" value="${e(x)}">${e(x)}</label>`).join('')} function scaleSelect(id){ return `<select id="${id}"> <option value="">해당 경험이 없어 잘 모르겠다</option> <option value="1">1 · 거의 없었다</option> <option value="2">2 · 드물었다</option> <option value="3">3 · 가끔 있었다</option> <option value="4">4 · 자주 있었다</option> <option value="5">5 · 매우 자주 있었다</option> </select>`; } function init(){ const d=document.getElementById('date'); if(d && !d.value){const now=new Date();d.value=new Date(now.getTime()-now.getTimezoneOffset()*60000).toISOString().slice(0,10)} document.getElementById('actChecks').innerHTML=checks(ACTIVITIES,'activities'); document.getElementById('strengthSection').innerHTML=STR.map(([id,q,o])=>`<div class="q"><b>${q}</b><div class="small">최대 3개 정도를 중심으로 선택해주세요.</div><div class="checks">${checks(o.split(','),id)}</div></div>`).join(''); document.getElementById('surpriseChecks').innerHTML=checks(SUR,'surprise'); document.getElementById('envBest').innerHTML=checks(ENV,'envBest'); document.getElementById('envWorst').innerHTML=checks(ENV,'envWorst'); document.getElementById('expectSection').innerHTML=EXPECT_Q.map(([id,q])=>`<div class="q"><div class="scaleRow"><b>${q}</b>${scaleSelect(id)}</div></div>`).join(''); document.getElementById('recoverySection').innerHTML=RECOVERY_Q.map(([id,q])=>`<div class="q"><div class="scaleRow"><b>${q}</b>${scaleSelect(id)}</div></div>`).join(''); const a=['특별히 없음','공부습관','성적','수학','국어','영어','과학','글쓰기','발표','친구관계','감정조절','운동','음악·예술','자신감','시간관리','책임감','기타']; const t=['실패 경험','성적 하락','선생님','부모','친구','대회·프로젝트','작은 성공','좋아하는 것을 발견','환경 변화','스스로 필요성을 느낌']; const ac=['반복연습','계획 세우기','질문하기','자료탐색','도움 요청','방법 변경','실패 원인 분석','환경 변경','시간 사용 변경']; [['growArea',a],['growTrigger',t],['growAction',ac]].forEach(([id,arr])=>document.getElementById(id).innerHTML=arr.map(x=>`<option>${x}</option>`).join('')); } function n(id){const x=Number(val(id));return Number.isFinite(x)&&val(id)!==''?x:null} function avg(values){const a=values.filter(Number.isFinite);return a.length?a.reduce((s,x)=>s+x,0)/a.length:null} function reverse5(x){return Number.isFinite(x)?6-x:null} function labelByScore(x,goodHigh=true){ if(!Number.isFinite(x)) return {t:'자료 부족',c:'watch'}; const v=goodHigh?x:6-x; if(v>=4) return {t:'안정',c:'good'}; if(v>=3) return {t:'관찰',c:'watch'}; return {t:'추가 확인',c:'check'}; } function makeSignals(){ const buckets={}; STR.forEach(([id])=>selected(id).forEach(x=>buckets[x]=(buckets[x]||0)+1)); return Object.entries(buckets).sort((a,b)=>b[1]-a[1]).slice(0,7).map(([label,count])=>({label,count,evidence:`학부모 관찰 ${count}개 영역에서 반복`})); } function compareStudent(student,signals){ if(!student)return[]; const st=(student.strengthSignals||[]).map(x=>x.label); return signals.map(x=>({label:x.label,parent:x.count,student:st.includes(x.label)?'학생 측에서도 관련 신호가 있음':'학생 측에서 직접 드러난 신호가 적음',state:st.includes(x.label)?'CONSISTENT':'HIDDEN_CANDIDATE'})); } function loadLinkedStudent(){ if(window.__studentApex)return window.__studentApex; try{ const key='apex_v28_student_'+encodeURIComponent((val('name')||'')+'|'+(val('school')||'')); const exact=JSON.parse(localStorage.getItem(key)||'null'); if(exact){window.__studentApex=exact;return exact} const last=JSON.parse(localStorage.getItem('apex_v28_student_last')||'null'); if(last&&(!val('name')||last.name===val('name'))){window.__studentApex=last;return last} }catch(e){} return null } function buildParentProfile(){ const p23=n('p23'),p24=n('p24'),p25=n('p25'),p26=n('p26'); const p27=n('p27'),p28=n('p28'),p29=n('p29'),p30=n('p30'); const expectationLoad=avg([p23,p26]); const helpVisibility=avg([p24,reverse5(p25)]); const recovery=avg([p27,reverse5(p28),reverse5(p29),reverse5(p30)]); return { expectationLoad, helpVisibility, recovery, expectationLabel: Number.isFinite(expectationLoad)?(expectationLoad>=4?'기대 체감 확인 필요':expectationLoad>=3?'보통':'낮게 관찰'):'자료 부족', helpLabel: labelByScore(helpVisibility,true), recoveryLabel: labelByScore(recovery,true) }; } function saveParent(){ loadLinkedStudent(); const signals=makeSignals(); const profile=buildParentProfile(); const data={ version:'APEX_PARENT_V29', date:val('date'),name:val('name'),school:val('school'),grade:val('grade'),relation:val('relation'), experience:{ activities:selected('activities'),long:val('longActivities'),self:val('selfActivities'), immersed:val('immersedActivities'),top:val('topActivities') }, observations:Object.fromEntries(STR.map(([id])=>[id,selected(id)])), surprise:{freq:+val('surpriseFreq'),situations:selected('surprise'),story:val('surpriseStory')}, growth:{area:val('growArea'),when:val('growWhen'),trigger:val('growTrigger'),action:val('growAction'),transfer:n('growTransfer')}, energy:{up:val('energyUp'),down:val('energyDown')}, environment:{best:selected('envBest'),worst:selected('envWorst')}, expectation:{p23:n('p23'),p24:n('p24'),p25:n('p25'),p26:n('p26')}, recovery:{p27:n('p27'),p28:n('p28'),p29:n('p29'),p30:n('p30')}, gap:{hidden:val('hiddenStrength'),noExperience:val('noExperience')}, direction:{parentHope:val('parentHope'),studentHope:val('studentHope')}, flags:{expectRelief:+val('expectReliefFlag')||null}, extra:val('extra'), strengthSignals:signals, parentProfile:profile, studentParentComparison:compareStudent(window.__studentApex,signals) }; renderResult(data); try{data.form=window.__apexParentSnap();data.savedAt=Date.now();}catch(err){} try{window.parent.postMessage({type:'APEX_PARENT_SAVE',result:data},'*')}catch(err){} try{localStorage.setItem('apex_parent_v29_last',JSON.stringify(data))}catch(e){} window.__lastParent=data; } function renderResult(d){ const p=d.parentProfile; const relief=(d.flags.expectRelief>=3) ? '<span class="pill watch">기대·결과 대화 조절 시 반응 변화 관찰</span>' : '<span class="pill">추가 관찰</span>'; const strengthHtml=d.strengthSignals.length ? d.strengthSignals.map(x=>`<div class="box"><b>${e(x.label)}</b> <span class="pill">${x.count}개 관찰영역</span><div class="sub">${e(x.evidence)}</div></div>`).join('') : '<p>반복 관찰 신호가 아직 충분하지 않습니다.</p>'; const gapHtml=d.studentParentComparison.length ? d.studentParentComparison.map(x=>`<div class="box"><b>${e(x.label)}</b> <span class="pill ${x.state==='HIDDEN_CANDIDATE'?'watch':'good'}">${x.state==='HIDDEN_CANDIDATE'?'숨은 강점 후보':'학생·부모 관찰 일치'}</span><div class="sub">${e(x.student)}</div></div>`).join('') : '<p>학생 APEX와 연결되면 공통 강점 신호를 비교합니다.</p>'; document.getElementById('result').style.display='block'; document.getElementById('result').innerHTML=` <h1>APEX 학부모 성장관찰 진단 결과</h1> <div class="notice"><b>${e(d.name)}</b> 학생에 대한 학부모 장기 관찰 자료입니다. 부모 응답은 학생의 능력을 확정하는 판정이 아니라 <b>학생 자기보고·교사 관찰·실제 경험과 함께 확인할 외부 관찰 데이터</b>입니다.</div> <h2>1. 부모 관찰 프로필</h2> <div class="reportGrid"> <div class="metric"><div class="k">기대 체감 신호</div><div class="v">${e(p.expectationLabel)}</div></div> <div class="metric"><div class="k">도움 요청·어려움 공개</div><div class="v">${e(p.helpLabel.t)}</div></div> <div class="metric"><div class="k">회복·학습복귀</div><div class="v">${e(p.recoveryLabel.t)}</div></div> </div> <div class="small">※ 내부 계산값은 상담 구조화를 위한 참고치이며, 부모 관찰 하나만으로 학생 특성을 확정하지 않습니다.</div> <h2>2. 경험 · 몰입</h2> <div>${d.experience.activities.map(x=>`<span class="pill">${e(x)}</span>`).join('')}</div> <div class="box"><b>2년 이상 지속</b><br>${e(d.experience.long||'-')}<br><br><b>스스로 지속</b><br>${e(d.experience.self||'-')}<br><br><b>결과와 관계없이 몰입</b><br>${e(d.experience.immersed||'-')}</div> <h2>3. 반복 관찰 강점</h2> ${strengthHtml} <h2>4. 성장 전환점</h2> <div class="box"><b>${e(d.growth.area)}</b><br>시기: ${e(d.growth.when)} · 계기: ${e(d.growth.trigger)} · 행동 변화: ${e(d.growth.action)}<br> 다른 상황으로의 전이: ${Number.isFinite(d.growth.transfer)?d.growth.transfer+'/5':'경험 부족'}</div> <h2>5. 숨은 강점 · 미경험 영역</h2> <div class="box"><b>숨은 강점 후보</b><br>${e(d.gap.hidden||'-')}</div> <div class="box"><b>미경험 영역</b><br>${e(d.gap.noExperience||'-')}</div> <h2>6. 학생–학부모 비교</h2> ${window.__studentApex?'<div class="notice">학생 APEX와 연결해 공통 신호를 비교했습니다. 차이는 누가 맞고 틀린 문제가 아니라 <b>환경·관찰 위치의 차이</b>로 해석합니다.</div>':'<div class="notice">학생 APEX가 연결되면 같은 학생의 최신 결과와 비교하여 숨은 강점 후보 / 관찰 일치 신호를 확인할 수 있습니다.</div>'} ${gapHtml} <h2>7. 상담 플래그</h2> <div class="box">${relief}<br><span class="sub">기대와 결과에 대한 대화 방식이 아이의 긴장·수행에 영향을 주는지 상담에서 확인합니다.</span></div> <h2>8. 다음 확인</h2> <div class="notice gold"> ① 부모가 반복해서 본 강점이 다른 환경에서도 나타나는가<br> ② 아이가 힘들 때 도움 요청이 늦어지는지<br> ③ 실패·일정 변화 뒤 원래 학습 리듬으로 돌아오는 데 얼마나 걸리는지<br> ④ 미경험 영역 중 하나를 실제 경험으로 검증할 수 있는지 </div>`; document.getElementById('result').scrollIntoView({behavior:'smooth'}); } window.addEventListener('message',ev=>{ const d=ev.data||{}; if(d.type==='APEX_PARENT_INIT'){ document.getElementById('name').value=d.name||''; document.getElementById('school').value=d.school||''; document.getElementById('grade').value=d.grade||''; window.__studentApex=d.studentApex||null; } }); init(); </script> <script> /* ===== SG 플랫폼 연동 브리지 (학부모 V29) ===== */ (function(){ 'use strict'; function $(id){return document.getElementById(id);} function post(m){try{window.parent.postMessage(m,'*');}catch(e){}} window.__apexParentSnap=function(){ var f={},c={}; document.querySelectorAll('.wrap input[id],.wrap select[id],.wrap textarea[id]').forEach(function(el){ if(el.type==='checkbox'||el.type==='radio')return;f[el.id]=el.value; }); document.querySelectorAll('.wrap input[type=checkbox][name]').forEach(function(el){ if(el.checked)(c[el.name]=c[el.name]||[]).push(el.value); }); return {fields:f,checks:c}; }; function restoreForm(form){ if(!form)return; Object.keys(form.fields||{}).forEach(function(id){ var el=$(id);if(!el)return; if(el.tagName==='SELECT'){var ok=false;for(var i=0;i<el.options.length;i++){if(el.options[i].value===String(form.fields[id])){ok=true;break;}}if(!ok)return;} el.value=form.fields[id]; }); document.querySelectorAll('.wrap input[type=checkbox][name]').forEach(function(el){ var arr=(form.checks||{})[el.name]||[];el.checked=arr.indexOf(el.value)>=0; }); } var style=document.createElement('style'); style.textContent='@media print{.noPrint{display:none!important}}'; document.head.appendChild(style); window.addEventListener('message',function(e){ var d=e.data||{}; if(d.type==='APEX_DO_PRINT'){window.print();return;} if(d.type==='APEX_PARENT_RESTORE'){ try{ var r=d.result||{}; restoreForm(r.form); if(!r.form){ // 구버전(폼 스냅샷 없음)은 기본정보만 채움 ['date','name','school','grade','relation'].forEach(function(k){if($(k)&&r[k]!==undefined)$(k).value=r[k];}); } if(d.view){ window.__studentApex=d.studentApex||null; if(typeof renderResult==='function')renderResult(r); document.querySelectorAll('.card.noPrint').forEach(function(c){c.style.display='none';}); var res=$('result');if(res&&res.scrollIntoView)res.scrollIntoView(); } if(d.readonly){document.querySelectorAll('.wrap input,.wrap select,.wrap textarea').forEach(function(el){el.disabled=true;});} post({type:'APEX_PARENT_RESTORED'}); if(d.print){setTimeout(function(){window.print();},900);} }catch(err){console.warn('parent restore',err);post({type:'APEX_RESTORE_ERROR',message:String(err&&err.message||err)});} } }); window.addEventListener('afterprint',function(){post({type:'APEX_PRINT_DONE'});}); post({type:'APEX_READY'}); })(); </script> </body></html>
<!DOCTYPE html> <html lang="ko"><head><meta http-equiv="Content-Type" content="text/html; charset=UTF-8"> <title>APEX 학업역량 정밀진단 시스템 V26</title> <script src="https://cdn.jsdelivr.net/npm/chart.js@4.4.0/dist/chart.umd.min.js"></script> <style> @import url('https://cdn.jsdelivr.net/gh/orioncactus/pretendard/dist/web/static/pretendard.css'); :root { --primary: #1A237E; --secondary: #1A73E8; --gold: #b8860b; --gold-bg: #fff9e6; --border: #e0e0e0; --text-main: #333333; --bg-light: #f4f7f9; --danger: #d32f2f; } * { box-sizing: border-box; } body { font-family: 'Pretendard', sans-serif; background: var(--bg-light); margin: 0; padding: 20px; color: var(--text-main); line-height: 1.5; } .container { max-width: 1050px; margin: 0 auto; } .no-print { margin-bottom: 30px; padding: 35px; background: white; border-radius: 12px; box-shadow: 0 4px 20px rgba(0,0,0,0.08); border-top: 5px solid var(--primary); } .input-grid { display: grid; grid-template-columns: repeat(auto-fit, minmax(200px, 1fr)); gap: 15px; margin-bottom: 20px; } .input-grid div { display: flex; flex-direction: column; } .input-grid label { font-size: 0.9em; font-weight: 700; color: var(--primary); margin-bottom: 5px; } .input-grid input, .input-grid select { padding: 8px 10px; border: 1px solid #ccc; border-radius: 5px; font-family: 'Pretendard'; font-size:0.9em; } .grade-table { width: 100%; border-collapse: collapse; margin-top: 8px; text-align: center; font-size: 0.85em; background: white; } .grade-table th { background: #e1e9ff; color: var(--primary); padding: 8px; border: 1px solid #b3d4ff; font-weight: 800; } .grade-table td { padding: 6px; border: 1px solid #b3d4ff; font-weight:bold; } .grade-table select { width: 100%; padding: 4px; border: 1px solid #ccc; border-radius: 4px; text-align: center; font-weight: bold; color: #333; cursor: pointer; } .page { background: white; padding: 45px 50px; margin-bottom: 40px; box-shadow: 0 10px 30px rgba(0,0,0,0.1); border-radius: 8px; position: relative; overflow: hidden; page-break-after: always; width: 100%; max-width: 210mm; min-height: 297mm; margin: 0 auto 40px auto; } .report-header { border-bottom: 3px solid var(--primary); padding-bottom: 10px; margin-bottom: 20px; } .report-header .title-area { display: flex; justify-content: space-between; align-items: flex-end; } .report-header h1 { color: var(--primary); margin: 0; font-size: 1.8em; font-weight: 900; letter-spacing: -1px; } .report-header .sub-text { color: var(--secondary); font-weight: 700; font-size: 0.95em; margin-top: 3px; } h3 { color: var(--secondary); font-size: 1.25em; border-left: 6px solid var(--secondary); padding-left: 12px; margin-top: 25px; margin-bottom: 15px; } .cover-content { height: 100%; min-height: 250mm; display: flex; flex-direction: column; justify-content: center; align-items: center; border: 12px double var(--primary); padding: 40px; } .cover-title { font-size: 3.6em; font-weight: 900; color: var(--primary); text-align: center; margin-bottom: 30px; letter-spacing: -2px; } .cover-desc { font-size: 1.05em; line-height: 1.8; color: #444; max-width: 850px; text-align: justify; background: #f8f9fa; padding: 30px; border-radius: 12px; border-left: 8px solid var(--secondary); } .info-table { width: 500px; border-collapse: collapse; margin-top: 50px; } .info-table td { padding: 15px; border-bottom: 2px solid var(--primary); font-size: 1.2em; font-weight: 800; } .info-table .label { color: var(--primary); width: 120px; text-align: left; } .survey-grid { display: grid; grid-template-columns: 1fr 1fr; gap: 8px 30px; margin-top: 10px; } .survey-item { border-bottom: 1px solid #eee; padding: 6px 0; display: flex; justify-content: space-between; font-size: 0.88em; align-items: flex-start; } .survey-item .q { color: #555; padding-right: 10px; } .survey-item .a { color: var(--secondary); font-weight: 900; white-space: nowrap; } .analysis-box { background: #f8faff; padding: 18px 22px; border-radius: 12px; margin-bottom: 15px; border: 1px solid #e1e9ff; line-height: 1.6; font-size: 0.95em; text-align: justify; } .total-box { text-align: center; background: linear-gradient(135deg, #f8f9fa 0%, #ffffff 100%); padding: 25px; border-radius: 15px; border: 3px solid var(--primary); margin: 15px 0; } .total-val { font-size: 4em; font-weight: 900; color: var(--primary); margin: 5px 0; letter-spacing: -2px; } .trend-badge { font-size: 0.35em; vertical-align: middle; padding: 5px 12px; border-radius: 20px; font-weight: 800; display: inline-block; margin-left: 10px; } .trend-up { background: #e8f5e9; color: #2e7d32; border: 1px solid #2e7d32; } .trend-down { background: #ffebee; color: #c62828; border: 1px solid #c62828; } .trend-same { background: #f5f5f5; color: #666; border: 1px solid #999; } .mismatch-box { background: #fff5f5; border-left: 8px solid #d32f2f; padding: 15px 20px; border-radius: 8px; margin-top: 10px; color: #b71c1c; font-weight: 700; font-size: 0.9em; line-height:1.5; text-align:left; } .rubric-tag { display: inline-block; padding: 3px 10px; border-radius: 5px; font-weight: 800; color: white; margin-bottom: 8px; font-size: 0.8em; } .tag-master { background: var(--primary); } .tag-proficient { background: #2e7d32; } .tag-developing { background: #ef6c00; } .tag-critical { background: var(--danger); } .school-grid { display: grid; grid-template-columns: repeat(3, 1fr); gap: 10px; margin-top: 10px; } .school-card { padding: 10px 12px; border: 1.5px solid var(--border); border-radius: 10px; text-align: center; background: #fff; position: relative; } .school-card.gold { background: var(--gold-bg); border: 2px solid var(--gold); } .school-score { font-size: 1.4em; font-weight: 900; color: var(--primary); margin: 3px 0; } .school-target { font-size: 0.8em; color: #666; font-weight: 800; border-top: 1px dashed #ccc; margin-top: 4px; padding-top: 4px; } .status-badge { font-weight: 800; padding: 3px 8px; border-radius: 12px; font-size: 0.7em; display: inline-block; margin-bottom: 3px; } .badge-stable { background: #e8f5e9; color: #2e7d32; } .badge-challenge { background: #e3f2fd; color: #1565c0; } .badge-caution { background: #ffebee; color: var(--danger); } .gap-indicator { font-size: 0.8em; font-weight: bold; margin-top: 2px; } .gap-plus { color: #2e7d32; } .gap-minus { color: var(--danger); } .stucare-roadmap { display: grid; grid-template-columns: 1fr 1fr 1fr; gap: 15px; margin-top: 20px; } .stucare-step { background: #fff; border: 2px solid var(--secondary); border-radius: 10px; padding: 18px 15px; position: relative; } .stucare-step .step-num { position: absolute; top: -12px; left: 15px; background: var(--secondary); color: white; padding: 3px 10px; border-radius: 15px; font-weight: 900; font-size: 0.8em; } .footer { position: absolute; bottom: 15px; left: 0; right: 0; text-align: center; font-size: 0.85em; color: #aaa; font-weight: 700; border-top: 1px solid #f0f0f0; padding-top: 8px; width: 85%; margin: 0 auto; } /* Page 7 compact balancing */ #p7 .report-header { margin-bottom: 14px; } #p7 h3 { margin-top: 10px !important; margin-bottom: 8px !important; font-size: 1.08em; } #p7 #gradeIndexArea { margin-bottom: 10px !important; } #p7 .analysis-box { padding: 10px 14px; font-size: 0.78em !important; line-height: 1.45; } #p7 .school-grid { gap: 8px; margin-top: 8px; } #p7 .school-card { padding: 8px 10px; } #p7 .status-badge { font-size: 0.65em; padding: 3px 7px; margin-bottom: 2px; } #p7 .school-score { font-size: 1.25em; margin: 2px 0; } #p7 .target-avg { font-size: 0.76em; } #p7 .gap-indicator { font-size: 0.74em; } @media print { .no-print { display: none; } body { padding: 0; background: white; margin: 0; } @page { size: A4; margin: 0; } .container { max-width: 100%; width: 100%; margin: 0; } .page { width: 210mm; height: 297mm; max-height: 297mm; margin: 0; padding: 10mm 15mm; border: none; box-shadow: none; border-radius: 0; page-break-after: always; overflow: hidden; } .total-box, .school-card, .analysis-box, .stucare-step, .grade-table th { -webkit-print-color-adjust: exact; print-color-adjust: exact; } .rubric-tag, .status-badge, .cover-content, .a, .trend-badge, .trend-same, .trend-down { -webkit-print-color-adjust: exact; print-color-adjust: exact; } } </style> </head> <body> <div class="container"> <div class="no-print"> <div style="display:flex; justify-content:space-between; align-items:flex-end; border-bottom: 5px solid var(--primary); margin-bottom: 20px; padding-bottom: 10px;"> <h2 style="margin:0; color:var(--primary);">🎯 APEX 학업역량 정밀진단 시스템 V26 (최종)</h2> <button onclick="printStudentQuestionnaire()" style="background:#2e7d32; color:white; border:none; padding:12px 25px; border-radius:8px; font-weight:800; cursor:pointer; font-size:1.05em; box-shadow: 0 4px 6px rgba(0,0,0,0.15);">📄 학생용 프리미엄 설문지 인쇄 (A4)</button> </div> <div class="input-grid"> <div style="grid-column: span 2; background:#fff3e0; padding:12px; border-radius:8px; border:1px solid #ffcc80;"> <label style="color:#e65100; font-size:1em;">🔄 검사 회차 설정 (회차에 따라 문항 자동 변경)</label> <div style="display:flex; gap:20px; margin-top:8px;"> <label style="color:#333; font-weight:bold; cursor:pointer;"><input type="radio" name="sessionType" value="1" checked="" onchange="toggleSession()"> 1차 검사 (최초 진단)</label> <label style="color:#333; font-weight:bold; cursor:pointer;"><input type="radio" name="sessionType" value="2" onchange="toggleSession()"> 2차 검사 (추이 분석)</label> </div> </div> <div><label>검사 일시</label><input type="date" id="inDate"><script>document.currentScript.previousElementSibling.value=new Date().toISOString().slice(0,10);</script></div> <div><label>학교명</label><input type="text" id="inSchool" placeholder="스파르타중"></div> <div><label>학생명</label><input type="text" id="inName" placeholder="홍길동"></div> <div><label>학년 (학년별 거품 제거 알고리즘 적용)</label> <select id="inGrade" onchange="renderQuestions()"> <option value="elem">초등 5~6학년 (Step 1)</option> <option value="mid12">중등 1~2학년 (Step 2)</option> <option value="mid3" selected="">중등 3학년 (Step 3)</option> </select> </div> <div><label>희망 계열</label> <select id="inStream"> <option value="natural">NATURAL (자연/의학)</option> <option value="human">HUMAN (인문/사회)</option> <option value="convergence">CONVERGENCE (창의융합)</option> </select> </div> <div><label>인식 성향 (Q5)</label> <select id="inStyle"> <option value="master">마스터형</option> <option value="perfect">완벽주의형</option> <option value="follower">팔로워형</option> <option value="talent">지능의존형</option> </select> </div> <div style="grid-column: span 2; background:#f4faff; padding:15px; border-radius:8px; border:1px solid #b3d4ff;"> <label style="color:#0056b3; font-size:1.05em;">📊 [절대평가 지표] 학기별 교과 내신 성취도 (A~E)</label> <p style="font-size:0.8em; color:#555; margin:4px 0 8px 0; font-weight:bold;">* 성적이 아직 없는 초등학생 등은 "A (또는 성적없음)"을 선택하여 기본 잠재력 컷을 확인합니다.</p> <table class="grade-table"> <tbody><tr><th>과목</th><th>2학년 1학기</th><th>2학년 2학기</th><th>3학년 1학기</th><th>3학년 2학기</th></tr> </tbody><tbody id="gradeTbody"><tr><td style="font-weight:bold; color:var(--primary); background:#f0f4f8;">국어</td><td><select id="g-kor-21" data-touched="0" onchange="this.dataset.touched='1';this.style.outline='';updateGradeProgress();"> <option value="" selected>선택 안 함(필수)</option> <option value="90">A (또는 미응시)</option> <option value="70">B (-20점)</option> <option value="50">C (-40점)</option> <option value="30">D/E (탈락)</option> </select></td><td><select id="g-kor-22" data-touched="0" onchange="this.dataset.touched='1';this.style.outline='';updateGradeProgress();"> <option value="" selected>선택 안 함(필수)</option> <option value="90">A (또는 미응시)</option> <option value="70">B (-20점)</option> <option value="50">C (-40점)</option> <option value="30">D/E (탈락)</option> </select></td><td><select id="g-kor-31" data-touched="0" onchange="this.dataset.touched='1';this.style.outline='';updateGradeProgress();"> <option value="" selected>선택 안 함(필수)</option> <option value="90">A (또는 미응시)</option> <option value="70">B (-20점)</option> <option value="50">C (-40점)</option> <option value="30">D/E (탈락)</option> </select></td><td><select id="g-kor-32" data-touched="0" onchange="this.dataset.touched='1';this.style.outline='';updateGradeProgress();"> <option value="" selected>선택 안 함(필수)</option> <option value="90">A (또는 미응시)</option> <option value="70">B (-20점)</option> <option value="50">C (-40점)</option> <option value="30">D/E (탈락)</option> </select></td></tr><tr><td style="font-weight:bold; color:var(--primary); background:#f0f4f8;">영어</td><td><select id="g-eng-21" data-touched="0" onchange="this.dataset.touched='1';this.style.outline='';updateGradeProgress();"> <option value="" selected>선택 안 함(필수)</option> <option value="90">A (또는 미응시)</option> <option value="70">B (-20점)</option> <option value="50">C (-40점)</option> <option value="30">D/E (탈락)</option> </select></td><td><select id="g-eng-22" data-touched="0" onchange="this.dataset.touched='1';this.style.outline='';updateGradeProgress();"> <option value="" selected>선택 안 함(필수)</option> <option value="90">A (또는 미응시)</option> <option value="70">B (-20점)</option> <option value="50">C (-40점)</option> <option value="30">D/E (탈락)</option> </select></td><td><select id="g-eng-31" data-touched="0" onchange="this.dataset.touched='1';this.style.outline='';updateGradeProgress();"> <option value="" selected>선택 안 함(필수)</option> <option value="90">A (또는 미응시)</option> <option value="70">B (-20점)</option> <option value="50">C (-40점)</option> <option value="30">D/E (탈락)</option> </select></td><td><select id="g-eng-32" data-touched="0" onchange="this.dataset.touched='1';this.style.outline='';updateGradeProgress();"> <option value="" selected>선택 안 함(필수)</option> <option value="90">A (또는 미응시)</option> <option value="70">B (-20점)</option> <option value="50">C (-40점)</option> <option value="30">D/E (탈락)</option> </select></td></tr><tr><td style="font-weight:bold; color:var(--primary); background:#f0f4f8;">수학</td><td><select id="g-mat-21" data-touched="0" onchange="this.dataset.touched='1';this.style.outline='';updateGradeProgress();"> <option value="" selected>선택 안 함(필수)</option> <option value="90">A (또는 미응시)</option> <option value="70">B (-20점)</option> <option value="50">C (-40점)</option> <option value="30">D/E (탈락)</option> </select></td><td><select id="g-mat-22" data-touched="0" onchange="this.dataset.touched='1';this.style.outline='';updateGradeProgress();"> <option value="" selected>선택 안 함(필수)</option> <option value="90">A (또는 미응시)</option> <option value="70">B (-20점)</option> <option value="50">C (-40점)</option> <option value="30">D/E (탈락)</option> </select></td><td><select id="g-mat-31" data-touched="0" onchange="this.dataset.touched='1';this.style.outline='';updateGradeProgress();"> <option value="" selected>선택 안 함(필수)</option> <option value="90">A (또는 미응시)</option> <option value="70">B (-20점)</option> <option value="50">C (-40점)</option> <option value="30">D/E (탈락)</option> </select></td><td><select id="g-mat-32" data-touched="0" onchange="this.dataset.touched='1';this.style.outline='';updateGradeProgress();"> <option value="" selected>선택 안 함(필수)</option> <option value="90">A (또는 미응시)</option> <option value="70">B (-20점)</option> <option value="50">C (-40점)</option> <option value="30">D/E (탈락)</option> </select></td></tr><tr><td style="font-weight:bold; color:var(--primary); background:#f0f4f8;">과학</td><td><select id="g-sci-21" data-touched="0" onchange="this.dataset.touched='1';this.style.outline='';updateGradeProgress();"> <option value="" selected>선택 안 함(필수)</option> <option value="90">A (또는 미응시)</option> <option value="70">B (-20점)</option> <option value="50">C (-40점)</option> <option value="30">D/E (탈락)</option> </select></td><td><select id="g-sci-22" data-touched="0" onchange="this.dataset.touched='1';this.style.outline='';updateGradeProgress();"> <option value="" selected>선택 안 함(필수)</option> <option value="90">A (또는 미응시)</option> <option value="70">B (-20점)</option> <option value="50">C (-40점)</option> <option value="30">D/E (탈락)</option> </select></td><td><select id="g-sci-31" data-touched="0" onchange="this.dataset.touched='1';this.style.outline='';updateGradeProgress();"> <option value="" selected>선택 안 함(필수)</option> <option value="90">A (또는 미응시)</option> <option value="70">B (-20점)</option> <option value="50">C (-40점)</option> <option value="30">D/E (탈락)</option> </select></td><td><select id="g-sci-32" data-touched="0" onchange="this.dataset.touched='1';this.style.outline='';updateGradeProgress();"> <option value="" selected>선택 안 함(필수)</option> <option value="90">A (또는 미응시)</option> <option value="70">B (-20점)</option> <option value="50">C (-40점)</option> <option value="30">D/E (탈락)</option> </select></td></tr><tr><td style="font-weight:bold; color:var(--primary); background:#f0f4f8;">사회</td><td><select id="g-soc-21" data-touched="0" onchange="this.dataset.touched='1';this.style.outline='';updateGradeProgress();"> <option value="" selected>선택 안 함(필수)</option> <option value="90">A (또는 미응시)</option> <option value="70">B (-20점)</option> <option value="50">C (-40점)</option> <option value="30">D/E (탈락)</option> </select></td><td><select id="g-soc-22" data-touched="0" onchange="this.dataset.touched='1';this.style.outline='';updateGradeProgress();"> <option value="" selected>선택 안 함(필수)</option> <option value="90">A (또는 미응시)</option> <option value="70">B (-20점)</option> <option value="50">C (-40점)</option> <option value="30">D/E (탈락)</option> </select></td><td><select id="g-soc-31" data-touched="0" onchange="this.dataset.touched='1';this.style.outline='';updateGradeProgress();"> <option value="" selected>선택 안 함(필수)</option> <option value="90">A (또는 미응시)</option> <option value="70">B (-20점)</option> <option value="50">C (-40점)</option> <option value="30">D/E (탈락)</option> </select></td><td><select id="g-soc-32" data-touched="0" onchange="this.dataset.touched='1';this.style.outline='';updateGradeProgress();"> <option value="" selected>선택 안 함(필수)</option> <option value="90">A (또는 미응시)</option> <option value="70">B (-20점)</option> <option value="50">C (-40점)</option> <option value="30">D/E (탈락)</option> </select></td></tr><tr><td style="font-weight:bold; color:var(--primary); background:#f0f4f8;">역사</td><td><select id="g-his-21" data-touched="0" onchange="this.dataset.touched='1';this.style.outline='';updateGradeProgress();"> <option value="" selected>선택 안 함(필수)</option> <option value="90">A (또는 미응시)</option> <option value="70">B (-20점)</option> <option value="50">C (-40점)</option> <option value="30">D/E (탈락)</option> </select></td><td><select id="g-his-22" data-touched="0" onchange="this.dataset.touched='1';this.style.outline='';updateGradeProgress();"> <option value="" selected>선택 안 함(필수)</option> <option value="90">A (또는 미응시)</option> <option value="70">B (-20점)</option> <option value="50">C (-40점)</option> <option value="30">D/E (탈락)</option> </select></td><td><select id="g-his-31" data-touched="0" onchange="this.dataset.touched='1';this.style.outline='';updateGradeProgress();"> <option value="" selected>선택 안 함(필수)</option> <option value="90">A (또는 미응시)</option> <option value="70">B (-20점)</option> <option value="50">C (-40점)</option> <option value="30">D/E (탈락)</option> </select></td><td><select id="g-his-32" data-touched="0" onchange="this.dataset.touched='1';this.style.outline='';updateGradeProgress();"> <option value="" selected>선택 안 함(필수)</option> <option value="90">A (또는 미응시)</option> <option value="70">B (-20점)</option> <option value="50">C (-40점)</option> <option value="30">D/E (탈락)</option> </select></td></tr></tbody> </table> </div> <div style="background:#f3e5f5; padding:12px; border-radius:8px; border:1px solid #ce93d8;"> <label style="color:#6a1b9a;">🏆 [상대평가] 수학/과학 (이과) 모의고사 백분위</label> <select id="inMockMathSci" style="width:100%; margin-top:5px;" data-touched="0" onchange="this.dataset.touched='1';this.style.outline='';updateGradeProgress();"> <option value="" selected>선택 안 함(필수)</option> <option value="100">전국 상위 1% 이내 (의대/KMO 수준)</option> <option value="90">전국 상위 4% 이내 (1등급 / 최상위반)</option> <option value="85">성적 없음 (초등/기초 잠재력 평가용)</option> <option value="80">전국 상위 11% 이내 (2등급 / 상위반)</option> <option value="65">전국 상위 23% 이내 (3등급 / 일반반)</option> <option value="50">그 이하 (기초 학력 보완 필요)</option> </select> </div> <div style="background:#f3e5f5; padding:12px; border-radius:8px; border:1px solid #ce93d8;"> <label style="color:#6a1b9a;">🏆 [상대평가] 국어/영어 (문과) 모의고사 백분위</label> <select id="inMockKorEng" style="width:100%; margin-top:5px;" data-touched="0" onchange="this.dataset.touched='1';this.style.outline='';updateGradeProgress();"> <option value="" selected>선택 안 함(필수)</option> <option value="100">전국 상위 1% 이내 (최상위 외고 수준)</option> <option value="90">전국 상위 4% 이내 (1등급 / 최상위반)</option> <option value="85">성적 없음 (초등/기초 잠재력 평가용)</option> <option value="80">전국 상위 11% 이내 (2등급 / 상위반)</option> <option value="65">전국 상위 23% 이내 (3등급 / 일반반)</option> <option value="50">그 이하 (기초 학력 보완 필요)</option> </select> </div> <div style="background:#e8f5e9; padding:12px; border-radius:8px; border:1px solid #a5d6a7;"> <label style="color:#2e7d32;">📈 수학 선행/심화</label> <select id="inMathLevel" style="margin-top:5px;" data-touched="0" onchange="this.dataset.touched='1';this.style.outline='';updateGradeProgress();"> <option value="" selected>선택 안 함(필수)</option> <option value="100">고등 미적분/기하 실력 완성 (의대/영재고)</option> <option value="85">고등 수학(상/하), 수1 심화 진행 (자사고)</option> <option value="70">고등 공통수학 선행 (1회독 완료)</option> <option value="55">중등 심화 위주 (선행 안함)</option> <option value="40">현행 및 후행 보완 필요</option> </select> </div> <div style="background:#e8f5e9; padding:12px; border-radius:8px; border:1px solid #a5d6a7;"> <label style="color:#2e7d32;">📈 과학 선행/심화</label> <select id="inSciLevel" style="margin-top:5px;" data-touched="0" onchange="this.dataset.touched='1';this.style.outline='';updateGradeProgress();"> <option value="" selected>선택 안 함(필수)</option> <option value="100">물/화/생/지 I·II 수능 기출 풀이 가능</option> <option value="85">물/화 I 심화 및 문제풀이 진행</option> <option value="70">고1 통합과학 완벽 선행 (1회독 이상)</option> <option value="55">중등 과학 심화 위주 (선행 안함)</option> <option value="40">현행 과학 암기 위주 학습</option> </select> </div> <div style="background:#e8f5e9; padding:12px; border-radius:8px; border:1px solid #a5d6a7;"> <label style="color:#2e7d32;">📈 국어/영어 선행 (어학)</label> <select id="inEngLevel" style="margin-top:5px;" data-touched="0" onchange="this.dataset.touched='1';this.style.outline='';updateGradeProgress();"> <option value="" selected>선택 안 함(필수)</option> <option value="100">고3 수능 모의고사 1등급 안정권</option> <option value="85">고1~2 모의고사 1등급 / 텝스 수준</option> <option value="70">중등 심화 및 예비고1 기본 문법/구문</option> <option value="55">중등 내신 90점대 유지 (본문 암기형)</option> <option value="40">기본 독해 및 어휘 보완 시급</option> </select> </div> <div style="background:#e8f5e9; padding:12px; border-radius:8px; border:1px solid #a5d6a7;"> <label style="color:#2e7d32;">📈 역사/사회 (암기 방어력)</label> <select id="inHisLevel" style="margin-top:5px;" data-touched="0" onchange="this.dataset.touched='1';this.style.outline='';updateGradeProgress();"> <option value="" selected>선택 안 함(필수)</option> <option value="100">고1 통합사회/한국사 흐름 선행 완벽</option> <option value="85">중등 역사/세계사 흐름 파악 및 암기 능숙</option> <option value="70">시험 전 벼락치기로 A등급 방어 수준</option> <option value="40">암기 과목에 매우 취약함 (B등급 이하 발생)</option> </select> </div> <div id="prevScoreBox" style="grid-column: span 2; background:#fff5f5; padding:12px; border-radius:8px; border:1px solid #ffcdd2; display:none;"> <label style="color:#c62828;">📉 [추이 분석용] 직전 1차 진단 종합 점수 입력 (240점 만점)</label> <input type="number" id="inPrevScore" placeholder="예: 175" style="margin-top:5px; width:100%;"> </div> </div> <h4 style="color:var(--primary); margin-bottom:10px;">[Step 0. 기초 평가 16문항 데이터 입력]</h4> <div id="step0_inputs" style="display:grid; grid-template-columns: 1fr 1fr; gap:12px;"><div style="grid-column: 1 / -1; margin-bottom:8px;"><label style="font-size:0.85em; color:#555; font-weight:700; margin-bottom:4px; display:block;">1. 미래에 가장 깊게 공부해보고 싶은 관심 분야와 그 이유는?</label><input type="text" id="s0_0" style="width:100%; padding:10px; font-size:0.9em; border:1px solid #ccc; border-radius:5px;"></div><div style="grid-column: 1 / -1; margin-bottom:8px;"><label style="font-size:0.85em; color:#555; font-weight:700; margin-bottom:4px; display:block;">2. 평소 유튜브나 SNS에서 즐겨보는 콘텐츠 유형은?</label><input type="text" id="s0_1" style="width:100%; padding:10px; font-size:0.9em; border:1px solid #ccc; border-radius:5px;"></div><div style="grid-column: 1 / -1; margin-bottom:8px;"><label style="font-size:0.85em; color:#555; font-weight:700; margin-bottom:4px; display:block;">3. 나만의 특별한 '취미'나 남들보다 잘하는 '특기'는?</label><input type="text" id="s0_2" style="width:100%; padding:10px; font-size:0.9em; border:1px solid #ccc; border-radius:5px;"></div><div style="grid-column: 1 / -1; margin-bottom:8px;"><label style="font-size:0.85em; color:#555; font-weight:700; margin-bottom:4px; display:block;">4. 미래에 가고 싶은 '목표 고등학교'와 '장래희망'은?</label><input type="text" id="s0_3" style="width:100%; padding:10px; font-size:0.9em; border:1px solid #ccc; border-radius:5px;"></div><div style="grid-column: 1 / -1; margin-bottom:8px;"><label style="font-size:0.85em; color:#555; font-weight:700; margin-bottom:4px; display:block;">5. 본인이 생각하는 자신의 공부 스타일은?</label><input type="text" id="s0_4" style="width:100%; padding:10px; font-size:0.9em; border:1px solid #ccc; border-radius:5px;"></div><div style="grid-column: 1 / -1; margin-bottom:8px;"><label style="font-size:0.85em; color:#555; font-weight:700; margin-bottom:4px; display:block;">6. 주당 평균 사교육 시간 vs 순수 공부 시간의 비율은?</label><input type="text" id="s0_5" style="width:100%; padding:10px; font-size:0.9em; border:1px solid #ccc; border-radius:5px;"></div><div style=" margin-bottom:8px;"><label style="font-size:0.85em; color:#555; font-weight:700; margin-bottom:4px; display:block;">7. 수학 공식을 스스로 유도하거나 원리를 증명해 본 적 있는가?</label><select id="s0_6" style="width:100%; padding:8px; font-size:0.85em; border:1px solid #ccc; border-radius:5px;"><option value="O">O (그렇다)</option><option value="X">X (아니다)</option></select></div><div style=" margin-bottom:8px;"><label style="font-size:0.85em; color:#555; font-weight:700; margin-bottom:4px; display:block;">8. 교과서 외 관심 분야로 '주제 탐구 보고서'를 써봤는가?</label><select id="s0_7" style="width:100%; padding:8px; font-size:0.85em; border:1px solid #ccc; border-radius:5px;"><option value="O">O (그렇다)</option><option value="X">X (아니다)</option></select></div><div style=" margin-bottom:8px;"><label style="font-size:0.85em; color:#555; font-weight:700; margin-bottom:4px; display:block;">9. 최근 1년간 진로 관련 책을 5권 이상 정독했는가?</label><select id="s0_8" style="width:100%; padding:8px; font-size:0.85em; border:1px solid #ccc; border-radius:5px;"><option value="O">O (그렇다)</option><option value="X">X (아니다)</option></select></div><div style=" margin-bottom:8px;"><label style="font-size:0.85em; color:#555; font-weight:700; margin-bottom:4px; display:block;">10. 공부할 때 스마트폰 유혹을 스스로 완전히 통제하는가?</label><select id="s0_9" style="width:100%; padding:8px; font-size:0.85em; border:1px solid #ccc; border-radius:5px;"><option value="O">O (그렇다)</option><option value="X">X (아니다)</option></select></div><div style=" margin-bottom:8px;"><label style="font-size:0.85em; color:#555; font-weight:700; margin-bottom:4px; display:block;">11. 성적이 하락했을 때 감정에 휘둘리지 않고 원인을 분석하는가?</label><select id="s0_10" style="width:100%; padding:8px; font-size:0.85em; border:1px solid #ccc; border-radius:5px;"><option value="O">O (그렇다)</option><option value="X">X (아니다)</option></select></div><div style=" margin-bottom:8px;"><label style="font-size:0.85em; color:#555; font-weight:700; margin-bottom:4px; display:block;">12. 모르는 내용이 나오면 질문하거나 찾아 끝까지 해결하는가?</label><select id="s0_11" style="width:100%; padding:8px; font-size:0.85em; border:1px solid #ccc; border-radius:5px;"><option value="O">O (그렇다)</option><option value="X">X (아니다)</option></select></div><div style=" margin-bottom:8px;"><label style="font-size:0.85em; color:#555; font-weight:700; margin-bottom:4px; display:block;">13. 공부 잘하는 친구를 경쟁자보다 배우고 싶은 파트너로 보는가?</label><select id="s0_12" style="width:100%; padding:8px; font-size:0.85em; border:1px solid #ccc; border-radius:5px;"><option value="O">O (그렇다)</option><option value="X">X (아니다)</option></select></div><div style=" margin-bottom:8px;"><label style="font-size:0.85em; color:#555; font-weight:700; margin-bottom:4px; display:block;">14. 기숙사 생활의 엄격한 규칙(폰 사용 등)을 잘 지킬 자신이 있는가?</label><select id="s0_13" style="width:100%; padding:8px; font-size:0.85em; border:1px solid #ccc; border-radius:5px;"><option value="O">O (그렇다)</option><option value="X">X (아니다)</option></select></div><div style=" margin-bottom:8px;"><label style="font-size:0.85em; color:#555; font-weight:700; margin-bottom:4px; display:block;">15. 매일 일정한 시간에 기상하고 취침하는 생활 루틴이 있는가?</label><select id="s0_14" style="width:100%; padding:8px; font-size:0.85em; border:1px solid #ccc; border-radius:5px;"><option value="O">O (그렇다)</option><option value="X">X (아니다)</option></select></div><div style=" margin-bottom:8px;"><label style="font-size:0.85em; color:#555; font-weight:700; margin-bottom:4px; display:block;">16. 진단 결과를 통해 정확한 합격 가능성을 알고 싶은가?</label><select id="s0_15" style="width:100%; padding:8px; font-size:0.85em; border:1px solid #ccc; border-radius:5px;"><option value="O">O (그렇다)</option><option value="X">X (아니다)</option></select></div></div> <h4 style="color:var(--primary); margin-top:25px; margin-bottom:10px;">[4대 역량 진단 데이터 입력 (1~10점)]</h4> <div id="main_inputs"><div style="margin-bottom: 15px;"><b style="color:var(--primary); font-size:1.05em;">탐구(A) 영역</b><div style="display: grid; grid-template-columns: 1fr 1fr; gap: 10px; margin-top: 5px;"><div style="font-size:0.85em; background:#f9f9f9; padding:6px 12px; border-radius:6px; border:1px solid #ddd; display:flex; justify-content:space-between; align-items:center;"> <span style="flex:1;">목표 학교 인재상에 맞는 탐구 사례가 있는가?</span> <div style="display:flex; align-items:center; width:110px; justify-content:flex-end;"> <input type="range" class="q-val" data-domain="A" min="1" max="10" value="7" data-touched="0" oninput="this.nextElementSibling.innerText=this.value;this.dataset.touched='1'" style="width:70px;"> <span style="font-weight:900; color:var(--primary); width:20px; text-align:right; margin-left:10px;">7</span> </div> </div><div style="font-size:0.85em; background:#f9f9f9; padding:6px 12px; border-radius:6px; border:1px solid #ddd; display:flex; justify-content:space-between; align-items:center;"> <span style="flex:1;">지적 호기심 해결을 위해 논문을 탐독하는가?</span> <div style="display:flex; align-items:center; width:110px; justify-content:flex-end;"> <input type="range" class="q-val" data-domain="A" min="1" max="10" value="7" data-touched="0" oninput="this.nextElementSibling.innerText=this.value;this.dataset.touched='1'" style="width:70px;"> <span style="font-weight:900; color:var(--primary); width:20px; text-align:right; margin-left:10px;">7</span> </div> </div><div style="font-size:0.85em; background:#f9f9f9; padding:6px 12px; border-radius:6px; border:1px solid #ddd; display:flex; justify-content:space-between; align-items:center;"> <span style="flex:1;">융합 탐구 전 과정을 주도적으로 수행했는가?</span> <div style="display:flex; align-items:center; width:110px; justify-content:flex-end;"> <input type="range" class="q-val" data-domain="A" min="1" max="10" value="7" data-touched="0" oninput="this.nextElementSibling.innerText=this.value;this.dataset.touched='1'" style="width:70px;"> <span style="font-weight:900; color:var(--primary); width:20px; text-align:right; margin-left:10px;">7</span> </div> </div><div style="font-size:0.85em; background:#f9f9f9; padding:6px 12px; border-radius:6px; border:1px solid #ddd; display:flex; justify-content:space-between; align-items:center;"> <span style="flex:1;">심화 수학 가중치를 견딜 역량을 갖췄는가?</span> <div style="display:flex; align-items:center; width:110px; justify-content:flex-end;"> <input type="range" class="q-val" data-domain="A" min="1" max="10" value="7" data-touched="0" oninput="this.nextElementSibling.innerText=this.value;this.dataset.touched='1'" style="width:70px;"> <span style="font-weight:900; color:var(--primary); width:20px; text-align:right; margin-left:10px;">7</span> </div> </div><div style="font-size:0.85em; background:#f9f9f9; padding:6px 12px; border-radius:6px; border:1px solid #ddd; display:flex; justify-content:space-between; align-items:center;"> <span style="flex:1;">사회/글로벌 이슈에 대한 비판적 사고가 뚜렷한가?</span> <div style="display:flex; align-items:center; width:110px; justify-content:flex-end;"> <input type="range" class="q-val" data-domain="A" min="1" max="10" value="7" data-touched="0" oninput="this.nextElementSibling.innerText=this.value;this.dataset.touched='1'" style="width:70px;"> <span style="font-weight:900; color:var(--primary); width:20px; text-align:right; margin-left:10px;">7</span> </div> </div><div style="font-size:0.85em; background:#f9f9f9; padding:6px 12px; border-radius:6px; border:1px solid #ddd; display:flex; justify-content:space-between; align-items:center;"> <span style="flex:1;">탐구 활동이 세특에 팩트 위주로 적혔는가?</span> <div style="display:flex; align-items:center; width:110px; justify-content:flex-end;"> <input type="range" class="q-val" data-domain="A" min="1" max="10" value="7" data-touched="0" oninput="this.nextElementSibling.innerText=this.value;this.dataset.touched='1'" style="width:70px;"> <span style="font-weight:900; color:var(--primary); width:20px; text-align:right; margin-left:10px;">7</span> </div> </div></div></div><div style="margin-bottom: 15px;"><b style="color:var(--primary); font-size:1.05em;">주도(B) 영역</b><div style="display: grid; grid-template-columns: 1fr 1fr; gap: 10px; margin-top: 5px;"><div style="font-size:0.85em; background:#f9f9f9; padding:6px 12px; border-radius:6px; border:1px solid #ddd; display:flex; justify-content:space-between; align-items:center;"> <span style="flex:1;">자소서 소재가 될 킬러 콘텐츠가 3개 이상인가?</span> <div style="display:flex; align-items:center; width:110px; justify-content:flex-end;"> <input type="range" class="q-val" data-domain="B" min="1" max="10" value="7" data-touched="0" oninput="this.nextElementSibling.innerText=this.value;this.dataset.touched='1'" style="width:70px;"> <span style="font-weight:900; color:var(--primary); width:20px; text-align:right; margin-left:10px;">7</span> </div> </div><div style="font-size:0.85em; background:#f9f9f9; padding:6px 12px; border-radius:6px; border:1px solid #ddd; display:flex; justify-content:space-between; align-items:center;"> <span style="flex:1;">압박 질문에도 논리적으로 답변할 수 있는가?</span> <div style="display:flex; align-items:center; width:110px; justify-content:flex-end;"> <input type="range" class="q-val" data-domain="B" min="1" max="10" value="7" data-touched="0" oninput="this.nextElementSibling.innerText=this.value;this.dataset.touched='1'" style="width:70px;"> <span style="font-weight:900; color:var(--primary); width:20px; text-align:right; margin-left:10px;">7</span> </div> </div><div style="font-size:0.85em; background:#f9f9f9; padding:6px 12px; border-radius:6px; border:1px solid #ddd; display:flex; justify-content:space-between; align-items:center;"> <span style="flex:1;">지원 동기를 학교 특성에 맞춰 설명하는가?</span> <div style="display:flex; align-items:center; width:110px; justify-content:flex-end;"> <input type="range" class="q-val" data-domain="B" min="1" max="10" value="7" data-touched="0" oninput="this.nextElementSibling.innerText=this.value;this.dataset.touched='1'" style="width:70px;"> <span style="font-weight:900; color:var(--primary); width:20px; text-align:right; margin-left:10px;">7</span> </div> </div><div style="font-size:0.85em; background:#f9f9f9; padding:6px 12px; border-radius:6px; border:1px solid #ddd; display:flex; justify-content:space-between; align-items:center;"> <span style="flex:1;">두괄식 답변과 근거 제시 말하기가 습관화됐는가?</span> <div style="display:flex; align-items:center; width:110px; justify-content:flex-end;"> <input type="range" class="q-val" data-domain="B" min="1" max="10" value="7" data-touched="0" oninput="this.nextElementSibling.innerText=this.value;this.dataset.touched='1'" style="width:70px;"> <span style="font-weight:900; color:var(--primary); width:20px; text-align:right; margin-left:10px;">7</span> </div> </div><div style="font-size:0.85em; background:#f9f9f9; padding:6px 12px; border-radius:6px; border:1px solid #ddd; display:flex; justify-content:space-between; align-items:center;"> <span style="flex:1;">나의 공부 방식이 통할 객관적 증거가 있는가?</span> <div style="display:flex; align-items:center; width:110px; justify-content:flex-end;"> <input type="range" class="q-val" data-domain="B" min="1" max="10" value="7" data-touched="0" oninput="this.nextElementSibling.innerText=this.value;this.dataset.touched='1'" style="width:70px;"> <span style="font-weight:900; color:var(--primary); width:20px; text-align:right; margin-left:10px;">7</span> </div> </div><div style="font-size:0.85em; background:#f9f9f9; padding:6px 12px; border-radius:6px; border:1px solid #ddd; display:flex; justify-content:space-between; align-items:center;"> <span style="flex:1;">인성 영역의 구체적 실천 사례가 있는가?</span> <div style="display:flex; align-items:center; width:110px; justify-content:flex-end;"> <input type="range" class="q-val" data-domain="B" min="1" max="10" value="7" data-touched="0" oninput="this.nextElementSibling.innerText=this.value;this.dataset.touched='1'" style="width:70px;"> <span style="font-weight:900; color:var(--primary); width:20px; text-align:right; margin-left:10px;">7</span> </div> </div></div></div><div style="margin-bottom: 15px;"><b style="color:var(--primary); font-size:1.05em;">정서(C) 영역</b><div style="display: grid; grid-template-columns: 1fr 1fr; gap: 10px; margin-top: 5px;"><div style="font-size:0.85em; background:#f9f9f9; padding:6px 12px; border-radius:6px; border:1px solid #ddd; display:flex; justify-content:space-between; align-items:center;"> <span style="flex:1;">내신 등급이 급락해도 버틸 회복탄력성이 있는가?</span> <div style="display:flex; align-items:center; width:110px; justify-content:flex-end;"> <input type="range" class="q-val" data-domain="C" min="1" max="10" value="7" data-touched="0" oninput="this.nextElementSibling.innerText=this.value;this.dataset.touched='1'" style="width:70px;"> <span style="font-weight:900; color:var(--primary); width:20px; text-align:right; margin-left:10px;">7</span> </div> </div><div style="font-size:0.85em; background:#f9f9f9; padding:6px 12px; border-radius:6px; border:1px solid #ddd; display:flex; justify-content:space-between; align-items:center;"> <span style="flex:1;">동료를 적이 아닌 파트너로 보고 협업하는가?</span> <div style="display:flex; align-items:center; width:110px; justify-content:flex-end;"> <input type="range" class="q-val" data-domain="C" min="1" max="10" value="7" data-touched="0" oninput="this.nextElementSibling.innerText=this.value;this.dataset.touched='1'" style="width:70px;"> <span style="font-weight:900; color:var(--primary); width:20px; text-align:right; margin-left:10px;">7</span> </div> </div><div style="font-size:0.85em; background:#f9f9f9; padding:6px 12px; border-radius:6px; border:1px solid #ddd; display:flex; justify-content:space-between; align-items:center;"> <span style="flex:1;">치열한 경쟁 긴장감을 즐거움으로 승화시키는가?</span> <div style="display:flex; align-items:center; width:110px; justify-content:flex-end;"> <input type="range" class="q-val" data-domain="C" min="1" max="10" value="7" data-touched="0" oninput="this.nextElementSibling.innerText=this.value;this.dataset.touched='1'" style="width:70px;"> <span style="font-weight:900; color:var(--primary); width:20px; text-align:right; margin-left:10px;">7</span> </div> </div><div style="font-size:0.85em; background:#f9f9f9; padding:6px 12px; border-radius:6px; border:1px solid #ddd; display:flex; justify-content:space-between; align-items:center;"> <span style="flex:1;">한 문제에 매몰되지 않고 흐름을 관리하는가?</span> <div style="display:flex; align-items:center; width:110px; justify-content:flex-end;"> <input type="range" class="q-val" data-domain="C" min="1" max="10" value="7" data-touched="0" oninput="this.nextElementSibling.innerText=this.value;this.dataset.touched='1'" style="width:70px;"> <span style="font-weight:900; color:var(--primary); width:20px; text-align:right; margin-left:10px;">7</span> </div> </div><div style="font-size:0.85em; background:#f9f9f9; padding:6px 12px; border-radius:6px; border:1px solid #ddd; display:flex; justify-content:space-between; align-items:center;"> <span style="flex:1;">실패의 원인을 나의 전략 수정에서 찾는가?</span> <div style="display:flex; align-items:center; width:110px; justify-content:flex-end;"> <input type="range" class="q-val" data-domain="C" min="1" max="10" value="7" data-touched="0" oninput="this.nextElementSibling.innerText=this.value;this.dataset.touched='1'" style="width:70px;"> <span style="font-weight:900; color:var(--primary); width:20px; text-align:right; margin-left:10px;">7</span> </div> </div><div style="font-size:0.85em; background:#f9f9f9; padding:6px 12px; border-radius:6px; border:1px solid #ddd; display:flex; justify-content:space-between; align-items:center;"> <span style="flex:1;">현재 페이스가 입시 당일까지 지속 가능한가?</span> <div style="display:flex; align-items:center; width:110px; justify-content:flex-end;"> <input type="range" class="q-val" data-domain="C" min="1" max="10" value="7" data-touched="0" oninput="this.nextElementSibling.innerText=this.value;this.dataset.touched='1'" style="width:70px;"> <span style="font-weight:900; color:var(--primary); width:20px; text-align:right; margin-left:10px;">7</span> </div> </div></div></div><div style="margin-bottom: 15px;"><b style="color:var(--primary); font-size:1.05em;">습관(D) 영역</b><div style="display: grid; grid-template-columns: 1fr 1fr; gap: 10px; margin-top: 5px;"><div style="font-size:0.85em; background:#f9f9f9; padding:6px 12px; border-radius:6px; border:1px solid #ddd; display:flex; justify-content:space-between; align-items:center;"> <span style="flex:1;">'3무 문화' 기숙 생활을 견딜 각오가 되었는가?</span> <div style="display:flex; align-items:center; width:110px; justify-content:flex-end;"> <input type="range" class="q-val" data-domain="D" min="1" max="10" value="7" data-touched="0" oninput="this.nextElementSibling.innerText=this.value;this.dataset.touched='1'" style="width:70px;"> <span style="font-weight:900; color:var(--primary); width:20px; text-align:right; margin-left:10px;">7</span> </div> </div><div style="font-size:0.85em; background:#f9f9f9; padding:6px 12px; border-radius:6px; border:1px solid #ddd; display:flex; justify-content:space-between; align-items:center;"> <span style="flex:1;">외부 강제성 없이 매일 5시간 이상의 순공를 하는가?</span> <div style="display:flex; align-items:center; width:110px; justify-content:flex-end;"> <input type="range" class="q-val" data-domain="D" min="1" max="10" value="7" data-touched="0" oninput="this.nextElementSibling.innerText=this.value;this.dataset.touched='1'" style="width:70px;"> <span style="font-weight:900; color:var(--primary); width:20px; text-align:right; margin-left:10px;">7</span> </div> </div><div style="font-size:0.85em; background:#f9f9f9; padding:6px 12px; border-radius:6px; border:1px solid #ddd; display:flex; justify-content:space-between; align-items:center;"> <span style="flex:1;">기숙사 규칙 준수 및 자기 절제 능력이 있는가?</span> <div style="display:flex; align-items:center; width:110px; justify-content:flex-end;"> <input type="range" class="q-val" data-domain="D" min="1" max="10" value="7" data-touched="0" oninput="this.nextElementSibling.innerText=this.value;this.dataset.touched='1'" style="width:70px;"> <span style="font-weight:900; color:var(--primary); width:20px; text-align:right; margin-left:10px;">7</span> </div> </div><div style="font-size:0.85em; background:#f9f9f9; padding:6px 12px; border-radius:6px; border:1px solid #ddd; display:flex; justify-content:space-between; align-items:center;"> <span style="flex:1;">매일 '진짜 공부 시간'을 철저히 기록하는가?</span> <div style="display:flex; align-items:center; width:110px; justify-content:flex-end;"> <input type="range" class="q-val" data-domain="D" min="1" max="10" value="7" data-touched="0" oninput="this.nextElementSibling.innerText=this.value;this.dataset.touched='1'" style="width:70px;"> <span style="font-weight:900; color:var(--primary); width:20px; text-align:right; margin-left:10px;">7</span> </div> </div><div style="font-size:0.85em; background:#f9f9f9; padding:6px 12px; border-radius:6px; border:1px solid #ddd; display:flex; justify-content:space-between; align-items:center;"> <span style="flex:1;">장소 상관없이 즉시 몰입 모드가 가능한가?</span> <div style="display:flex; align-items:center; width:110px; justify-content:flex-end;"> <input type="range" class="q-val" data-domain="D" min="1" max="10" value="7" data-touched="0" oninput="this.nextElementSibling.innerText=this.value;this.dataset.touched='1'" style="width:70px;"> <span style="font-weight:900; color:var(--primary); width:20px; text-align:right; margin-left:10px;">7</span> </div> </div><div style="font-size:0.85em; background:#f9f9f9; padding:6px 12px; border-radius:6px; border:1px solid #ddd; display:flex; justify-content:space-between; align-items:center;"> <span style="flex:1;">1점을 더 따기 위한 집요한 학습 근성이 있는가?</span> <div style="display:flex; align-items:center; width:110px; justify-content:flex-end;"> <input type="range" class="q-val" data-domain="D" min="1" max="10" value="7" data-touched="0" oninput="this.nextElementSibling.innerText=this.value;this.dataset.touched='1'" style="width:70px;"> <span style="font-weight:900; color:var(--primary); width:20px; text-align:right; margin-left:10px;">7</span> </div> </div></div></div></div> <div id="gradeProgressIndicator" style="text-align:center;font-size:0.85em;font-weight:700;color:#c62828;margin-top:10px;">교과내신·모의고사·선행 입력: 0/24</div> <button onclick="generateReport()" style="width:100%; padding:18px; background:var(--primary); color:white; border:none; border-radius:8px; cursor:pointer; font-size:1.2em; font-weight:900; margin-top:10px; box-shadow: 0 4px 15px rgba(26,35,126,0.2);">최종 리포트 생성 및 인쇄</button> </div> <div class="page" id="p1" style="display:none;"> <div class="cover-content"> <div class="cover-title">APEX 학업역량 정밀진단 리포트</div> <div class="cover-desc"> 본 검사는 단순한 성적을 넘어 특목·자사고 합격과 입학 후 최상위권 유지를 결정짓는 '비인지적 핵심 역량'을 측정하는 도구입니다. 9개 명문 고교의 선발 DNA인 탐구, 주도, 정서, 습관의 4대 영역을 다각도로 분석하여 학생의 입시 근육을 진단합니다. <br><br> <b>[V26 프리미엄 알고리즘 적용]</b> 본 리포트는 중학교 A등급의 착시 현상을 제거하기 위해, <b>[수학/과학] 및 [국어/영어] 전국 모의고사 백분위를 분리 적용</b>하고, 실제 9개 고교의 <b>무면접/면접 전형별 과목 가중치</b>를 100% 반영한 초정밀 알고리즘을 사용합니다. 특히 학생 연령별 자기 과대평가를 방지하는 '메타인지 거품 제거 로직'이 가동되며, 입학 선발 가능성을 넘어 치열한 내신 경쟁에서 살아남을 수 있는 '실전 생존 지수'를 분리하여 예측합니다. </div> <table class="info-table"> <tbody><tr><td class="label">검사 회차</td><td id="outSessionText" style="color:var(--secondary);"></td></tr> <tr><td class="label">검사 일시</td><td id="outDate"></td></tr> <tr><td class="label">학 교</td><td id="outSchool"></td></tr> <tr><td class="label">학 년</td><td id="outGrade"></td></tr> <tr><td class="label">이 름</td><td id="outName"></td></tr> </tbody></table> </div> <div class="footer">Page 1 | APEX Academic Intelligence System by Sparta</div> </div> <div class="page" id="p2" style="display:none;"> <div class="report-header" id="header-p2"></div> <h3 style="margin-top:0;">📋 Step 0. 기초 학습 환경 및 진로 인식 데이터 (16문항)</h3> <div id="step0_display" class="survey-grid"></div> <div class="analysis-box" style="margin-top:15px; padding: 15px 20px;"> <b>💡 진단 데이터의 가치:</b> 위 기초 정보는 학생의 학업 성취 이면에 숨겨진 '학습 근력'을 해석하는 결정적인 필터입니다. 교육전문가는 학생의 주관적인 자기 인식과 실제 습관 데이터 사이의 괴리를 분석하여, 입학 후 발생할 수 있는 성적 변동성과 적응 리스크를 선제적으로 파악합니다. </div> <div class="footer">Page 2 | APEX Academic Intelligence System by Sparta</div> </div> <div class="page" id="p3" style="display:none;"> <div class="report-header" id="header-p3"></div> <h3>📝 4대 핵심 역량별 정밀 진단 상세 데이터</h3> <p style="color:#666; font-size:0.9em; margin-bottom:10px;">* 아래 수치는 학생의 평소 태도와 실재하는 행동 증거(Fact)를 1~10점으로 환산한 결과입니다.</p> <div id="main_survey_display"></div> <div class="footer">Page 3 | APEX Academic Intelligence System by Sparta</div> </div> <div class="page" id="p4" style="display:none;"> <div class="report-header" id="header-p4"></div> <h3>🔍 학업역량 정밀진단 시스템 개요</h3> <div id="step_overview_box" class="analysis-box" style="background: white; border-left: 8px solid var(--primary);"></div> <div class="total-box"> <div style="font-weight:700; color: #666; letter-spacing: 2px;" id="totalBoxTitle">학업역량 정밀진단 종합 지수 (거품 제거 전 원점수)</div> <div class="total-val"> <span id="resTotal">0 / 240</span> <span id="trendBadge" class="trend-badge" style="display:none;"></span> </div> <div style="font-size:1.4em; font-weight:900; color:var(--secondary);" id="resTier"></div> </div> <div style="display:grid; grid-template-columns: 1fr 1fr; gap: 20px; align-items: center; margin-top:20px;"> <div style="text-align:center;"> <div style="height: 320px; position: relative;"> <canvas id="radarChart"></canvas> </div> <p style="font-size:0.8em; color:#777; margin-top:5px; font-weight:bold;">* 점(Dot)은 4대 영역별 실재하는 구체적 Fact 데이터입니다.</p> </div> <div> <h3>🏆 교육전문가 종합 정밀 진단</h3> <div id="resSummary" class="analysis-box" style="background:#fff; margin-bottom:0; line-height: 1.7;"></div> <div id="mismatchArea"></div> </div> </div> <div class="footer">Page 4 | APEX Academic Intelligence System by Sparta</div> </div> <div class="page" id="p5" style="display:none;"> <div class="report-header" id="header-p5"></div> <h3>📊 4대 핵심 역량별 심층 분석 (Part 1)</h3> <div id="domainPart1"></div> <div class="footer">Page 5 | APEX Academic Intelligence System by Sparta</div> </div> <div class="page" id="p6" style="display:none;"> <div class="report-header" id="header-p6"></div> <h3>📊 4대 핵심 역량별 심층 분석 (Part 2)</h3> <div id="domainPart2"></div> <h3 style="margin-top: 15px;">📝 역량 평가 척도(Rubric) 가이드</h3> <div style="background:#f4f7f9; padding:15px 20px; border-radius:10px; line-height: 1.5; font-size:0.88em;"> <div style="margin-bottom: 6px;"><b>💎 전문가 (Master / 9~10점):</b> 해당 역량을 증명할 구체적 사례와 탐구 보고서 등의 결과물이 실재합니다. 현상의 원리에 대해 스스로 '왜?'라고 질문하며 난제 해결을 즐기는 단계로, 어떤 경쟁 환경에서도 최상위권을 유지할 DNA를 보유하고 있습니다.</div> <div style="margin-bottom: 6px;"><b>✅ 숙련 (Proficient / 7~8점):</b> 성실하게 수행 중이나 사례가 평범하며 특목고 입학 후 내신 경쟁을 견딜 안정적 기초 체력 단계입니다.</div> <div style="margin-bottom: 6px;"><b>⚠ 발전 (Developing / 5~6점):</b> 필요성은 인지하나 기복이 심하며 특정 흥미 분야 외에는 학습 습관이 부족한 단계입니다.</div> <div style="margin-bottom: 0;"><b>❌ 결손 주의 (Critical / 4점 이하):</b> 메타인지가 부족하고 환경 통제가 불가능한 상태로, 특목고 입학 시 중도 탈락 위험이 높은 위험군입니다.</div> </div> <div class="footer">Page 6 | APEX Academic Intelligence System by Sparta</div> </div> <div class="page" id="p7" style="display:none;"> <div class="report-header" id="header-p7"></div> <div id="gradeIndexArea" style="margin-bottom: 15px;"></div> <h3 style="margin-top: 15px; margin-bottom:10px;">🏫 주요 9개 명문 고교 선발 DNA 매칭 결과</h3> <div class="school-grid" id="schoolGrid"></div> <div style="margin-top:15px; font-size:0.8em; text-align:right; color:#666; font-weight:bold; background:#f4f7f9; padding:6px; border-radius:5px;"> [판정 기준] <span class="gap-plus">권장평균 +2 이상: 안정 합격권</span> | -3 ~ +2: 전략 지원 검토 | <span class="gap-minus">-3 미만: 위험/하향지원 고려</span> </div> <div style="margin-top:15px; padding:15px 20px; background: var(--primary); color: white; border-radius:10px;"> <h3 style="color: white; border-left-color: var(--gold); margin-top: 0; font-size:1.15em; margin-bottom:8px;">🎯 교육전문가 1:1 입시 로드맵 확정 상담</h3> <p style="line-height:1.5; font-size: 0.9em; margin-bottom:0;"> 본 리포트의 학교별 적합도 점수는 단순히 성적이 아닌 APEX만의 명문고 선발 알고리즘이 적용된 결과입니다. 단순히 과목별 선행 학습만으로 학교를 선택할 경우, 입학 후 성향 불일치로 인해 입시 실패를 겪는 경우가 많습니다. 상기 도출된 데이터를 바탕으로 우리 아이에게 가장 유리한 최적 조합을 확정하기 위해, 반드시 교육전문가와의 심층 면담을 예약해 주시기 바랍니다. </p> </div> <div id="matchNoteArea" style="margin-top:6px; font-size:0.55em; line-height:1.3; color:#999; text-align:left;"> * 매칭 점수 vs 실전 생존 지수의 차이점: 매칭 점수는 학교별 입시 요강(과목 가중치/면접 비율)을 적용한 '합격 확률(입학 컷)'이며, 실전 생존 지수는 합격 이후 전교 1등들이 모인 심해에서 버틸 수 있는 '멘탈/습관 방어력'입니다. 생존 지수가 70점 미만일 경우 입학 후 적응 리스크가 크므로 매칭 점수에 강력한 감점(유리턱 페널티)이 적용됩니다. </div> <div class="footer">Page 7 | APEX Academic Intelligence System by Sparta</div> </div> <div class="page" id="p8" style="display:none;"> <div class="report-header" id="header-p8"></div> <h3>🚀 점수대별 맞춤형 AI 스투케어(STUCARE) 관리 전략</h3> <div id="stucareStrategic" class="analysis-box" style="background: white; border-left: 8px solid var(--secondary);"></div> <h3 style="margin-top: 30px;">📋 APEX 3단계 실전 입시 솔루션</h3> <div class="stucare-roadmap" id="stucareRoadmapContainer"></div> <div style="margin-top:30px; text-align:center;" class="no-print"> <button onclick="_apexPrintNow()" style="background:#d32f2f; padding:15px 50px; color:white; border:none; border-radius:8px; font-weight:900; cursor:pointer; font-size:1.1em; box-shadow: 0 4px 15px rgba(211,47,47,0.3);">최종 리포트 PDF 저장 및 인쇄</button> </div> <div class="footer">Page 8 | APEX Academic Intelligence System by Sparta</div> </div> </div> <script> // --- 설문 문항 세트 --- const step0_short_1 = [ "1. 미래에 가장 깊게 공부해보고 싶은 관심 분야와 그 이유는?", "2. 평소 유튜브나 SNS에서 즐겨보는 콘텐츠 유형은?", "3. 나만의 특별한 '취미'나 남들보다 잘하는 '특기'는?", "4. 미래에 가고 싶은 '목표 고등학교'와 '장래희망'은?", "5. 본인이 생각하는 자신의 공부 스타일은?", "6. 주당 평균 사교육 시간 vs 순수 공부 시간의 비율은?", "7. 수학 공식을 스스로 유도하거나 원리를 증명해 본 적 있는가?", "8. 교과서 외 관심 분야로 '주제 탐구 보고서'를 써봤는가?", "9. 최근 1년간 진로 관련 책을 5권 이상 정독했는가?", "10. 공부할 때 스마트폰 유혹을 스스로 완전히 통제하는가?", "11. 성적이 하락했을 때 감정에 휘둘리지 않고 원인을 분석하는가?", "12. 모르는 내용이 나오면 질문하거나 찾아 끝까지 해결하는가?", "13. 공부 잘하는 친구를 경쟁자보다 배우고 싶은 파트너로 보는가?", "14. 기숙사 생활의 엄격한 규칙(폰 사용 등)을 잘 지킬 자신이 있는가?", "15. 매일 일정한 시간에 기상하고 취침하는 생활 루틴이 있는가?", "16. 진단 결과를 통해 정확한 합격 가능성을 알고 싶은가?" ]; const step0_short_2 = [ "1. 지난 검사 이후 관심 분야의 구체적인 변화나 발전은?", "2. 최근 학습 목적으로 자발적으로 찾아본 영상 콘텐츠는?", "3. 최근 스트레스 해소용으로 건전하게 수행한 취미 활동은?", "4. 목표 고교 진학에 대한 최근의 의지 변화(상승/하락)?", "5. 현재 자신의 공부법 중 가장 개선하고 싶은 점은?", "6. 최근 1개월 순수 자기주도 학습 시간의 증감 여부는?", "7. 최근 어려운 수/과학 문제를 30분 이상 끈질기게 고민했는가?", "8. 최근 수행평가/과제 시 추가로 심화 탐구를 진행했는가?", "9. 지난 검사 이후 진로/전공 관련 자료를 스스로 찾아 읽었는가?", "10. 알림이 울려도 즉각 확인하지 않고 정해진 시간에만 보는가?", "11. 최근 실수했을 때 좌절보다 오답 분석을 먼저 실행했는가?", "12. 모르는 부분을 선생님/조교님께 논리적으로 질문하는 빈도가 늘었는가?", "13. 최근 친구와 학습 내용에 대해 긍정적으로 토론한 적 있는가?", "14. 주말에도 평일과 유사한 기상 시간을 스스로 지키고 있는가?", "15. 최근 1개월 내 수면 부족으로 수업에 존 적이 없는가?", "16. 이번 검사를 통해 스스로의 약점을 직면하고 개선할 의지가 있는가?" ]; // 프린트용 분할 배열 const step0_detail_1_part1 = [ "1. 미래에 가장 깊게 공부해보고 싶은 관심 분야(전공)는 무엇이며, 그 이유는 무엇입니까?", "2. 평소 유튜브나 SNS에서 가장 즐겨보는 콘텐츠 유형 3가지는 무엇입니까?", "3. 남들에게 자신 있게 말할 수 있는 나만의 특별한 '취미'나 '특기'는 무엇입니까?", "4. 현재 진학을 희망하는 '목표 고등학교'와 구체적인 '장래희망(직업)'을 적어주세요.", "5. 본인이 생각하는 자신의 공부 스타일은 어디에 가깝습니까? (마스터형/완벽주의형/팔로워형/지능의존형)", "6. 일주일 평균 '학원/과외 시간'과 혼자 공부하는 '순수 공부 시간'의 비율은 대략 몇 대 몇 입니까?", "7. [O/X] 수학 공식을 무작정 암기하지 않고, 스스로 유도해 보거나 원리를 증명해 본 적이 있습니까?", "8. [O/X] 교과서 내용 외에 지적 호기심이 생겨 스스로 '주제 탐구 보고서'를 찾아 써본 적이 있습니까?" ]; const step0_detail_1_part2 = [ "9. [O/X] 최근 1년 동안 자신의 진로와 관련된 전문 서적(비문학)을 5권 이상 끝까지 정독했습니까?", "10. [O/X] 공부할 때 스마트폰을 다른 방에 두는 등 유혹을 물리적으로 완벽히 통제하고 있습니까?", "11. [O/X] 시험 성적이 떨어졌을 때, 우울해하기보다 즉시 오답 원인을 분석하고 다음 계획을 세웁니까?", "12. [O/X] 공부하다 모르는 개념이 나오면, 답지를 보기 전 선생님께 질문하거나 끝까지 파고들어 해결합니까?", "13. [O/X] 나보다 성적이 좋은 친구를 시기하거나 질투하기보다, 배울 점을 찾는 파트너로 생각합니까?", "14. [O/X] 전자기기 압수, 엄격한 점호 등 특목고/자사고의 기숙사 규칙을 스트레스 없이 지킬 자신이 있습니까?", "15. [O/X] 주말과 평일 상관없이 매일 일정한 시간에 자고 일어나는 확고한 생활 루틴이 있습니까?", "16. [O/X] 본 진단 결과를 통해 특목고/자사고 합격 가능성과 나의 냉정한 현실을 직면할 준비가 되었습니까?" ]; const step0_detail_2_part1 = [ "1. 지난 1차 검사 이후, 진로 방향이나 깊게 탐구해보고 싶은 관심 분야에 긍정적인 변화나 발전이 있었습니까?", "2. 최근 1개월 동안 유튜브 등 영상 매체를 단순 오락이 아닌 '학습 및 탐구 목적'으로 활용한 사례가 있습니까?", "3. 최근 시험 기간이나 스트레스 상황에서 멘탈 관리를 위해 건전하게 수행한 취미 활동이 있습니까?", "4. 지난 검사 때 설정했던 '목표 고등학교'에 대한 진학 의지가 더 확고해졌습니까, 아니면 흔들림이 있습니까?", "5. 현재 자신의 공부법 중 가장 개선하고 싶은 점은 무엇입니까?", "6. 지난 검사 대비 일주일 평균 '순수 자기주도 학습 시간'이 명확하게 증가했습니까?", "7. [O/X] 최근 1개월 내, 해설지에 의존하지 않고 어려운 수학/과학 문제를 30분 이상 끈질기게 고민해 본 적이 있습니까?", "8. [O/X] 최근 학교 수행평가나 학원 과제를 할 때, 남들이 안 하는 나만의 심화 탐구 자료를 추가로 찾아보았습니까?" ]; const step0_detail_2_part2 = [ "9. [O/X] 지난 1차 검사 이후, 진로와 관련된 독서나 칼럼, 논문 등을 자발적으로 찾아 읽은 경험이 있습니까?", "10. [O/X] 현재 공부 중에 카톡이나 알림이 울려도 즉각 확인하지 않고, 정해진 휴식 시간에만 확인하는 습관이 정착되었습니까?", "11. [O/X] 최근 모의고사나 단원평가에서 예상치 못한 실수를 했을 때, 감정적 동요 없이 즉각적인 약점 분석을 실행했습니까?", "12. [O/X] 최근 1개월 내, 수업 내용 중 이해가 안 가는 부분을 선생님이나 조교님께 자발적으로 질문한 빈도가 늘었습니까?", "13. [O/X] 최근 친구들과 경쟁의식보다는 서로 모르는 문제를 설명해주며 학습적으로 교류한 적이 있습니까?", "14. [O/X] 최근 주말(토/일)에도 늦잠을 자지 않고 평일과 유사한 기상 시간을 스스로 지키고 있습니까?", "15. [O/X] 최근 1개월 내에 늦은 시간 스마트폰 사용 등으로 인해 수면이 부족하여 수업 시간에 존 적이 한 번도 없습니까?", "16. [O/X] 이번 2차 진단을 통해 스스로의 약점을 명확히 직면하고, 다음 목표를 위해 나쁜 습관을 버릴 준비가 되었습니까?" ]; const domains_1 = { elem: { A: ["새로운 것에 '왜?'라는 질문을 던지는가?", "수학/과학 문제를 풀 때 즐거운가?", "궁금한 점을 끝까지 찾아 확인하는가?", "아는 내용을 그림이나 표로 정리하는가?", "과학 실험이나 관찰 일기를 직접 써봤는가?"], B: ["오늘 배운 것을 1분 안에 설명할 수 있는가?", "시키는 사람이 없어도 숙제를 먼저 하는가?", "읽고 싶은 책을 서점에서 직접 고르는가?", "내가 '안다고 착각하는 부분'을 찾아내는가?", "학습 목표 달성 시 스스로 보상을 정하는가?"], C: ["시험 점수가 낮아도 다음엔 잘할 거라 믿는가?", "안 풀리는 문제가 있어도 짜증 내지 않는가?", "공부 잘하는 친구를 보며 배우려 하는가?", "계획을 못 지켰어도 대안을 생각하는가?", "긴장되는 상황에서도 나를 믿는가?"], D: ["약속한 시간에는 스스로 책상에 앉는가?", "공부할 때 스마트폰 등 방해 요소를 치우는가?", "내일 가방을 스스로 챙기는가?", "스마트폰 사용 시간을 약속하고 지키는가?", "일정한 시간에 기상하고 취침하는가?"] }, mid12: { A: ["개념 유도 과정을 스스로 증명해봤는가?", "논리적 비약을 느끼고 관련 서적을 찾아보는가?", "수학 지식을 실생활 문제 해결에 연결하는가?", "주제 탐구 보고서를 직접 작성해봤는가?", "손으로 직접 정리하며 풀어가는가?", "복습 시 새로운 질문이나 원리를 떠오르는가?"], B: ["오늘 배운 내용을 백지에 구조화할 수 있는가?", "나만의 오답 분석법이나 플래너를 쓰는가?", "지시 없이 학습 로드맵을 스스로 결정하는가?", "시간 단축을 위한 나만의 효율 도구를 쓰는가?", "변형 문제를 예측하며 공부하는가?", "1년 뒤 구체적인 목표와 계획이 있는가?"], C: ["잘하는 친구를 시기보다 파트너로 인식하는가?", "계획이 틀어질 때 즉시 수정하여 실천하는가?", "경쟁 환경의 긴장감을 즐거움으로 느끼는가?", "성적이 떨어져도 평온을 유지하려 노력하는가?", "실수 두려움 없이 새로운 도전에 나서는가?", "에너지를 스스로 관리하고 휴식을 취하는가?"], D: ["공부 시 폰을 물리적으로 격리하여 차단하는가?", "순공 시간과 그냥 앉아 있던 시간을 구분하는가?", "규칙적인 수면을 유지하며 밤에 폰을 안 하는가?", "환경을 탓하기보다 직접 정리하는가?", "지루한 반복 학습도 묵묵히 수행하는가?", "주변 분위기에 휩쓸리지 않고 내 페이스를 지키는가?"] }, mid3: { A: ["목표 학교 인재상에 맞는 탐구 사례가 있는가?", "지적 호기심 해결을 위해 논문을 탐독하는가?", "융합 탐구 전 과정을 주도적으로 수행했는가?", "심화 수학 가중치를 견딜 역량을 갖췄는가?", "사회/글로벌 이슈에 대한 비판적 사고가 뚜렷한가?", "탐구 활동이 세특에 팩트 위주로 적혔는가?"], B: ["자소서 소재가 될 킬러 콘텐츠가 3개 이상인가?", "압박 질문에도 논리적으로 답변할 수 있는가?", "지원 동기를 학교 특성에 맞춰 설명하는가?", "두괄식 답변과 근거 제시 말하기가 습관화됐는가?", "나의 공부 방식이 통할 객관적 증거가 있는가?", "인성 영역의 구체적 실천 사례가 있는가?"], C: ["내신 등급이 급락해도 버틸 회복탄력성이 있는가?", "동료를 적이 아닌 파트너로 보고 협업하는가?", "치열한 경쟁 긴장감을 즐거움으로 승화시키는가?", "한 문제에 매몰되지 않고 흐름을 관리하는가?", "실패의 원인을 나의 전략 수정에서 찾는가?", "현재 페이스가 입시 당일까지 지속 가능한가?"], D: ["'3무 문화' 기숙 생활을 견딜 각오가 되었는가?", "외부 강제성 없이 매일 5시간 이상의 순공를 하는가?", "기숙사 규칙 준수 및 자기 절제 능력이 있는가?", "매일 '진짜 공부 시간'을 철저히 기록하는가?", "장소 상관없이 즉시 몰입 모드가 가능한가?", "1점을 더 따기 위한 집요한 학습 근성이 있는가?"] } }; const domains_2 = { elem: { A: ["최근 새로운 호기심이 생겨 부모님/선생님께 질문했는가?", "최근 어려운 문제를 스스로 풀고 성취감을 느꼈는가?", "인터넷이나 책에서 궁금한 점의 해답을 직접 찾았는가?", "학습한 내용을 자신만의 그림이나 마인드맵으로 표현했는가?", "최근 관찰 일기나 간단한 실험 기록을 작성해 보았는가?"], B: ["최근 배운 내용을 거울을 보며 소리 내어 설명해 보았는가?", "부모님 말씀 전에 스스로 숙제를 시작하는 빈도가 늘었는가?", "서점이나 도서관에서 스스로 읽고 싶은 책을 고르는가?", "내가 틀린 문제를 왜 틀렸는지 스스로 말할 수 있는가?", "스스로 정한 공부 목표를 달성하고 보상을 즐겼는가?"], C: ["최근 단원평가를 망쳤어도 '다음엔 잘해야지'라고 다짐했는가?", "풀리지 않는 문제 앞에서 짜증내지 않고 다시 시도하는가?", "친구의 좋은 점을 칭찬하고 나도 따라 해보려 노력하는가?", "계획표를 못 지킨 날, 빈 시간에 보충 공부를 했는가?", "발표나 시험 등 긴장되는 상황에서 심호흡을 하며 극복하는가?"], D: ["최근 일주일 간 약속한 시간에 스스로 책상에 앉았는가?", "공부할 때 스마트폰이나 장난감을 내 시야에서 치우는가?", "엄마의 도움 없이 내일 학교 갈 가방을 완벽히 챙기는가?", "최근 게임이나 스마트폰 사용 약속 시간을 스스로 지켰는가?", "주말에도 평일처럼 일정한 기상/취침 시간을 유지하는가?"] }, mid12: { A: ["최근 한 달 내 수학 개념의 유도 과정을 빈 종이에 써보았는가?", "학원 진도와 무관하게 호기심으로 책이나 자료를 찾아보았는가?", "최근 배운 지식을 실생활이나 다른 과목에 연결해 보았는가?", "수행평가를 위해 교과서 밖의 심화 자료를 분석해 보았는가?", "단순 눈으로 읽지 않고 반드시 손으로 쓰면서 공부하는가?", "복습할 때 스스로 새로운 질문이나 변형 문제를 만들어보는가?"], B: ["최근 오늘 배운 핵심 내용을 백지에 안 보고 적을 수 있는가?", "단순 오답 노트가 아닌 '오답의 논리적 원인'을 분석하는가?", "스스로 일주일 치 학습 분량을 정하고 달성도를 체크하는가?", "자신만의 암기법이나 시간 단축 노하우를 개발해 적용하는가?", "학원 숙제 외에 나의 취약점을 메우는 개인 공부 시간이 있는가?", "최근 나의 진로 목표 달성을 위해 구체적인 단기 계획을 세웠는가?"], C: ["경쟁자의 성과를 시기하지 않고 나의 전략 수정 지표로 삼는가?", "예상치 못한 스케줄 변경에도 당황하지 않고 대안을 실행하는가?", "최근 시험이나 모의고사에서 적절한 긴장감을 즐기며 집중했는가?", "성적이 떨어졌을 때, 슬퍼하는 시간보다 대안을 찾는 시간이 더 짧은가?", "실수할까 봐 두려워서 어려운 문제 도전을 포기하지 않는가?", "최근 학업 스트레스를 핑계로 계획을 미루지 않고 스스로 통제했는가?"], D: ["최근 일주일 간 공부 시 스마트폰을 다른 방에 두고 차단했는가?", "플래너에 적힌 공부 시간에서 '멍 때린 시간'을 솔직히 뺐는가?", "밤늦게 스마트폰을 하느라 다음 날 학교/학원 수업에 졸지 않았는가?", "공부 전 책상 정리에 5분 이상 쓰지 않고 즉시 몰입하는가?", "하기 싫고 지루한 단순 암기 과목도 정해진 시간 동안 묵묵히 했는가?", "쉬는 시간에 주변 분위기에 휩쓸리지 않고 나의 페이스를 지키는가?"] }, mid3: { A: ["최근 목표 학교 인재상에 맞는 새로운 심화 탐구 사례를 기획했는가?", "교과서 밖 지식 확장을 위해 최근 소논문이나 칼럼을 탐독했는가?", "정답이 없는 융합 탐구 과제에서 주도적으로 가설 세우고 검증했는가?", "최근 심화 수학 킬러 문항을 해설지 없이 30분 이상 끈질기게 고민했는가?", "최근 사회/글로벌 이슈를 비판적으로 분석하여 자신의 의견을 정리했는가?", "자신의 탐구 활동 결과를 구체적인 데이터(Fact) 위주로 요약할 수 있는가?"], B: ["지난 검사 이후, 자소서용 킬러 콘텐츠의 논리적 깊이를 더욱 보완했는가?", "나의 연구/탐구 활동에 대한 날카로운 압박 질문을 예상하고 방어 논리를 짰는가?", "지원 동기를 추상적인 말이 아닌, 나의 구체적 경험과 연결하여 설명하는가?", "평소 발표나 대화 시 '결론부터 말하고 근거를 대는' 두괄식 화법을 쓰는가?", "자신의 학습법이 효율적이라는 것을 증명할 1차/2차 진단 데이터나 성적이 있는가?", "최근 리더십이나 갈등 해결 등 인성 영역의 구체적인 실천 사례를 만들었는가?"], C: ["특목고 진학 후 첫 내신에서 4등급을 받아도 멘탈을 회복할 시뮬레이션이 되었는가?", "최근 경쟁 환경 속에서도 친구들과 지식을 나누며 협력적 시너지를 내고 있는가?", "시험이 다가올수록 불안해하기보다, 치열한 긴장감을 성장의 원동력으로 승화시키는가?", "최근 모의고사에서 막히는 문제를 만났을 때, 당황하지 않고 시간 배분을 관리했는가?", "최근의 실패(오답, 성적 하락) 원인을 철저히 자신의 전략 오류에서 찾아 개선했는가?", "현재의 학습 강도와 심리적 안정감이 수능 당일까지 번아웃 없이 지속 가능한가?"], D: ["전자기기 통제, 엄격한 점호 등 기숙사 생활의 압박을 견딜 실전 준비가 끝났는가?", "최근 일주일 간, 학원 지시 없이도 매일 5시간 이상의 '완벽한 순공'을 달성했는가?", "누가 보지 않아도 스스로 정한 엄격한 폰 통제 및 수면 규칙을 100% 지키고 있는가?", "매일 스톱워치를 통해 '진짜 공부 시간'을 측정하고 플래너에 오차 없이 기록하는가?", "주변 소음이나 장소에 상관없이, 책을 펴자마자 1분 내로 즉시 몰입 모드에 들어가는가?", "최상위권 변별을 위해 단 1점의 실수도 용납하지 않는 집요한 학습 근성을 발휘하는가?"] } }; let currentSession = "1"; function toggleSession() { currentSession = document.querySelector('input[name="sessionType"]:checked').value; document.getElementById('prevScoreBox').style.display = (currentSession === "2") ? "block" : "none"; renderQuestions(); } // ★ 추가: 저장된 진단 결과(result)로 화면을 채우고 리포트를 재현하는 함수 // (관리자페이지 진단 이력 카드의 개별 인쇄 버튼에서 호출됨) window._loadResultForPrint = function(result){ window._printOnlyMode = true; try{ document.getElementById('inDate').value = result.date||''; document.getElementById('inSchool').value = result.school||''; document.getElementById('inName').value = result.name||''; if(result.gradeVal) document.getElementById('inGrade').value = result.gradeVal; if(result.stream) document.getElementById('inStream').value = result.stream; if(result.style) document.getElementById('inStyle').value = result.style; currentSession = String(result.session||'1'); const _radio = document.querySelector('input[name="sessionType"][value="'+currentSession+'"]'); if(_radio) _radio.checked = true; const _psb = document.getElementById('prevScoreBox'); if(_psb) _psb.style.display = (currentSession==='2') ? 'block' : 'none'; renderQuestions(); // 슬라이더 값 복원: 원본 답변(rawAnswers)이 있으면 그대로, 없으면(과거 저장분) 도메인 평균으로 균등 복원 const _qi2 = document.querySelectorAll('.q-val'); const _domIdx = {A:0,B:0,C:0,D:0}; const _raw = result.rawAnswers; _qi2.forEach(function(inp){ const d = inp.dataset.domain; let val; if(_raw && _raw[d] && _raw[d][_domIdx[d]]!=null){ val = _raw[d][_domIdx[d]]; } else if(result.avgs && result.avgs[d]!=null){ val = Math.round(result.avgs[d]); } else { val = 7; } inp.value = val; inp.dataset.touched = '1'; if(inp.nextElementSibling) inp.nextElementSibling.innerText = val; _domIdx[d]++; }); // Step0 응답 복원(있는 경우) if(result.s0){ Object.keys(result.s0).forEach(function(k){ const idx = k.replace('q',''); const el = document.getElementById('s0_'+idx); if(el) el.value = result.s0[k]; }); } // ★ 버그수정: 기존엔 result.gradeVals에 담긴 값이 빈 값("")이어도 // (= 당시 상담 선생님이 실제로 선택하지 않았던 필드여도) touched='1'로 // 강제 설정해버려서, 재인쇄/재현 시 "전부 입력된 것"으로 잘못 판정되어 // 9개 고교 매칭 점수가 전부 NaN점으로 깨지는 문제가 있었음. // → 저장된 값이 실제로 존재(빈 문자열이 아님)할 때만 touched='1' 처리. if(result.gradeVals){ Object.keys(result.gradeVals).forEach(function(id){ const el = document.getElementById(id); const _gv = result.gradeVals[id]; if(el && _gv !== undefined && _gv !== null && _gv !== ''){ el.value = _gv; el.dataset.touched='1'; } }); } setTimeout(function(){ generateReport(); }, 150); }catch(e){ console.error('APEX 리포트 재현 오류:', e); throw e; // 상위(부모 창)에서 원인 확인할 수 있도록 다시 던짐 } }; // ★ 추가: 저장된 진단 결과를 "수정 가능한 상태"로 불러오는 함수. // _loadResultForPrint와 달리 printOnlyMode를 켜지 않고, 자동으로 리포트를 // 생성/저장하지도 않는다. 폼과 슬라이더만 채워서, 사용자가 값을 고친 뒤 // 직접 "최종 리포트 생성 및 인쇄" 버튼을 누르면 그때 정상적으로 // 저장 로직(APEX_SAVE)이 실행되어 같은 회차(session) 결과를 덮어쓰게 된다. window._loadResultForEdit = function(result){ try{ document.getElementById('inDate').value = result.date||''; document.getElementById('inSchool').value = result.school||''; document.getElementById('inName').value = result.name||''; if(result.gradeVal) document.getElementById('inGrade').value = result.gradeVal; if(result.stream) document.getElementById('inStream').value = result.stream; if(result.style) document.getElementById('inStyle').value = result.style; currentSession = String(result.session||'1'); const _radio = document.querySelector('input[name="sessionType"][value="'+currentSession+'"]'); if(_radio) _radio.checked = true; const _psb = document.getElementById('prevScoreBox'); if(_psb) _psb.style.display = (currentSession==='2') ? 'block' : 'none'; renderQuestions(); const _qi3 = document.querySelectorAll('.q-val'); const _domIdx2 = {A:0,B:0,C:0,D:0}; const _raw2 = result.rawAnswers; _qi3.forEach(function(inp){ const d = inp.dataset.domain; let val; if(_raw2 && _raw2[d] && _raw2[d][_domIdx2[d]]!=null){ val = _raw2[d][_domIdx2[d]]; } else if(result.avgs && result.avgs[d]!=null){ val = Math.round(result.avgs[d]); } else { val = 7; } inp.value = val; inp.dataset.touched = '1'; if(inp.nextElementSibling) inp.nextElementSibling.innerText = val; _domIdx2[d]++; }); if(result.s0){ Object.keys(result.s0).forEach(function(k){ const idx = k.replace('q',''); const el = document.getElementById('s0_'+idx); if(el) el.value = result.s0[k]; }); } if(result.gradeVals){ Object.keys(result.gradeVals).forEach(function(id){ const el = document.getElementById(id); const _gv = result.gradeVals[id]; if(el && _gv !== undefined && _gv !== null && _gv !== ''){ el.value = _gv; el.dataset.touched='1'; } }); } // 수정 모드임을 화면에 알려주는 안내 배너 try{ const _banner=document.createElement('div'); _banner.style.cssText='background:#fff3e0;color:#e65100;font-weight:800;padding:10px 16px;border-radius:8px;margin-bottom:14px;border:1.5px solid #ffcc80'; _banner.textContent='✏️ 수정 모드: 기존 '+currentSession+'차 진단 결과를 불러왔습니다. 값을 수정한 뒤 아래 "최종 리포트 생성 및 인쇄" 버튼을 누르면 기존 결과에 덮어써서 저장됩니다.'; const _grid=document.querySelector('.input-grid'); if(_grid && _grid.parentNode) _grid.parentNode.insertBefore(_banner, _grid); }catch(e){} }catch(e){ console.error('APEX 수정모드 복원 오류:', e); } }; // ★ 버그수정: 부모 창에서 iframe.contentWindow의 함수를 "직접 호출"하면 // blob: URL로 로드된 iframe이 브라우저에 의해 origin "null"인 교차 출처(cross-origin) // 프레임으로 취급되어 접근이 차단됨 ("Blocked a frame with origin 'null' ..." 에러). // postMessage는 이런 교차 출처 경계를 넘나들도록 허용된 유일한 통신 방식이므로, // 부모 창에서는 postMessage로 요청을 보내고, 여기서 그 메시지를 받아 // iframe "내부"에서 (같은 컨텍스트이므로 제약 없이) _loadResultForPrint를 호출한다. // ★ 추가: 인쇄 대화상자가 실제로 닫히면(저장/취소 무관) 부모 창에 알려서 // 그때 안전하게 정리(iframe 제거)하도록 함. (afterprint는 브라우저 표준 이벤트) window.addEventListener('afterprint', function(){ try{ if(window.parent && window.parent !== window){ window.parent.postMessage({type:'APEX_PRINT_DONE'}, '*'); } }catch(e){} }); window.addEventListener('message', function(e){ if(e.data && e.data.type === 'APEX_LOAD_FOR_PRINT' && e.data.result){ window._loadResultForPrint(e.data.result); } else if(e.data && e.data.type === 'APEX_LOAD_FOR_EDIT' && e.data.result){ window._loadResultForEdit(e.data.result); } else if(e.data && e.data.type === 'APEX_INIT_STUDENT'){ // ★ 추가: 진단 도구를 처음 열 때 부모 창(관리자페이지)이 postMessage로 // 보내주는 학생명/학교/학년을 받아서 자동 입력한다. try{ const _nameEl = document.getElementById('inName'); if(_nameEl) _nameEl.value = e.data.name||''; const _schoolEl = document.getElementById('inSchool'); if(_schoolEl) _schoolEl.value = e.data.school||''; const _gradeEl = document.getElementById('inGrade'); if(_gradeEl && e.data.grade){ const g = e.data.grade; if(g.includes('초5')||g.includes('초6')) _gradeEl.value='elem'; else if(g.includes('중1')||g.includes('중2')) _gradeEl.value='mid12'; else if(g.includes('중3')) _gradeEl.value='mid3'; if(typeof renderQuestions === 'function') renderQuestions(); } }catch(_e){ console.warn('학생 정보 자동입력 오류:', _e); } } }); // ★ 추가: 라이브 진단 완료 후 화면에서 직접 인쇄 버튼을 누르는 경우에도 // PDF 기본 파일명에 학생명이 반영되도록, 인쇄 직전에 부모(최상위) 창에 // 제목 설정을 요청한다. (인쇄 대화상자는 iframe이 아닌 최상위 창의 // document.title을 기본 파일명으로 사용하기 때문) function _apexPrintNow(){ try{ if(window.parent && window.parent !== window){ const _nm = (document.getElementById('inName')||{}).value || '학생'; const _dt = ((document.getElementById('inDate')||{}).value || '').replace(/-/g,''); const _title = 'APEX 학업역량 정밀진단_'+_nm+'_'+currentSession+'차진단'+(_dt?('_'+_dt):''); window.parent.postMessage({type:'APEX_SET_TITLE', title:_title}, '*'); } }catch(e){ console.warn('제목 설정 요청 실패:', e); } setTimeout(function(){ window.print(); }, 100); } function renderQuestions() { const grade = document.getElementById('inGrade').value; const s0Div = document.getElementById('step0_inputs'); s0Div.innerHTML = ""; const currentStep0 = (currentSession === "1") ? step0_short_1 : step0_short_2; currentStep0.forEach((q, i) => { let inputHtml = ""; let wrapperStyle = ""; if(i < 6) { inputHtml = `<input type="text" id="s0_${i}" style="width:100%; padding:10px; font-size:0.9em; border:1px solid #ccc; border-radius:5px;">`; wrapperStyle = "grid-column: 1 / -1;"; } else { inputHtml = `<select id="s0_${i}" style="width:100%; padding:8px; font-size:0.85em; border:1px solid #ccc; border-radius:5px;"><option value="O">O (그렇다)</option><option value="X">X (아니다)</option></select>`; } s0Div.innerHTML += `<div style="${wrapperStyle} margin-bottom:8px;"><label style="font-size:0.85em; color:#555; font-weight:700; margin-bottom:4px; display:block;">${q}</label>${inputHtml}</div>`; }); const container = document.getElementById('main_inputs'); container.innerHTML = ""; const activeDomain = (currentSession === "1") ? domains_1[grade] : domains_2[grade]; for (let d in activeDomain) { let box = document.createElement('div'); box.style.marginBottom = "15px"; box.innerHTML = `<b style="color:var(--primary); font-size:1.05em;">${{A:"탐구(A)", B:"주도(B)", C:"정서(C)", D:"습관(D)"}[d]} 영역</b>`; let grid = document.createElement('div'); grid.style.display="grid"; grid.style.gridTemplateColumns="1fr 1fr"; grid.style.gap="10px"; grid.style.marginTop="5px"; activeDomain[d].forEach((q, i) => { grid.innerHTML += `<div style="font-size:0.85em; background:#f9f9f9; padding:6px 12px; border-radius:6px; border:1px solid #ddd; display:flex; justify-content:space-between; align-items:center;"> <span style="flex:1;">${q}</span> <div style="display:flex; align-items:center; width:110px; justify-content:flex-end;"> <input type="range" class="q-val" data-domain="${d}" min="1" max="10" value="7" data-touched="0" oninput="this.nextElementSibling.innerText=this.value;this.dataset.touched='1'" style="width:70px;"> <span style="font-weight:900; color:var(--primary); width:20px; text-align:right; margin-left:10px;">7</span> </div> </div>`; }); box.appendChild(grid); container.appendChild(box); } } function renderGradeSelects() { const subjects = [ {id: "kor", name: "국어"}, {id: "eng", name: "영어"}, {id: "mat", name: "수학"}, {id: "sci", name: "과학"}, {id: "soc", name: "사회"}, {id: "his", name: "역사"} ]; const sems = ["21", "22", "31", "32"]; let html = ""; subjects.forEach(subj => { html += `<tr><td style="font-weight:bold; color:var(--primary); background:#f0f4f8;">${subj.name}</td>`; sems.forEach(sem => { // ★ 버그수정: 이 함수가 window.onload에서 gradeTbody를 다시 그리면서 // placeholder("선택 안 함")·data-touched·onchange를 전부 빠뜨리고 있었음. // 그 결과 아래 정적 HTML에 넣어둔 수정이 페이지 로드와 동시에 통째로 // 덮어써져서, 어떤 값을 선택해도 절대 touched='1'이 될 수 없었음(0/30 고정). html += `<td><select id="g-${subj.id}-${sem}" data-touched="0" onchange="this.dataset.touched='1';this.style.outline='';updateGradeProgress();"> <option value="" selected>선택 안 함(필수)</option> <option value="90">A (또는 미응시)</option> <option value="70">B (-20점)</option> <option value="50">C (-40점)</option> <option value="30">D/E (탈락)</option> </select></td>`; }); html += `</tr>`; }); document.getElementById('gradeTbody').innerHTML = html; updateGradeProgress(); } window.onload = function() { renderQuestions(); renderGradeSelects(); }; // --- [APEX진단검사6] 프리미엄 오프라인 설문지 인쇄 --- function printStudentQuestionnaire() { const session = document.querySelector('input[name="sessionType"]:checked').value; const grade = document.getElementById('inGrade').value; const gradeText = document.getElementById('inGrade').options[document.getElementById('inGrade').selectedIndex].text; const step0_p1 = session === "1" ? step0_detail_1_part1 : step0_detail_2_part1; const step0_p2 = session === "1" ? step0_detail_1_part2 : step0_detail_2_part2; const printDomains_1 = { elem: { A: ["새로운 것을 배울 때 단순히 외우기보다 '왜 그런지' 이유를 스스로 떠올리며 궁금해하나요?", "어려운 수학 문제나 과학 원리를 풀고 이해해 가는 과정 자체가 재미있고 즐겁게 느껴지나요?", "궁금한 점이 생기면 그냥 넘기지 않고 책, 영상, 검색 등을 통해 끝까지 확인하려고 하나요?", "배운 내용을 글만 읽고 끝내지 않고 그림, 표, 마인드맵 등으로 다시 정리해 보기도 하나요?", "과학 실험이나 관찰 활동을 할 때 내가 본 것과 느낀 점을 직접 기록해 본 경험이 있나요?"], B: ["오늘 학교나 학원에서 배운 중요한 내용을 가족이나 친구에게 짧게 설명할 수 있을 정도로 이해했나요?", "누가 시키지 않아도 오늘 해야 할 숙제나 복습을 스스로 먼저 시작하는 편인가요?", "읽고 싶은 책이나 공부에 도움이 될 책을 부모님이 아닌 내가 직접 골라서 읽어본 적이 있나요?", "공부한 내용 중 내가 제대로 아는 것과 헷갈리며 착각하는 부분을 스스로 구분해 보나요?", "목표를 이루었을 때 스스로 작은 보상을 정해 동기부여를 만드는 습관이 있나요?"], C: ["시험 점수가 기대보다 낮아도 '다음에는 더 잘할 수 있다'고 생각하며 다시 해보려는 마음이 드나요?", "바로 풀리지 않는 문제가 있어도 짜증만 내지 않고 조금 더 차분하게 붙잡고 고민할 수 있나요?", "나보다 공부를 잘하는 친구를 보면 위축되기보다 배울 점을 찾고 싶다는 생각이 드나요?", "계획대로 다 하지 못한 날에도 포기하지 않고 남은 시간에 무엇을 할지 다시 정리하나요?", "발표나 시험처럼 긴장되는 상황에서도 내 실력을 어느 정도 보여줄 수 있다고 믿나요?"], D: ["공부하기로 마음먹은 시간에는 누가 옆에서 말하지 않아도 스스로 책상 앞에 앉을 수 있나요?", "공부할 때 장난감, 스마트폰, 영상 등 집중을 방해하는 것들을 스스로 치우고 시작하나요?", "잠들기 전에 다음 날 학교 준비물이나 가방을 스스로 챙기는 습관이 있나요?", "스마트폰 게임이나 영상 시청 시간을 스스로 정한 약속 안에서 지키려고 노력하나요?", "매일 비슷한 시간에 자고 일어나는 규칙적인 생활 루틴을 유지하고 있나요?"] }, mid12: { A: ["교과서에 나온 공식이나 개념을 그냥 외우기보다 '왜 이런 식이 되는지' 스스로 유도하거나 따져 본 적이 있나요?", "공부하다가 개념 설명이 매끄럽지 않거나 이해가 덜 되면 다른 자료를 찾아 논리의 빈틈을 메워 보나요?", "수학이나 과학에서 배운 내용을 실생활 문제나 뉴스, 사회 현상과 연결해서 생각해 보는 편인가요?", "자유학기 활동이나 수행평가를 할 때 주제를 정하고 자료를 모아 직접 탐구 보고서를 써본 경험이 있나요?", "어려운 내용을 머리로만 넘기지 않고 손으로 써가며 구조를 정리하고 이해하려고 하나요?", "복습하다가 단순 암기에서 끝나지 않고 '그렇다면 왜 이런가?' 같은 새로운 질문이 떠오르기도 하나요?"], B: ["책이나 노트를 덮은 뒤에도 오늘 배운 핵심 내용을 백지에 스스로 구조화해서 정리할 수 있나요?", "나만의 오답 정리 방식이나 학습 플래너를 만들어 꾸준히 기록하고 점검하는 편인가요?", "부모님이나 학원의 지시 없이도 다음 주에 무엇을 공부할지 스스로 정하고 실행해 보나요?", "같은 공부 시간을 더 효율적으로 쓰기 위해 나만의 방법이나 도구를 직접 바꿔 본 적이 있나요?", "배운 단원이 시험이나 모의고사에서 어떻게 응용될지 미리 예상해 보면서 공부하나요?", "1년 뒤 이루고 싶은 학업 목표를 떠올리고, 그것을 위해 필요한 계획을 비교적 구체적으로 세워 보았나요?"], C: ["나보다 공부를 더 잘하는 친구를 볼 때 질투만 하기보다 나도 배워서 성장할 수 있다고 생각하나요?", "계획대로 잘 안 되는 날에도 스트레스에만 머무르지 않고 현실적인 대안을 다시 세우는 편인가요?", "경쟁이 있는 환경을 무조건 부담스럽게만 느끼기보다 나를 성장시키는 자극으로 받아들일 수 있나요?", "성적이 일시적으로 떨어져도 감정적으로 무너지기보다 다음에 무엇을 보완할지 차분히 생각하나요?", "실수할까 봐 새로운 시도를 피하기보다, 도전하면서 배우는 것이 중요하다고 느끼나요?", "지치기 전에 스스로 컨디션을 조절하고 쉬는 시간을 배분하는 등 에너지 관리를 해본 적이 있나요?"], D: ["공부할 때 스마트폰이 방해된다고 느끼면 아예 손이 닿지 않는 곳으로 치우는 등 물리적으로 통제하나요?", "책상에 오래 앉아 있는 시간과 실제로 집중해서 공부한 시간을 구분해 보려는 편인가요?", "늦게까지 SNS나 영상에 빠지지 않고 수면 시간을 일정하게 지키기 위해 노력하나요?", "환경이나 주변 분위기를 탓하기보다 책상 정리나 장소 조정처럼 내가 바꿀 수 있는 부분부터 손보나요?", "지루하고 반복적인 기본기 훈련도 결국 실력을 만든다고 생각하며 끝까지 해내려고 하나요?", "친구들의 분위기에 쉽게 휩쓸리지 않고 나에게 필요한 학습 속도와 페이스를 지키는 편인가요?"] }, mid3: { A: ["목표 학교가 중요하게 보는 독서·융합·탐구 역량에 맞는 활동 사례가 학교생활기록부에 어느 정도 정리되어 있나요?", "지적 호기심이 생겼을 때 교과서 수준에서 멈추지 않고 논문이나 전문 서적까지 찾아 읽어본 경험이 있나요?", "융합 탐구 활동을 할 때 주제 설정부터 자료 수집, 가설 검증, 결론 정리까지 내가 주도한 편인가요?", "수학 비중이 높은 학교나 전형을 준비할 때 버틸 수 있을 만큼 심화 수학 학습이 되어 있다고 느끼나요?", "사회 문제나 글로벌 이슈를 접했을 때 단순히 사실을 아는 데서 그치지 않고 내 관점으로 비판적으로 생각하나요?", "내가 한 탐구 활동이 추상적인 표현이 아니라 구체적인 사실과 결과 중심으로 기록되어 있나요?"], B: ["자기소개서나 면접에서 활용할 수 있을 만큼 나만의 강점이 드러나는 '킬러 콘텐츠'가 3가지 이상 있나요?", "면접에서 예상하지 못한 압박 질문을 받더라도 근거를 들어 차분하고 논리적으로 답변할 수 있나요?", "지원 동기와 앞으로의 학업 계획을 목표 학교의 교육 방향과 연결해서 설명할 수 있나요?", "평소에도 결론부터 말하고 근거를 덧붙이는 식으로 말하는 습관이 어느 정도 자리 잡았나요?", "내 공부 방식이 특목고나 자사고의 높은 학업 강도에서도 통할 것이라는 객관적 근거가 있나요?", "협력, 갈등 해결, 배려 같은 인성 영역에서 실제로 보여줄 수 있는 구체적 사례가 있나요?"], C: ["입학 후 첫 시험에서 기대보다 낮은 등급을 받아도 다시 회복해 낼 수 있을 만큼 멘탈이 단단한 편인가요?", "경쟁 상대를 무조건 이겨야 할 적으로 보기보다 함께 자극을 주고받는 성장 파트너로 볼 수 있나요?", "치열한 경쟁 환경에서 오는 긴장감을 피하고 싶은 부담보다 성장의 자극으로 받아들일 수 있나요?", "한 문제에 지나치게 매달려 전체 시험 흐름을 무너뜨리기보다 시간과 집중을 조절할 수 있나요?", "실패나 성적 하락의 원인을 외부 탓보다 내 전략의 수정 포인트로 바라보는 편인가요?", "지금의 공부 강도와 생활 리듬이 입시가 끝날 때까지 무너지지 않고 지속 가능하다고 느끼나요?"], D: ["자율학교나 기숙형 학교의 엄격한 생활 규칙을 3년 동안 스스로 지킬 각오와 준비가 되어 있나요?", "외부에서 강하게 관리해 주지 않아도 매일 5시간 이상의 순수 공부 시간을 스스로 확보할 수 있나요?", "단체생활 속 규칙 준수와 자기 절제가 필요한 환경에서도 생활 리듬을 무너지지 않게 지킬 수 있나요?", "매일 실제 공부한 시간을 대충이 아니라 구체적으로 기록하고 관리하는 습관이 있나요?", "장소가 바뀌거나 주변에 소음이 있어도 비교적 빠르게 몰입 모드로 전환할 수 있나요?", "원점수 1점을 더 만들기 위해 실수 하나까지 집요하게 점검하는 학습 근성이 형성되어 있나요?"] } }; const activeDomainSet = session === "1" ? printDomains_1 : domains_2; const mainQs = activeDomainSet[grade]; const gradeMeta = { elem: { page1Title: 'Step 1. The Seed (1/2)', page1Sub: '[초등 5~6학년] 지적 호기심과 기초 습관 진단', page2Title: 'Step 1. The Seed (2/2)', page2Sub: '[초등 5~6학년] 지적 호기심과 기초 습관 진단', split: 10 }, mid12: { page1Title: 'Step 2. The Route (1/2)', page1Sub: '[중등 1~2학년] 자기주도학습 체계화 및 계열성 진단', page2Title: 'Step 2. The Route (2/2)', page2Sub: '[중등 1~2학년] 자기주도학습 체계화 및 계열성 진단', split: 12 }, mid3: { page1Title: 'Step 3. The Final (1/2)', page1Sub: '[중등 3학년] 지원 학교 DNA 합치도 및 실전 입시 진단', page2Title: 'Step 3. The Final (2/2)', page2Sub: '[중등 3학년] 지원 학교 DNA 합치도 및 실전 입시 진단', split: 12 } }; const meta = gradeMeta[grade]; const surveyQs = [...mainQs.A, ...mainQs.B, ...mainQs.C, ...mainQs.D]; const renderScoreQuestions = (qs, start, end) => { let h = ''; qs.slice(start, end).forEach((q, i) => { h += `<div class='q-item'><span class='q-text'>${start + i + 1}. ${q}</span><div class='score-row'>`; for (let s = 1; s <= 10; s++) h += `<div class='score-box'>${s}</div>`; h += `</div></div>`; }); return h; }; let html = ` <html><head><title>APEX 프리미엄 학생용 설문지</title> <style> @import url('https://fonts.googleapis.com/css2?family=Pretendard:wght@400;700;900&display=swap'); :root { --primary: #0047ab; --secondary: #f4f7f9; } @page { size: A4; margin: 0; } * { box-sizing: border-box; -webkit-print-color-adjust: exact; print-color-adjust: exact; } body { font-family: 'Pretendard', sans-serif; background: #eee; margin: 0; padding: 0; color: #333; line-height: 1.4; } .doc-container { width: 210mm; margin: 0 auto; } .page { width: 210mm; height: 296.5mm; padding: 25mm 22mm; background: white; position: relative; page-break-after: always; overflow: hidden; display: flex; flex-direction: column; } .header { text-align: center; border-bottom: 4px solid var(--primary); padding-bottom: 15px; margin-bottom: 25px; } .header h1 { font-size: 2.1em; color: var(--primary); margin: 0; font-weight: 900; } .student-info-bar { display: grid; grid-template-columns: repeat(4, 1fr); gap: 10px; margin-top: 15px; padding: 15px; border: 2px solid #eee; border-radius: 8px; font-weight: bold; font-size: 0.85em; } h3 { border-left: 10px solid var(--primary); padding-left: 15px; color: var(--primary); margin: 25px 0 15px; font-size: 1.25em; } .info-box { background: #f8f9fa; padding: 18px 22px; border-radius: 10px; border: 1px solid #eee; font-size: 0.95em; margin-bottom: 20px; line-height: 1.7; } .q-list { flex: 1; } .q-item { padding: 10px 0; border-bottom: 1px solid #f2f2f2; display: flex; justify-content: space-between; align-items: center; min-height: 40px; } .q-text { font-size: 0.92em; color: #1a1a1a; flex: 1; padding-right: 15px; word-break: keep-all; } .write-line { border-bottom: 1px dashed #bbb; height: 32px; margin-top: 5px; width: 100%; margin-bottom: 10px; } .choice-row { display: flex; gap: 15px; margin-top: 10px; font-size: 0.9em; } .circle { width: 14px; height: 14px; border: 1.5px solid #666; border-radius: 50%; display: inline-block; margin-right: 6px; vertical-align: middle; } .score-row { display: flex; gap: 3px; } .score-box { width: 24px; height: 24px; border: 1px solid #ccc; text-align: center; line-height: 22px; border-radius: 3px; font-size: 0.75em; color: #777; } .guide-table { width: 100%; border-collapse: collapse; margin-top: 15px; } .guide-table th, .guide-table td { border: 1px solid #ddd; padding: 12px 10px; font-size: 0.85em; text-align: center; } .guide-table th { background: var(--secondary); color: var(--primary); } .domain-box { border: 1px solid #eee; border-left: 6px solid var(--primary); padding: 15px 20px; margin-bottom: 15px; border-radius: 6px; font-size: 0.95em; line-height: 1.6; } .domain-title { font-weight: 900; color: var(--primary); display: block; margin-bottom: 6px; font-size: 1.05em; } .footer { position: absolute; bottom: 15mm; left: 0; width: 100%; text-align: center; font-size: 0.8em; color: #bbb; font-weight: bold; } @media print { body { background: white; } } </style> </head><body><div class="doc-container">`; html += ` <div class="page"> <div class="header"> <h1>APEX Academic Intelligence Kit</h1> <p style="font-weight: bold; color: #666; margin-top: 8px; font-size: 1.1em;">데이터로 증명하는 최상위권의 합격 DNA (${session}차 검사)</p> </div> <div class="q-list"> <h3>🔍 APEX 학업역량 정밀진단 개요</h3> <div class="info-box"> 본 검사는 단순한 성적을 넘어 특목·자사고 합격과 입학 후 최상위권 유지를 결정짓는 <b>'비인지적 핵심 역량'</b>을 측정하는 도구입니다. 9개 명문 고교의 선발 DNA인 탐구, 주도, 정서, 습관의 4대 영역을 다각도로 분석하여 학생의 입시 근육을 진단합니다. 진단 결과는 실제 선발 데이터와 매칭되어 우리 아이에게 가장 유리한 전략적 방향성을 제시할 것입니다. </div> <h3>📝 검사 실시 안내</h3> <ul style="font-size: 1em; line-height: 2.2; color: #444; padding-left: 25px;"> <li>기초 정보(Step 0)는 리포트 분석의 배경 데이터가 되므로 상세히 적어주세요.</li> <li>역량 진단(Step 1~3)은 전혀 아님(1점)부터 매우 그러함(10점)까지 체크합니다.</li> <li>정답은 없으며, 본인의 평소 습관과 모습에 가장 가까운 점수를 선택하세요.</li> <li>검사 시간은 <b>약 15분</b> 내외이며, 조용한 환경에서 솔직하게 답변해 주세요.</li> </ul> <div class="student-info-bar" style="margin-top: 120px;"> <div>검사 일시: ________</div> <div>학교명: ________</div> <div>학년/반: ________</div> <div>성 명: ________</div> </div> </div> <div class="footer">Apex Academic Intelligence System</div> </div>`; html += `<div class="page"><div class="header"><h1>Step 0. 기초 정보 및 진로 목표 (1/2)</h1></div><div class="q-list">`; step0_p1.forEach((q, i) => { if (session === "1" && i < 4) { html += `<div class="q-item" style="display:block; border:none; ${i===0 ? 'padding-top:0;' : ''}"><span class="q-text"><b>${q}</b></span><div class="write-line"></div><div class="write-line"></div></div>`; } else if (session === "2" && i < 5) { html += `<div class="q-item" style="display:block; border:none; ${i===0 ? 'padding-top:0;' : ''}"><span class="q-text"><b>${q}</b></span><div class="write-line"></div><div class="write-line"></div></div>`; } else if (session === "1" && i === 4) { html += `<div class="q-item" style="display:block; border:none;"><span class="q-text"><b>${q}</b></span><div class="choice-row"><span><div class="circle"></div> 1. 마스터형</span><span><div class="circle"></div> 2. 완벽주의형</span><span><div class="circle"></div> 3. 팔로워형</span><span><div class="circle"></div> 4. 지능의존형</span></div></div>`; } else if (session === "1" && i === 5) { html += `<div class="q-item" style="display:block; border:none; margin-bottom:10px;"><span class="q-text"><b>${q}</b></span><div style="margin-top:8px; font-weight:bold; color:#444;">사교육 ( )시간 / 순공 ( )시간 / 성적 ( )</div></div>`; } else if (session === "2" && i === 5) { html += `<div class="q-item" style="display:block; border:none; margin-bottom:10px;"><span class="q-text"><b>${q}</b></span><div style="margin-top:8px; font-weight:bold; color:#444;">( )시간 증가 / 감소</div></div>`; } else { html += `<div class="q-item"><span class="q-text">${q}</span><div class="choice-row" style="margin-top:0;"><span><div class="circle"></div> O</span><span><div class="circle"></div> X</span></div></div>`; } }); html += `</div><div class="footer">Apex Academic Intelligence System</div></div>`; html += `<div class="page"><div class="header"><h1>Step 0. 기초 정보 및 진로 목표 (2/2)</h1></div><div class="q-list">`; step0_p2.forEach((q) => { html += `<div class="q-item"><span class="q-text">${q}</span><div class="choice-row" style="margin-top:0;"><span><div class="circle"></div> O</span><span><div class="circle"></div> X</span></div></div>`; }); html += `</div><div class="footer">Apex Academic Intelligence System</div></div>`; html += ` <div class="page"> <div class="header"><h1>${meta.page1Title}</h1><p>${meta.page1Sub}</p></div> <div class="q-list">${renderScoreQuestions(surveyQs, 0, meta.split)}</div> <div class="footer">Apex Academic Intelligence System</div> </div>`; html += ` <div class="page"> <div class="header"><h1>${meta.page2Title}</h1><p>${meta.page2Sub}</p></div> <div class="q-list">${renderScoreQuestions(surveyQs, meta.split, surveyQs.length)}</div> <div class="footer">Apex Academic Intelligence System</div> </div>`; html += ` <div class="page"> <div class="header"><h1>Step 4. 학업 데이터 자가진단 (1/2)</h1><p>학기별 교과 내신 성취도 (A~E)</p></div> <div class="q-list"> <div class="info-box"> 아래 학기별 성적에 해당하는 등급에 <b>○표</b> 해 주세요. 성적이 아직 없는 학년(예: 초등학생, 입학 전)은 <b>'A (또는 미응시)'</b>에 표시하면 기본 잠재력 컷으로 계산됩니다. </div> <table class="guide-table" style="text-align:center;"> <thead><tr><th style="width:12%;">과목</th><th>2학년 1학기</th><th>2학년 2학기</th><th>3학년 1학기</th><th>3학년 2학기</th></tr></thead> <tbody> ${['국어','영어','수학','과학','사회','역사'].map(subj => ` <tr> <td style="font-weight:900; color:var(--primary); background:var(--secondary);">${subj}</td> ${[1,2,3,4].map(() => `<td><div style="display:flex; flex-direction:column; gap:5px; align-items:flex-start; font-size:0.82em; padding-left:8px;"> <span><div class="circle"></div>A (또는 미응시)</span> <span><div class="circle"></div>B (-20점)</span> <span><div class="circle"></div>C (-40점)</span> <span><div class="circle"></div>D/E (탈락)</span> </div></td>`).join('')} </tr>`).join('')} </tbody> </table> </div> <div class="footer">Apex Academic Intelligence System</div> </div>`; const renderChoiceBlock = (title, options) => { let h = `<div class="domain-box" style="padding:12px 18px; margin-bottom:12px;"><span class="domain-title" style="font-size:0.95em; margin-bottom:8px;">${title}</span>`; h += `<div style="display:flex; flex-direction:column; gap:6px;">`; options.forEach(opt => { h += `<span style="font-size:0.85em;"><div class="circle"></div>${opt}</span>`; }); h += `</div></div>`; return h; }; html += ` <div class="page"> <div class="header"><h1>Step 4. 학업 데이터 자가진단 (2/2)</h1><p>모의고사 백분위 및 선행학습 단계</p></div> <div class="q-list"> <h3>🏆 모의고사 백분위 (상대평가)</h3> <div style="display:grid; grid-template-columns: 1fr 1fr; gap:12px;"> ${renderChoiceBlock('수학/과학 (이과) 모의고사 백분위', ['전국 상위 1% 이내 (의대/KMO 수준)', '전국 상위 4% 이내 (1등급 / 최상위반)', '성적 없음 (초등/기초 잠재력 평가용)', '전국 상위 11% 이내 (2등급 / 상위반)', '전국 상위 23% 이내 (3등급 / 일반반)', '그 이하 (기초 학력 보완 필요)'])} ${renderChoiceBlock('국어/영어 (문과) 모의고사 백분위', ['전국 상위 1% 이내 (최상위 외고 수준)', '전국 상위 4% 이내 (1등급 / 최상위반)', '성적 없음 (초등/기초 잠재력 평가용)', '전국 상위 11% 이내 (2등급 / 상위반)', '전국 상위 23% 이내 (3등급 / 일반반)', '그 이하 (기초 학력 보완 필요)'])} </div> <h3>📈 선행학습 단계</h3> <div style="display:grid; grid-template-columns: 1fr 1fr; gap:12px;"> ${renderChoiceBlock('수학 선행/심화', ['고등 미적분/기하 실력 완성 (의대/영재고)', '고등 수학(상/하), 수1 심화 진행 (자사고)', '고등 공통수학 선행 (1회독 완료)', '중등 심화 위주 (선행 안함)', '현행 및 후행 보완 필요'])} ${renderChoiceBlock('과학 선행/심화', ['물/화/생/지 I·II 수능 기출 풀이 가능', '물/화 I 심화 및 문제풀이 진행', '고1 통합과학 완벽 선행 (1회독 이상)', '중등 과학 심화 위주 (선행 안함)', '현행 과학 암기 위주 학습'])} ${renderChoiceBlock('국어/영어 선행 (어학)', ['고3 수능 모의고사 1등급 안정권', '고1~2 모의고사 1등급 / 텝스 수준', '중등 심화 및 예비고1 기본 문법/구문', '중등 내신 90점대 유지 (본문 암기형)', '기본 독해 및 어휘 보완 시급'])} ${renderChoiceBlock('역사/사회 (암기 방어력)', ['고1 통합사회/한국사 흐름 선행 완벽', '중등 역사/세계사 흐름 파악 및 암기 능숙', '시험 전 벼락치기로 A등급 방어 수준', '암기 과목에 매우 취약함 (B등급 이하 발생)'])} </div> </div> <div class="footer">Apex Academic Intelligence System</div> </div>`; html += ` <div class="page"> <div class="header"><h1>진단 결과 상세 설명서</h1></div> <div class="q-list"> <h3>📊 4대 핵심 역량의 입시적 정의</h3> <div class="domain-box"><span class="domain-title">🔹 탐구 (Inquiry): 지적 호기심과 학술적 깊이</span>단순 문제 풀이를 넘어 교과 개념에 의문을 갖고 가설을 세워 검증하는 힘입니다. 영재학교/과학고 STEAM 면접과 전국 자사고 창의융합 전형의 핵심 지표입니다.</div> <div class="domain-box"><span class="domain-title">🔹 주도 (Self-Directed): 메타인지와 효율성</span>자신이 아는 것과 모르는 것을 구분하고 우선순위를 정하는 능력입니다. 특목고의 학습량을 소화하고 자기주도성을 증명하는 근간입니다.</div> <div class="domain-box"><span class="domain-title">🔹 정서 (Resilience): 회복탄력성과 경쟁 적응력</span>실패를 분석하고 성장의 발판으로 삼는 멘탈입니다. 치열한 경쟁 속에서도 번아웃되지 않고 완주할 수 있는 '생존력'을 예측합니다.</div> <div class="domain-box"><span class="domain-title">🔹 습관 (Habit): 환경 통제와 집요함</span>유혹을 차단하고 '진짜 공부 시간'을 사수하는 습관입니다. 기숙사 생활 적합도와 대학 입시 수능 최저를 맞추는 학습 근성의 척도입니다.</div> </div> <div class="footer">Apex Academic Intelligence System | 무단 전재 및 복제를 금합니다.</div> </div>`; html += `</div></body></html>`; const printWin = window.open('', '_blank'); printWin.document.write(html); printWin.document.close(); printWin.focus(); setTimeout(() => { printWin.print(); }, 800); } let radarChart; function updateGradeProgress(){ const _ids = []; // ★ 개선: 3학년 2학기(sem='32') 내신은 특목고 원서접수 시점 기준으로 // 어떤 학년의 학생이든 실제로 존재할 수 없는(아직 지나지 않은) 학기라서, // 완성도 계산 대상에서 아예 제외한다. (기존엔 이 칸을 포함시켜서, 학생이 // 나머지 내신을 전부 입력해도 항상 "미입력 있음"으로 걸려 실제 내신이 // 반영 안 되고 성향 진단 점수로만 계산되는 문제가 있었음) ['kor','eng','mat','sci','soc','his'].forEach(function(subj){ ['21','22','31'].forEach(function(sem){ _ids.push('g-'+subj+'-'+sem); }); }); _ids.push('inMockMathSci','inMockKorEng','inMathLevel','inSciLevel','inEngLevel','inHisLevel'); let _cnt = 0; _ids.forEach(function(id){ const el = document.getElementById(id); if(el && el.dataset.touched === '1') _cnt++; }); const _ind = document.getElementById('gradeProgressIndicator'); if(_ind){ _ind.textContent = '교과내신·모의고사·선행 입력: ' + _cnt + '/' + _ids.length; _ind.style.color = (_cnt === _ids.length) ? '#2e7d32' : '#c62828'; } } function generateReport() { const info = { date: document.getElementById('inDate').value, school: document.getElementById('inSchool').value, name: document.getElementById('inName').value, gradeVal: document.getElementById('inGrade').value, gradeTxt: document.getElementById('inGrade').options[document.getElementById('inGrade').selectedIndex].text.split(' ')[0], stream: document.getElementById('inStream').value.toUpperCase(), style: document.getElementById('inStyle').value }; const qInps = document.querySelectorAll('.q-val'); // ★ 버그수정: 24개 슬라이더가 전부 기본값 7로 세팅되어 있어서, // 상담 선생님이 일부 문항을 건드리지 않고 넘어가면 "응답 안 함"인지 // "정말로 7점"인지 구분이 안 되고 조용히 7점으로 채점되어 점수가 // 실제와 다르게 나오는 문제가 있었음. 생성 전에 미조작 문항이 있으면 // 경고하여 선생님이 빠뜨린 문항을 확인할 수 있도록 함. const _untouched = Array.from(qInps).filter(inp => inp.dataset.touched !== '1'); // ★ 버그수정: 교과성적(24개)/모의고사 백분위(2개)/선행단계(4개) select도 // 전부 "첫 번째 옵션(A등급/최상위 등)"이 기본값으로 세팅되어 있어서, // 상담 선생님이 직접 클릭해서 선택하지 않으면 조용히 그 기본값으로 // 계산됨. 이 값들은 특히 공주사대부고/세종고/지역우수일반고처럼 // 면접이 없어 순수 내신·모의고사만으로 매칭 점수가 계산되는 학교에서 // "학생마다 다른 진단을 해도 항상 똑같은 점수"로 나오는 문제의 원인이었음. const _gradeSelectIds = []; // ★ 개선: 완성도 계산과 동일하게 3학년2학기(sem='32')는 제외 ['kor','eng','mat','sci','soc','his'].forEach(function(subj){ ['21','22','31'].forEach(function(sem){ _gradeSelectIds.push('g-'+subj+'-'+sem); }); }); _gradeSelectIds.push('inMockMathSci','inMockKorEng','inMathLevel','inSciLevel','inEngLevel','inHisLevel'); const _untouchedGrades = _gradeSelectIds.filter(function(id){ const _el = document.getElementById(id); return _el && _el.dataset.touched !== '1'; }); if(_untouchedGrades.length > 0 && !window._printOnlyMode){ if(!confirm('⚠️ 교과성적/모의고사/선행 단계 중 아직 선택하지 않은 항목이 '+_untouchedGrades.length+'개 있습니다.\n(입력한 항목만으로 부분 반영되어 계산되며, 하나도 입력하지 않은 경우에만 성향 진단 점수만으로 추정한 "잠재력 기준 점수"로 계산됩니다)\n\n이대로 리포트를 생성하시겠습니까?\n[취소]를 누르면 미입력 항목으로 스크롤합니다.')){ const _firstEl = document.getElementById(_untouchedGrades[0]); if(_firstEl){ _firstEl.scrollIntoView({behavior:'smooth', block:'center'}); _firstEl.style.outline = '3px solid #e53935'; } return; } } if(_untouched.length > 0 && !window._printOnlyMode){ if(!confirm('⚠️ 아직 조정하지 않은 문항이 '+_untouched.length+'개 있습니다.\n(건드리지 않은 문항은 기본값 7점으로 채점됩니다)\n\n그래도 리포트를 생성하시겠습니까?\n[취소]를 누르면 미답변 문항으로 스크롤합니다.')){ _untouched[0].scrollIntoView({behavior:'smooth', block:'center'}); _untouched[0].style.outline = '3px solid #e53935'; return; } } const sums = { A: 0, B: 0, C: 0, D: 0 }; const counts = { A: 0, B: 0, C: 0, D: 0 }; qInps.forEach(inp => { sums[inp.dataset.domain] += parseInt(inp.value); counts[inp.dataset.domain]++; }); const avgs = { A: sums.A/counts.A, B: sums.B/counts.B, C: sums.C/counts.C, D: sums.D/counts.D }; // [V26 핵심 알고리즘] 학년별 더닝크루거 거품 제거 let mentalCalibration = 1.0; let calibText = ""; if (info.gradeVal === 'elem') { mentalCalibration = 0.85; calibText = "<div class='trend-badge trend-down' style='margin-left:10px;'>초등 메타인지 거품 (15% 감점) 보정됨</div>"; } else if (info.gradeVal === 'mid12') { mentalCalibration = 0.90; calibText = ""; } else { calibText = "<div class='trend-badge trend-same' style='margin-left:10px;'>중3 실전 가중치 100% 반영</div>"; } const totalRaw = (avgs.A + avgs.B + avgs.C + avgs.D) * 6; for(let i=1; i<=8; i++) document.getElementById('p'+i).style.display = "block"; const headerTitle = `APEX 학업역량 정밀진단 리포트 (${currentSession}차)`; const headerHtml = `<div class="title-area"><div><h1 style="font-size:1.7em;">${headerTitle}</h1><div class="sub-text">데이터로 증명하는 최상위권의 합격 DNA</div></div></div>`; ['header-p2','header-p3','header-p4','header-p5','header-p6','header-p7','header-p8'].forEach(id => document.getElementById(id).innerHTML = headerHtml); document.getElementById('outSessionText').innerText = `${currentSession}차 진단`; document.getElementById('outDate').innerText = info.date; document.getElementById('outSchool').innerText = info.school; document.getElementById('outGrade').innerText = document.getElementById('inGrade').options[document.getElementById('inGrade').selectedIndex].text; document.getElementById('outName').innerText = info.name; const currentStep0Qs = (currentSession === "1") ? step0_short_1 : step0_short_2; const s0Disp = document.getElementById('step0_display'); s0Disp.innerHTML = ""; currentStep0Qs.forEach((q, i) => { let val = ""; if(i < 6) { val = document.getElementById(`s0_${i}`).value; s0Disp.innerHTML += `<div class="survey-item" style="grid-column: 1 / -1; flex-direction: column; align-items: flex-start; padding: 4px 0; border-bottom: 1px dashed #eee; margin-bottom: 2px;"><span class="q" style="font-weight:700; color:#333; margin-bottom:3px; font-size:0.9em;">${q}</span><span class="a" style="color:var(--primary); background:#f4faff; padding:4px 10px; border-radius:6px; width:100%; display:block; font-weight:600; font-size:0.9em;">${val || '-'}</span></div>`; } else { val = document.getElementById(`s0_${i}`).options[document.getElementById(`s0_${i}`).selectedIndex].text; s0Disp.innerHTML += `<div class="survey-item" style="padding: 4px 0; font-size: 0.85em;"><span class="q">${q}</span><span class="a">${val}</span></div>`; } }); const mDisp = document.getElementById('main_survey_display'); mDisp.innerHTML = ""; const activeDomainData = (currentSession === "1") ? domains_1[info.gradeVal] : domains_2[info.gradeVal]; for (let d in activeDomainData) { mDisp.innerHTML += `<h4 style="margin:15px 0 5px 0; color:var(--primary); font-size:1.05em;">[${{A:"탐구(Inquiry)", B:"주도(Self-Directed)", C:"정서(Resilience)", D:"습관(Habit)"}[d]}]</h4><div class="survey-grid" style="margin-top:5px;"></div>`; const lastGrid = mDisp.lastElementChild; activeDomainData[d].forEach((q, i) => { const score = document.querySelectorAll(`.q-val[data-domain="${d}"]`)[i].value; lastGrid.innerHTML += `<div class="survey-item"><span class="q">${q}</span><span class="a">${score}점</span></div>`; }); } const overviews = { elem: "<b>Step 1. The Seed 단계</b>는 미래의 영재학교 및 의대 진학 가능성을 결정짓는 '지적 호기심의 씨앗'과 '기초 학습 체질'을 확인하는 고유 진단 과정입니다. 이 시기 학생이 보여주는 Inquiry(탐구) 점수는 단순 성적을 넘어 고교 진학 후 창의융합 활동에서 두각을 나타낼 수 있는 잠재력을 객관적으로 증명합니다.", mid12: "<b>Step 2. The Route 단계</b>는 자유학기제를 활용해 자신의 '계열 적합성'을 데이터로 확정하고 메타인지 기반의 주도적 학습 도구를 체계화하는 골든타임 진단입니다. 지능에만 의존하는 학습에서 벗어나 백지 복습과 엄격한 시간 관리 습관이 정착되었는지를 정밀하게 측정하여 대입 개편 환경에서의 경쟁력을 확보합니다.", mid3: "<b>Step 3. The Final 단계</b>는 실제 9개 명문 고교의 입학 요강을 반영하여 생기부 내 탐구 사례가 학교 인재상에 부합하는지, 자소서 및 면접용 '킬러 콘텐츠'가 실재하는지를 분석합니다. 특히 입학 후 전교 1등이 겪게 될 내신 급락 현실을 견딜 수 있는 '실전 멘탈' 지표를 측정하여 최종 합격 가능성을 증명합니다." }; document.getElementById('step_overview_box').innerHTML = overviews[info.gradeVal]; document.getElementById('resTotal').innerText = `${totalRaw.toFixed(1)} / 240`; document.getElementById('totalBoxTitle').innerText = currentSession === "1" ? "학업역량 정밀진단 종합 지수 (거품 제거 전 원점수)" : "2차 진단 종합 지수 (추이 반영)"; const badge = document.getElementById('trendBadge'); if (currentSession === "2") { const prevScore = parseFloat(document.getElementById('inPrevScore').value || 0); if(prevScore > 0) { const diff = (totalRaw - prevScore).toFixed(1); badge.style.display = "inline-block"; if (diff > 0) { badge.className = "trend-badge trend-up"; badge.innerText = `▲ ${diff}점 상승`; } else if (diff < 0) { badge.className = "trend-badge trend-down"; badge.innerText = `▼ ${Math.abs(diff)}점 하락`; } else { badge.className = "trend-badge trend-same"; badge.innerText = `- 유지`; } } else { badge.style.display = "none"; } } else { badge.style.display = "none"; } let tierText = ""; let summaryText = ""; if (totalRaw >= 231) { tierText = "The Master (최상위 의대 안정권)"; summaryText = "학생은 전 영역에서 결점이 없는 완벽한 밸런스를 보여주는 최상위 인재입니다. 탁월한 탐구력(Inquiry)과 무너지지 않는 회복탄력성(Resilience)의 결합을 통해 전국구 의대 및 영재학교 진학 시에도 최상위권 경쟁력을 유지할 수 있습니다. 이미 완성된 입시 근력을 바탕으로 압도적인 생기부 킬러 콘텐츠를 기획하십시오."; } else if (totalRaw >= 221) { tierText = "Expert A (심화 탐구형 상위권)"; summaryText = "학생은 지적 호기심을 바탕으로 한 탐구 역량이 독보적인 수준입니다. 과학고 및 전국 단위 자사고의 최상위 트랙에 진학하기에 충분한 학업적 깊이를 갖추고 있습니다. 고난도 수학/과학 융합 탐구 보고서를 집중적으로 생산하여 본인만의 천재성을 서류로 입증하는 단계로 넘어가야 합니다."; } else if (totalRaw >= 211) { tierText = "Expert B (자기주도 내신형)"; summaryText = "메타인지 기반의 주도성(Self-Directed)과 습관(Habit) 영역이 매우 우수합니다. 높은 엉덩이의 힘을 바탕으로 한 완벽한 내신 1.0 관리 전략이 주효하며, 지역인재 의대 트랙 공략의 적기입니다. 다만 최상위권 변별을 위한 심화 탐구 역량에 10%의 아쉬움이 있으므로 이 부분을 집중 보완해야 합니다."; } else if (totalRaw >= 201) { tierText = "Stable A (성실 기반 유지형)"; summaryText = "학생은 높은 성실도를 바탕으로 흔들림 없는 기초 체력을 확보하고 있습니다. 공주사대부고, 한일고 등 엄격한 규칙이 적용되는 기숙형 자율학교 환경에서 두각을 나타낼 수 있는 훌륭한 자산입니다. 이제는 수동적인 성실함을 넘어 스스로 질문을 던지고 파고드는 능동적 지적 호기심을 점화할 때입니다."; } else if (totalRaw >= 191) { tierText = "Stable B (기본기 확보형)"; summaryText = "기본적인 학업 체력은 양호하나, 특목·자사고의 치열한 경쟁을 압도하기에는 2% 부족한 상태입니다. 특히 고난도 과제를 마주했을 때의 회복탄력성과 심화 탐구 역량을 보완한다면 폭발적인 반등이 가능합니다. 주도적인 백지 복습을 통해 지식의 깊이를 더하는 훈련이 시급합니다."; } else if (totalRaw >= 181) { tierText = "Developing (환경 의존 기복형)"; summaryText = "학생은 학습 잠재력은 있으나 정서적 기복과 습관의 불균형으로 인해 외부 환경에 크게 의존하는 경향을 보입니다. 스마트폰 등 유혹에 대한 환경 통제 훈련과 명확한 동기부여가 시급합니다. 무리한 특목고 지원보다는 확실한 생활 루틴을 잡고 자존감을 회복하는 것이 선결 과제입니다."; } else if (totalRaw >= 171) { tierText = "Potential (실행력 부족형)"; summaryText = "지능이나 이해력 등 잠재력은 존재하지만, 이를 결과로 만들어낼 실행력(습관, 주도성)이 심각하게 부족한 상태입니다. 현재 상태로 고강도 경쟁 학교에 진학 시 적응에 큰 어려움을 겪을 수 있습니다. 차라리 일반고로 진학하여 최상위 내신을 선점하는 전략을 권장하며, 강력한 생활 통제가 필요합니다."; } else { tierText = "Critical (학습 결손 위험군)"; summaryText = "누적된 학습 결손과 메타인지의 심각한 결핍이 데이터로 나타나고 있습니다. 무리한 선행 진도는 무의미하며, 학원 지시에만 의존하는 수동적 태도를 당장 버려야 합니다. 전문가와의 긴급 상담을 통해 스마트폰 격리, 수면 루틴 확립 등 학업 체질을 근본적으로 바꾸는 극약 처방이 즉시 가동되어야 합니다."; } document.getElementById('resTier').innerText = tierText; document.getElementById('resSummary').innerHTML = summaryText; if(info.style === 'master' && (avgs.B < 6 || avgs.D < 6)) { document.getElementById('mismatchArea').innerHTML = `<div class="mismatch-box"><b>⚠ [The Illusionist] 메타인지 결핍 경고:</b> 학생은 스스로를 '마스터형'으로 인식하고 있으나 실제 주도성(B) 및 습관(D) 지표는 평균 이하입니다. 이는 본인의 학습 통제력을 과대평가하고 있음을 의미하며, 입학 후 자기주도 시간 확보 실패 시 성적이 급락할 위험이 매우 큽니다.</div>`; } else { document.getElementById('mismatchArea').innerHTML = ""; } const domainNames = {A:"탐구(Inquiry)", B:"주도(Self-Directed)", C:"정서(Resilience)", D:"습관(Habit)"}; const getAnalysis = (avg, domain) => { const level = avg >= 9 ? 'Master' : (avg >= 7 ? 'Proficient' : (avg >= 5 ? 'Developing' : 'Critical')); const levelTxt = {Master:"전문가 (Master)", Proficient:"숙련 (Proficient)", Developing:"발전 (Developing)", Critical:"결손 주의 (Critical)"}[level]; const tagClass = `tag-${level.toLowerCase()}`; let intro = ""; let content = ""; if(domain === 'A') { intro = "탐구 역량은 단순 문제 풀이를 넘어 교과 개념에 의문을 갖고 가설을 세워 검증하는 '지적 호기심'의 척도입니다."; if(avg >= 9) content = "<b>[Master 특성]</b> 가설 설정 및 검증 능력이 탁월하여 STEAM형 면접에 최적화된 독보적 강점을 지닙니다. 현상의 원리에 대해 스스로 질문하며 난제 해결을 즐깁니다. <br><br><b>[전략 제언]</b> 이 지적 에너지를 실제 산출물로 연결하여 생기부의 팩트로 증명하는 고도화 과정이 필요합니다."; else if(avg >= 7) content = "<b>[Proficient 특성]</b> 교과 개념에 대한 이해도와 탐구 의지는 양호하나, 아직 스스로 심화 주제를 기획하고 끝까지 파고드는 Deep-Dive 경험이 다소 부족합니다. <br><br><b>[전략 제언]</b> 전문가와 함께 관심 분야의 작은 주제부터 가설-검증 프로세스를 경험하며 지적 확장성을 증명해야 합니다."; else if(avg >= 5) content = "<b>[Developing 특성]</b> 수동적인 지식 습득에 머물러 있어 정답이 없는 심화 주제나 창의융합 과제를 다룰 때 뚜렷한 한계를 드러낼 수 있습니다. <br><br><b>[전략 제언]</b> 무리한 선행보다는 '왜?'라는 질문을 던지고 스스로 답을 찾는 기초 탐구 훈련이 시급합니다."; else content = "<b>[Critical 특성]</b> 지적 호기심이 부족하고 단순 암기에만 의존하는 경향이 강해 고난도 융합 과제 수행에 큰 어려움이 예상됩니다. <br><br><b>[긴급 처방]</b> 흥미를 유발할 수 있는 실생활 연계형 기초 탐구부터 시작하여 학업에 대한 거부감을 줄여야 합니다."; } else if(domain === 'B') { intro = "주도 역량은 자신이 아는 것과 모르는 것을 구분하고 효율적으로 학습 로드맵을 설계하는 '메타인지' 능력입니다."; if(avg >= 9) content = "<b>[Master 특성]</b> 학습 우선순위를 스스로 결정하고 백지 복습을 통해 공부 구멍을 메우는 메타인지가 매우 우수합니다. 방대한 학습량을 요구하는 특목고에서도 절대 페이스를 잃지 않을 경쟁력입니다.<br><br><b>[전략 제언]</b> 자신의 공부 방식이 효과적임을 입증할 객관적 결과 데이터들을 누적하여 서류의 신뢰도를 극대화하십시오."; else if(avg >= 7) content = "<b>[Proficient 특성]</b> 주어진 과제는 성실히 수행하지만, 학원이나 가이드에 일정 부분 의존하는 경향이 있습니다. 입학 후 자율학습 시간에 효율 저하를 겪을 수 있습니다.<br><br><b>[전략 제언]</b> 지시받지 않은 스스로의 공부 비중을 늘리고 백지 구조화 복습을 통해 공부의 주도권을 완전히 가져와야 합니다."; else if(avg >= 5) content = "<b>[Developing 특성]</b> 학습 계획은 세우나 실천력이 떨어지고 기분이나 외부 환경에 따라 학습량 기복이 심하게 나타납니다.<br><br><b>[전략 제언]</b> 거창한 계획보다는 매일 100% 달성 가능한 최소한의 루틴을 정하고, 1분 설명하기 등을 통해 진짜 아는 것인지 점검해야 합니다."; else content = "<b>[Critical 특성]</b> 독립적인 학습 설계 능력이 전무하며 누군가의 강제나 지시 없이는 공부를 시작하지 못하는 상태입니다.<br><br><b>[긴급 처방]</b> 스스로 오늘 할 분량을 정하고 점검하는 '셀프 플래닝' 기초 훈련을 통해 무기력을 타파해야 합니다."; } else if(domain === 'C') { intro = "정서 역량은 실패를 분석하고 성장의 발판으로 삼는 '회복탄력성'과 치열한 경쟁 환경에서의 '생존력'입니다."; if(avg >= 9) content = "<b>[Master 특성]</b> 경쟁 환경의 긴장감을 즐거움으로 승화시키는 정서적 근육이 훌륭하여 일시적 성적 하락에도 전혀 흔들리지 않습니다. 의대 정시까지 완주할 수 가장 믿음직한 심리적 자산입니다.<br><br><b>[전략 제언]</b> 지금의 안정적인 마인드셋을 지속적으로 유지하며 입시 당일까지 지치지 않도록 꾸준한 에너지 관리와 휴식을 병행하십시오."; else if(avg >= 7) content = "<b>[Proficient 특성]</b> 전반적으로 긍정적이나, 고난도 문제나 예상치 못한 실수 앞에서 일시적으로 당황하거나 위축되는 경향이 있습니다.<br><br><b>[전략 제언]</b> 성적 하락을 실패가 아닌 전략 수정의 신호로 받아들이는 유연성 훈련과 멘탈 케어가 병행되면 완벽해집니다."; else if(avg >= 5) content = "<b>[Developing 특성]</b> 완벽주의 성향이나 결과에 대한 압박감으로 인해 실패를 두려워하며, 이는 슬럼프를 장기화시킬 큰 위험 요소입니다.<br><br><b>[전략 제언]</b> 결과 중심의 평가보다는 과정에서의 작은 성장을 칭찬하여 학업 자존감과 효능감을 회복하는 것이 최우선입니다."; else content = "<b>[Critical 특성]</b> 작은 좌절에도 쉽게 무기력해지고 실패의 원인을 외부로 돌리는 회피 성향이 관찰됩니다. 고강도 경쟁 환경에서 중도 포기 확률이 높습니다.<br><br><b>[긴급 처방]</b> 치열한 환경 진입을 잠시 보류하고, 심리적 안정감을 줄 수 있는 환경에서 성공 경험을 누적시켜야 합니다."; } else { intro = "습관 역량은 스마트폰 등 온갖 유혹을 물리적으로 차단하고 '진짜 공부 시간'을 집요하게 사수하는 힘입니다."; if(avg >= 9) content = "<b>[Master 특성]</b> 외부 유혹을 완벽히 차단하고 정해진 시간을 사수하는 환경 통제력이 이미 체질화되어 있습니다. 엄격한 기숙 생활에서 최고 효율을 낼 결정적 증거입니다.<br><br><b>[전략 제언]</b> 루틴을 기반으로 수능 최저 기준을 여유 있게 충족할 수 있도록 전략 과목의 원점수 1점 관리에 집요함을 발휘하십시오."; else if(avg >= 7) content = "<b>[Proficient 특성]</b> 기본적인 학습 루틴은 갖춰져 있으나, 스마트폰 등 특정 유혹에 가끔 흔들리며 실제 집중 시간의 밀도가 살짝 아쉽습니다.<br><br><b>[전략 제언]</b> 스마트폰을 물리적으로 완전 격리하고 단 하나의 개념에 깊이 침잠해보는 Deep-Work 연습을 통해 체질을 한 단계 업그레이드 하십시오."; else if(avg >= 5) content = "<b>[Developing 특성]</b> 책상에 앉아있는 시간 대비 실제 몰입도가 현저히 낮습니다. 기숙사형 학교 진학 시 성적 급락으로 직결될 위험이 매우 큽니다.<br><br><b>[전략 제언]</b> 스스로 환경을 통제하기 어려운 상태이므로, 학원이나 부모님의 물리적인 스마트폰 차단 및 환경 격리 조치가 필요합니다."; else content = "<b>[Critical 특성]</b> 디지털 기기에 대한 통제력이 상실되어 있으며, 매일의 기본 수면/기상 루틴마저 흔들리고 있는 심각한 상태입니다.<br><br><b>[긴급 처방]</b> 선행 학습보다 매일 같은 시간에 자고 일어나는 생활 규칙과 전자기기 사용 엄격 통제가 즉시 선행되어야 합니다."; } return `<div class="analysis-box"><b style="font-size:1.25em; color:var(--primary); display:block; margin-bottom:5px;">🔹 ${domainNames[domain]}: ${(avg*10).toFixed(0)}점</b><div class="rubric-tag ${tagClass}" style="margin-bottom:15px;">${levelTxt}</div><br>${intro}<br><br>${content}</div>`; }; document.getElementById('domainPart1').innerHTML = getAnalysis(avgs.A, 'A') + getAnalysis(avgs.B, 'B'); document.getElementById('domainPart2').innerHTML = getAnalysis(avgs.C, 'C') + getAnalysis(avgs.D, 'D'); // ------------------------------------------------------------- // [V26 생존 지수 및 7P 렌더링 최적화] // ------------------------------------------------------------- let survivalRawCalib = (((avgs.C * 6) + (avgs.D * 4)) * mentalCalibration).toFixed(1); let survivalStatus = survivalRawCalib >= 85 ? "안정" : (survivalRawCalib >= 70 ? "관심" : "위험"); let survivalColor = survivalRawCalib >= 85 ? "#2e7d32" : (survivalRawCalib >= 70 ? "#f57c00" : "#d32f2f"); let indexHtml = ""; if (info.gradeVal === 'elem') { const seed = (((avgs.A * 6) + (avgs.D * 4)) * mentalCalibration).toFixed(1); indexHtml = ` <div style="display:grid; grid-template-columns: 1fr 1.2fr; gap:15px; margin-bottom: 25px;"> <div> <h3>🌱 초등 잠재력 씨앗 지수</h3> <div class="analysis-box" style="height: 140px; padding:15px;"> <div style="text-align:center; margin-top:10px;"><span style="font-size:2em; font-weight:900; color:var(--primary);">${seed}점</span></div> <p style="font-size:0.8em; color:#555; text-align:center; margin-top:10px;">지적 호기심과 기초 습관 결합도<br>85점 이상 시 영재성 발현 단계</p> </div> </div> <div> <h3>🛡 실전 입시 생존 지수</h3> <div class="analysis-box" style="height: 140px; border-left: 5px solid ${survivalColor}; padding:15px;"> <div style="text-align:center; margin-top:0;"> <span style="font-size:2em; font-weight:900; color:var(--primary);">${survivalRawCalib}점</span> <span style="color:${survivalColor}; font-weight:bold; font-size:1.1em; margin-left:10px;">[${survivalStatus}]</span> </div> <p style="font-size:0.8em; color:#555; text-align:center; margin-top:10px; line-height:1.4;">${calibText}<br><span style="color:#d32f2f; font-weight:bold;">70점 미만 시 고교 매칭 페널티 감점 적용</span></p> </div> </div> </div> `; } else if (info.gradeVal === 'mid12') { const nat = (((avgs.A * 7) + (avgs.B * 3)) * mentalCalibration).toFixed(1); const hum = (((avgs.B * 7) + (avgs.A * 3)) * mentalCalibration).toFixed(1); indexHtml = ` <div style="display:grid; grid-template-columns: 1fr 1.2fr; gap:15px; margin-bottom: 20px;"> <div> <h3 style="margin-top:15px;">🧭 계열 적합성 (자연/인문)</h3> <div class="analysis-box" style="height: 130px; padding:15px;"> <div style="display:flex; justify-content:space-around; margin-top:5px;"> <div style="text-align:center;"><div style="font-size:1.4em; font-weight:900; color:var(--secondary);">${nat}점</div><div style="font-size:0.8em; font-weight:bold;">자연/의학</div></div> <div style="text-align:center;"><div style="font-size:1.4em; font-weight:900; color:#d32f2f;">${hum}점</div><div style="font-size:0.8em; font-weight:bold;">인문/사회</div></div> </div> <p style="font-size:0.75em; color:#555; text-align:center; margin-top:10px;">격차 5점 이상 시 해당 계열 우세<br>5점 이내 시 <b>'창의 융합형(영재고형)'</b></p> </div> </div> <div> <h3 style="margin-top:15px;">🛡 실전 입시 생존 지수 (Survival Index)</h3> <div class="analysis-box" style="height: 130px; border-left: 5px solid ${survivalColor}; padding:15px;"> <div style="text-align:center; margin-top:0;"> <span style="font-size:1.8em; font-weight:900; color:var(--primary);">${survivalRawCalib}점</span> <span style="color:${survivalColor}; font-weight:bold; font-size:1.1em; margin-left:10px;">[${survivalStatus}]</span> </div> <p style="font-size:0.76em; color:#555; text-align:center; margin-top:8px; line-height:1.45;">특목고 입학 후 고강도 내신 경쟁을 견디는 <b>'실전 멘탈'</b> 지표입니다.<br><b>90점 이상</b>은 최상위권 안착 가능, <b>75점 미만</b>은 환경 적응형 성적 하락을 경고합니다.</p> </div> </div> </div> `; } else { const nat3 = ((avgs.A * 7) + (avgs.B * 3)).toFixed(1); const hum3 = ((avgs.B * 7) + (avgs.A * 3)).toFixed(1); indexHtml = ` <div style="display:grid; grid-template-columns: 1fr 1.2fr; gap:15px; margin-bottom: 15px;"> <div> <h3 style="margin-top:5px; font-size:0.95em;">🧭 계열 적합성 판정</h3> <div class="analysis-box" style="height: 125px; padding:12px;"> <div style="display:flex; justify-content:space-around; margin-top:2px;"> <div style="text-align:center;"><div style="font-size:1.3em; font-weight:900; color:var(--secondary);">${nat3}점</div><div style="font-size:0.75em; font-weight:bold;">자연/의학</div></div> <div style="text-align:center;"><div style="font-size:1.3em; font-weight:900; color:#d32f2f;">${hum3}점</div><div style="font-size:0.75em; font-weight:bold;">인문/사회</div></div> </div> <p style="font-size:0.63em; color:#555; text-align:center; margin-top:6px; line-height:1.3;">격차 5점 이상 시 해당 계열 우세, 5점 이내일 경우 <b>'창의 융합형(세종영재고형)'</b>으로 판정하여 양방향 로드맵 설계를 권장합니다.</p> </div> </div> <div> <h3 style="margin-top:5px; font-size:0.95em;">🛡 실전 입시 생존 지수 (Survival Index)</h3> <div class="analysis-box" style="height: 125px; border-left: 5px solid ${survivalColor}; padding:12px;"> <div style="display:flex; align-items:center; justify-content:center; flex-wrap:wrap; gap:6px; margin-top:0;"> <span style="font-size:1.6em; font-weight:900; color:var(--primary);">${survivalRawCalib}점</span> <span style="color:${survivalColor}; font-weight:bold; font-size:1em; background:#f0f0f0; padding:3px 10px; border-radius:8px;">[${survivalStatus}]</span> ${calibText} </div> <p style="font-size:0.63em; color:#555; text-align:center; margin-top:6px; line-height:1.3;">특목고 입학 후 5등급 이하 추락(심해어)을 방어하는 <b>'실전 멘탈'</b> 지표입니다. 70점 미만 시 아래 고교 선발 매칭 점수에서 <b>치명적 감점(유리턱 페널티)</b>이 적용됩니다.</p> </div> </div> </div> `; } document.getElementById('gradeIndexArea').innerHTML = indexHtml; // ------------------------------------------------------------- // [V26 알고리즘 초정밀 연산] // ------------------------------------------------------------- const getG = (subj, sem) => parseFloat(document.getElementById(`g-${subj}-${sem}`).value); const kor = [getG('kor','21'), getG('kor','22'), getG('kor','31'), getG('kor','32')]; const eng = [getG('eng','21'), getG('eng','22'), getG('eng','31'), getG('eng','32')]; const mat = [getG('mat','21'), getG('mat','22'), getG('mat','31'), getG('mat','32')]; const sci = [getG('sci','21'), getG('sci','22'), getG('sci','31'), getG('sci','32')]; const soc = [getG('soc','21'), getG('soc','22'), getG('soc','31'), getG('soc','32')]; const his = [getG('his','21'), getG('his','22'), getG('his','31'), getG('his','32')]; // ★ 버그수정 v3: 내신/모의고사/선행단계 중 "일부만" 입력된 경우에도, // 입력하지 않은 항목만 계산에서 제외하고 나머지 입력된 항목만으로 // 부분 반영되도록 전면 개편. (기존엔 30개 중 하나라도 비어있으면 전부 // 무시하고 성향 진단 점수로만 계산되는 "전부 아니면 전무" 방식이었음) // _wAvg: [값,가중치] 쌍의 목록에서 값이 없는(NaN) 항목은 제외하고, // 남은 항목들의 가중치 비율대로 재분배한 가중평균을 계산한다. // (전부 입력된 경우엔 가중치 총합이 1이 되도록 설계돼 있어 기존과 정확히 // 동일한 값이 나오고, 일부만 입력된 경우에만 자연스럽게 재분배된다) const _wAvg = function(pairs){ let num=0, den=0; pairs.forEach(function(p){ if(!isNaN(p[0]) && p[1]>0){ num+=p[0]*p[1]; den+=p[1]; } }); return den>0 ? (num/den) : NaN; }; // 상산고 환산 (2-1 20%, 2-2 30%, 3-1 50%) - 일부 학기만 입력돼도 비율 재조정 const ss_kor = _wAvg([[kor[0],0.2],[kor[1],0.3],[kor[2],0.5]]); const ss_eng = _wAvg([[eng[0],0.2],[eng[1],0.3],[eng[2],0.5]]); const ss_mat = _wAvg([[mat[0],0.2],[mat[1],0.3],[mat[2],0.5]]); const ss_sci = _wAvg([[sci[0],0.2],[sci[1],0.3],[sci[2],0.5]]); const ss_soc = _wAvg([[soc[0],0.2],[soc[1],0.3],[soc[2],0.5]]); const ss_his = _wAvg([[his[0],0.2],[his[1],0.3],[his[2],0.5]]); const gpaSangsan = _wAvg([[ss_mat,100],[ss_kor,70],[ss_eng,70],[ss_sci,40],[ss_soc,20],[ss_his,20]]); // 일반고/사대부고/북일고 6과목 균등 환산 - 입력된 학기만으로 평균 // (3학년2학기는 입력했으면 반영, 안 했으면 자동 제외) const bi_kor = _wAvg([[kor[0],1],[kor[1],1],[kor[2],1],[kor[3],1]]); const bi_eng = _wAvg([[eng[0],1],[eng[1],1],[eng[2],1],[eng[3],1]]); const bi_mat = _wAvg([[mat[0],1],[mat[1],1],[mat[2],1],[mat[3],1]]); const bi_sci = _wAvg([[sci[0],1],[sci[1],1],[sci[2],1],[sci[3],1]]); const bi_soc = _wAvg([[soc[0],1],[soc[1],1],[soc[2],1],[soc[3],1]]); const bi_his = _wAvg([[his[0],1],[his[1],1],[his[2],1],[his[3],1]]); const gpaBukil = _wAvg([[bi_kor,1],[bi_eng,1],[bi_mat,1],[bi_sci,1],[bi_soc,1],[bi_his,1]]); const gpaForeign = bi_eng; const gpaSciMath = _wAvg([[ss_mat,1],[ss_sci,1]]); // 백분위 및 선행(정량 지표) const mockSciMath = parseFloat(document.getElementById('inMockMathSci').value); const mockKorEng = parseFloat(document.getElementById('inMockKorEng').value); const mScale = parseFloat(document.getElementById('inMathLevel').value); const sScale = parseFloat(document.getElementById('inSciLevel').value); const eScale = parseFloat(document.getElementById('inEngLevel').value); const hScale = parseFloat(document.getElementById('inHisLevel').value); const getMental = (wa, wb, wc, wd) => { let rawMental = (((wa*avgs.A + wb*avgs.B + wc*avgs.C + wd*avgs.D) / (10*(wa+wb+wc+wd))) * 100); return rawMental * mentalCalibration; }; const survivalPenalty = (survivalRawCalib < 70) ? 0.95 : 1.0; // ★ calcFinal/calcFinalNoPenalty: [값,가중치] 쌍의 배열을 받아서, 값이 없는 // (NaN) 항목은 제외하고 나머지 항목의 가중치 비율로 재분배한 가중평균을 // 최종 점수로 사용한다. const calcFinal = (parts) => { let score = _wAvg(parts); if(isNaN(score)) score = 0; score = score * survivalPenalty; return Math.min(99.5, Math.max(0, score)).toFixed(1); }; const calcFinalNoPenalty = (parts) => { let score = _wAvg(parts); if(isNaN(score)) score = 0; return Math.min(99.5, Math.max(0, score)).toFixed(1); }; // [V26] 학교별 수식 정밀 계산 const advGeneral = _wAvg([[mockSciMath,1],[mockKorEng,1],[mScale,1],[eScale,1],[sScale,1],[hScale,1]]); // ★ 개선: 예전엔 24개 항목 중 하나라도 비어있으면 전부 무시하고 성향 진단 // 점수로만 계산했지만, 이제는 "입력한 항목만이라도 반영"하도록 바꿨다. // → 내신/모의고사/선행 중 단 하나라도 입력돼 있으면 실제 데이터 기반 // 공식을 사용하고(입력 안 한 항목만 자동 제외), 정말 아무것도 입력 // 안 한 경우에만 성향 진단(4대 영역)만으로 추정한 잠재력 기준 점수를 // 사용한다. const hasAnyAcademicData = _gradeSelectIds.some(function(id){ const _el = document.getElementById(id); return _el && _el.dataset.touched === '1'; }); const hasFullAcademicData = _untouchedGrades.length === 0; const getDomainOnly = (wa, wb, wc, wd) => { return ((wa*avgs.A + wb*avgs.B + wc*avgs.C + wd*avgs.D) / (wa+wb+wc+wd)) * 10; }; let schools; if (hasAnyAcademicData) { schools = [ // 영재고: 이과내신(20%) + 이과모의(20%) + 수과선행(20%) + 면접멘탈(40%) {name: "세종과학예술영재", score: calcFinal([[gpaSciMath,0.2],[mockSciMath,0.2],[_wAvg([[mScale,1],[sScale,1]]),0.2],[getMental(5.2,3.0,0.9,0.9),0.4]]), target: "92.5점"}, // 과고: 이과내신(30%) + 이과모의(10%) + 수과선행(30%) + 면접멘탈(30%) {name: "충남과학고", score: calcFinal([[gpaSciMath,0.3],[mockSciMath,0.1],[_wAvg([[mScale,1],[sScale,1]]),0.3],[getMental(5.0,3.2,0.8,1.0),0.3]]), target: "90.0점"}, // 상산고: 특화내신(50%) + 이과모의(15%) + 수학선행(15%) + 면접멘탈(20%) {name: "상산고 (의대 전국)", score: calcFinal([[gpaSangsan,0.5],[mockSciMath,0.15],[mScale,0.15],[getMental(4.2,3.0,2.0,0.8),0.2]]), target: "88.0점"}, // 북일고: 전과목내신(60%) + 종합모의(10%) + 수/영선행(10%) + 면접멘탈(20%) {name: "북일고 (자사고)", score: calcFinal([[gpaBukil,0.6],[_wAvg([[mockSciMath,1],[mockKorEng,1]]),0.1],[_wAvg([[mScale,1],[eScale,1]]),0.1],[getMental(3.0,4.2,1.8,1.0),0.2]]), target: "85.0점"}, // 공주사대부고: 전과목내신(70%) + 종합선행모의방어력(30%) / 멘탈 0% (면접없음) {name: "공주사대부고", score: calcFinal([[gpaBukil,0.7],[advGeneral,0.3]]), target: "86.0점"}, // 한일고: 전과목내신(70%) + 종합모의방어력(20%) + 자기주도멘탈(10%) {name: "한일고 (자율학교)", score: calcFinal([[gpaBukil,0.7],[advGeneral,0.2],[getMental(1.0,3.0,2.0,4.0),0.1]]), target: "87.5점"}, // 외고/국제고: 영어내신(50%) + 문과모의(15%) + 영어선행(15%) + 면접(20%) {name: "대전외고/세종국제", score: calcFinal([[gpaForeign,0.5],[mockKorEng,0.15],[eScale,0.15],[getMental(2.0,4.5,2.5,1.0),0.2]]), target: "84.5점"}, // 세종고: 전과목내신(70%) + 종합선행모의방어력(30%) / 멘탈 0% (면접없음) {name: "세종고 (의대 거점)", score: calcFinal([[gpaBukil,0.7],[advGeneral,0.3]]), target: "82.0점"}, // 일반고: 면접/자소서 없음 → 전과목내신(75%) + 종합 선행/모의(25%), 실전 멘탈 가중치 및 페널티 미적용 {name: "지역우수 일반고", score: calcFinalNoPenalty([[gpaBukil,0.75],[advGeneral,0.25]]), target: "75.0점"} ]; } else { // 잠재력(성향 진단 4대 영역) 기반 추정 — 내신/모의고사/선행 데이터가 전혀 없을 때만 사용 schools = [ {name: "세종과학예술영재", score: getDomainOnly(5.2, 3.0, 0.9, 0.9).toFixed(1), target: "92.5점", est:true}, {name: "충남과학고", score: getDomainOnly(5.0, 3.2, 0.8, 1.0).toFixed(1), target: "90.0점", est:true}, {name: "상산고 (의대 전국)", score: getDomainOnly(4.2, 3.0, 2.0, 0.8).toFixed(1), target: "88.0점", est:true}, {name: "북일고 (자사고)", score: getDomainOnly(3.0, 4.2, 1.8, 1.0).toFixed(1), target: "85.0점", est:true}, {name: "공주사대부고", score: getDomainOnly(2.0, 1.0, 0.0, 7.0).toFixed(1), target: "86.0점", est:true}, {name: "한일고 (자율학교)", score: getDomainOnly(1.0, 3.0, 2.0, 4.0).toFixed(1), target: "87.5점", est:true}, {name: "대전외고/세종국제", score: getDomainOnly(2.0, 4.5, 2.5, 1.0).toFixed(1), target: "84.5점", est:true}, {name: "세종고 (의대 거점)", score: getDomainOnly(0.0, 5.0, 5.0, 0.0).toFixed(1), target: "82.0점", est:true}, {name: "지역우수 일반고", score: getDomainOnly(2.0, 2.0, 3.0, 3.0).toFixed(1), target: "75.0점", est:true} ]; } const _matchNoteEl = document.getElementById('matchNoteArea'); if(_matchNoteEl) _matchNoteEl.style.display = hasAnyAcademicData ? '' : 'none'; const sGrid = document.getElementById('schoolGrid'); sGrid.innerHTML = ""; if(!hasAnyAcademicData){ sGrid.innerHTML += `<div style="grid-column:1/-1;background:#fff8e1;border:1.5px solid #ffca28;border-radius:6px;padding:5px 10px;font-size:0.62em;line-height:1.35;color:#8a6d00;margin-bottom:6px">⚠ 교과 내신·모의고사·선행 단계가 입력되지 않아, 아래 점수는 <b>성향 진단(4대 영역)만으로 추정한 잠재력 기준 점수</b>입니다. 실제 합격 가능성을 정밀 판정하려면 내신·모의고사·선행 단계를 선택한 뒤 리포트를 다시 생성해 주세요.</div>`; } schools.forEach(s => { let sc = parseFloat(s.score); let tg = parseFloat(s.target.replace('점','')); let diff = (sc - tg).toFixed(1); let badge, badgeTxt; if(s.est){ // 잠재력 추정 모드: 실제 데이터 기반 판정이 아니므로 '내신/선행보완'·'면접/자소서도전' 같은 // 세부 문구 없이, 평균 대비 격차만으로 단순 3단계(안정합격권/전략도전권/관심보완권)로 표시 badge = (diff >= 2.0) ? 'stable' : (diff >= -6.0 ? 'challenge' : 'caution'); badgeTxt = badge === 'stable' ? '안정 합격권' : (badge === 'challenge' ? '전략 도전권' : '관심 보완권'); } else { badge = (diff >= 2.0) ? 'stable' : (diff >= -3.0 ? 'challenge' : 'caution'); badgeTxt = badge === 'stable' ? '안정 합격권' : (badge === 'challenge' ? '전략 도전권' : '위험/하향지원'); if(s.name === "공주사대부고" || s.name === "세종고 (의대 거점)" || s.name === "지역우수 일반고") { if(badge === 'challenge') badgeTxt = '내신/선행 보완'; } else { if(badge === 'challenge') badgeTxt = '면접/자소서 도전'; } } let gapClass = diff >= 0 ? 'gap-plus' : 'gap-minus'; let gapStr = diff > 0 ? `+${diff}` : `${diff}`; sGrid.innerHTML += `<div class="school-card ${badge==='stable' ? 'gold' : ''}"> <div class="status-badge badge-${badge}">${badgeTxt}</div> <div style="font-weight:900; color:#222; font-size:1.05em;">${s.name}</div> <div class="school-score">${s.score}점</div> <div class="target-avg">권장 평균: ${s.target}</div> <div class="gap-indicator ${gapClass}">(평균 대비 ${gapStr}점)</div> </div>`; }); // 8P 로드맵 동적 렌더링 let stucareTxt = ""; let step1_title, step1_desc, step2_title, step2_desc, step3_title, step3_desc; if (totalRaw >= 221) { stucareTxt = "<b>🏆 [Master / Expert A Level] 초상위권 킬러 콘텐츠 및 논리 방어 전략</b><br><br>현재 학생의 역량은 이미 완성형에 가깝습니다. 이제는 단순 주제 탐구를 넘어 AI 스투케어를 통해 <b>'논리적 비약 제거'</b>와 <b>'학술적 깊이 증명'</b>에 집중해야 합니다. 교과 개념을 대학 기초 수준(일반물리/생물 등)까지 확장한 Deep-Dive 보고서를 산출하고, 이를 실제 면접 시뮬레이션의 압박 질문 방어와 연계하는 최상위권 전용 고도화 작업이 필수적입니다. (※ 무면접 전형 지원 시 수능 최저를 대비한 의대관/KMO급 선행 학습에 올인합니다.)"; step1_title = "심층 R&E 기획 및 대학 수준 탐구"; step1_desc = "지원 학교의 인재상에 맞춘 단순 탐구를 넘어, 대학 기초 학문(일반물리/생물 등) 수준의 문헌 고찰을 병행합니다. AI 스투케어 엔진을 활용해 누구도 흉내 낼 수 없는 '학술적 깊이'를 증명하는 킬러 콘텐츠를 산출하여 서류 전형을 압도합니다."; step2_title = "지식의 한계 돌파 및 개념 증명"; step2_desc = "단순한 암기식 복습을 완전히 배제하고, 아는 것과 모르는 것을 완벽히 분리하는 극한의 '백지 구조화 복습법'을 가동합니다. 교과 간 융합형 개념 증명 훈련을 통해 고난도 수리/과학 면접에 필요한 통합적 사고력을 극대화합니다."; step3_title = "MMI 및 다중 압박 면접 시뮬레이션"; step3_desc = "영재학교 및 의대 진학에 특화된 다중 미니 면접(MMI)과 심층 구술 고사에 대비합니다. 본인의 연구 결과에 대한 논리적 비약을 예리하게 파고드는 전문가의 압박 질문을 방어하며 어떠한 환경에서도 흔들리지 않는 실전 멘탈을 완성합니다."; } else if (totalRaw >= 201) { stucareTxt = "<b>⭐ [Expert B / Stable A Level] 전략적 세특 보강 및 전공 적합성 구체화</b><br><br>기본기와 주도성은 매우 우수하나, 최상위권 경쟁에서 완벽하게 승리하기 위한 생기부의 <b>'결정적 변별력(2%)'</b>이 부족한 상태입니다. AI 스투케어를 적극 활용하여 수업 중 생긴 궁금증을 가설-검증 단계로 구체화하고 이를 구체적 '팩트' 위주로 기록하는 훈련을 반복하십시오. (※ 무면접 전형 학교 지원 시에는 3단계 면접 대비 대신 고1 과정의 전 과목 완벽 선행에 집중해야 합니다.)"; step1_title = "전공 적합성 타겟팅 및 세특 기획"; step1_desc = "지원하려는 특정 학교 및 학과(의학, IT, 경영 등)의 선발 기준에 가장 부합하는 일관된 세특 스토리를 기획합니다. 학생의 작은 호기심을 AI 스투케어를 통해 '가설-검증-결론'의 명확한 탐구 보고서 형태로 구체화시켜 서류의 매력도를 높입니다."; step2_title = "약점 소거를 위한 논리적 메타인지"; step2_desc = "단순한 오답 노트를 넘어, 왜 틀렸는지에 대한 논리적 오류를 스스로 분석하고 기록하는 훈련을 진행합니다. 1분 설명하기를 통해 배운 내용을 자신의 언어로 재구성하여, 학습 누수를 막고 최상위 내신을 유지할 수 있는 견고한 복습 시스템을 구축합니다."; step3_title = "논리적 스토리텔링 및 자소서 완성"; step3_desc = "1,500자에 달하는 자기소개서를 본인만의 일관된 성장 스토리라인으로 구조화합니다. 서류에 기반한 예상 질문을 추출하고, 이에 대해 두괄식으로 명확한 근거를 제시하며 답변하는 실전 면접 훈련을 통해 최종 합격률을 끌어올립니다."; } else if (totalRaw >= 181) { stucareTxt = "<b>📈 [Stable B / Developing Level] 메타인지 훈련 및 심화 탐구 기초 확립</b><br><br>기초 학력은 있으나 환경에 따른 기복이 약점입니다. AI 스투케어의 '1분 설명하기' 기능과 '백지 복습' 툴을 활용해 내가 아는 것과 모르는 것을 냉정하게 구분하는 메타인지 훈련이 시급합니다. 거창한 보고서보다는 일상 수업 속에서 궁금증을 하나씩 해결해 나가는 '소규모 탐구 미션'을 통해 성취감을 누적시켜야 합니다."; step1_title = "관심 분야 탐색 및 꼬리물기 질문"; step1_desc = "아직 명확한 진로가 없다면, 교과 수업 중 흥미로웠던 아주 작은 주제 하나를 골라 질문으로 바꾸는 미니 탐구 미션부터 시작합니다. 거창한 보고서가 아니라, '왜 그럴까?'를 검색하고 요약해보는 습관을 통해 지적 호기심의 씨앗을 심습니다."; step2_title = "1분 설명하기를 통한 기초 메타인지"; step2_desc = "수동적으로 학원 강의를 듣는 것에서 벗어나, 오늘 배운 가장 중요한 핵심 개념 하나를 부모님이나 친구에게 1분 동안 설명해 보는 훈련을 매일 반복합니다. 내가 무엇을 모르는지 스스로 깨닫게 하여 공부의 주도권을 되찾는 과정입니다."; step3_title = "작은 성취 누적 및 마인드셋 강화"; step3_desc = "거창한 목표의 실패로 인한 좌절감을 극복하기 위해, 매일 100% 달성 가능한 아주 작은 학습 계획(Micro-Habit)을 세우고 실천합니다. 작은 성공의 누적 데이터를 시각적으로 확인하며 학업 효능감을 되찾고 긍정적인 입시 마인드셋을 형성합니다."; } else { stucareTxt = "<b>🌱 [Potential / Critical Level] 기초 메타인지 형성 및 극약 처방 환경 통제</b><br><br>특목고 진학을 논하기 전에 지적 호기심을 '기록'으로 남기는 기초 습관 형성이 최우선입니다. AI 스투케어 가이드에 따라 <b>'오늘 배운 내용 1분 설명하기'</b> 등 아주 작은 성공 미션부터 시작하여 무너진 학업 효능감을 회복해야 합니다. 무엇보다 스마트폰 격리 등 물리적인 환경 통제를 위한 즉각적인 Action Plan이 선행되어야만 시스템의 효과를 볼 수 있습니다."; step1_title = "학습 방해 환경의 완전 격리 통제"; step1_desc = "모든 학습 로드맵의 최우선 선결 과제로 스마트폰, PC 등 몰입을 방해하는 요소를 완전히 격리하는 물리적 통제 규율을 세웁니다. '그냥 책상에 앉아 있는 시간'을 완전히 배제하고, 집중도가 보장된 '진짜 순공 시간'만을 측정하여 기록합니다."; step2_title = "수동적 지시 탈피 및 셀프 플래닝"; step2_desc = "학원에서 내준 숙제를 쳐내는 방식의 수동적 학습을 즉각 중단합니다. 하루에 단 1시간이라도 본인이 스스로 복습할 분량과 방식을 결정하는 셀프 플래닝(Self-Planning) 연습을 통해, 공부의 핸들을 쥐고 독립적으로 나아가는 습관을 훈련합니다."; step3_title = "기초 체력 회복 및 수면 루틴 정상화"; step3_desc = "불규칙한 생활로 무너진 학업 체력을 회복하기 위해 매일 동일한 시간에 취침하고 기상하는 기본 루틴을 가장 엄격하게 관리합니다. 흔들리지 않는 생활 습관이 정착된 이후에야 비로소 다음 단계의 학습 스킬이나 입시 전략이 위력을 발휘할 수 있습니다."; } document.getElementById('stucareStrategic').innerHTML = stucareTxt; document.getElementById('stucareRoadmapContainer').innerHTML = ` <div class="stucare-step"><div class="step-num">Step 1</div><h4 style="color: var(--primary); margin-top: 8px; font-size:1.05em;">${step1_title}</h4><p style="font-size:0.9em; line-height:1.65; color:#444; text-align:justify;">${step1_desc}</p></div> <div class="stucare-step"><div class="step-num">Step 2</div><h4 style="color: var(--primary); margin-top: 8px; font-size:1.05em;">${step2_title}</h4><p style="font-size:0.9em; line-height:1.65; color:#444; text-align:justify;">${step2_desc}</p></div> <div class="stucare-step"><div class="step-num">Step 3</div><h4 style="color: var(--primary); margin-top: 8px; font-size:1.05em;">${step3_title}</h4><p style="font-size:0.9em; line-height:1.65; color:#444; text-align:justify;">${step3_desc}</p></div> `; window.scrollTo({ top: document.getElementById('p1').offsetTop, behavior: 'smooth' }); // ── APEX 결과 자동 저장 훅 ── // ★ 버그수정: 이 저장 로직을 Chart.js 렌더링보다 먼저 실행하도록 순서 변경. // (기존엔 아래 그래프 렌더링 이후에 저장 로직이 있어서, 외부 CDN에서 // Chart.js 로드가 실패하면 - 학교/기관 네트워크가 jsdelivr.net을 막았거나 // 일시적 인터넷 문제가 있는 경우 - new Chart(...)에서 에러가 나며 스크립트 // 실행이 중단되어 결과 저장 자체가 안 되고, 리포트/인쇄도 미완성 상태로 // 남는 문제가 있었음. 저장을 먼저 해두면 그래프가 실패해도 최소한 // 결과 저장과 리포트 인쇄는 항상 정상 진행됨) (function(){ const _info={date:document.getElementById('inDate').value,school:document.getElementById('inSchool').value,name:document.getElementById('inName').value,gradeVal:document.getElementById('inGrade').value,gradeTxt:document.getElementById('inGrade').options[document.getElementById('inGrade').selectedIndex].text,stream:document.getElementById('inStream').value,style:document.getElementById('inStyle').value,session:currentSession}; const _qi=document.querySelectorAll('.q-val'); const _su={A:0,B:0,C:0,D:0},_co={A:0,B:0,C:0,D:0}; // ★ 추가: 문항별 원본 답변도 도메인 순서대로 저장 (추후 리포트 재현/인쇄에 사용) const _raw={A:[],B:[],C:[],D:[]}; _qi.forEach(function(inp){const _v=parseInt(inp.value);_su[inp.dataset.domain]+=_v;_co[inp.dataset.domain]++;_raw[inp.dataset.domain].push(_v);}); const _av={A:+(_su.A/_co.A).toFixed(2),B:+(_su.B/_co.B).toFixed(2),C:+(_su.C/_co.C).toFixed(2),D:+(_su.D/_co.D).toFixed(2)}; const _cal=_info.gradeVal==='elem'?0.85:_info.gradeVal==='mid12'?0.90:1.0; const _tot=Math.round((_av.A+_av.B+_av.C+_av.D)*6*_cal); const _s0={};for(var i=0;i<16;i++){var _el=document.getElementById('s0_'+i);if(_el)_s0['q'+i]=_el.value;} // ★ 추가: 교과성적(24개)/모의고사 백분위/선행단계도 저장 (재인쇄시 9개고교매칭 결과 재현용) const _gradeVals={}; ['kor','eng','mat','sci','soc','his'].forEach(function(subj){ ['21','22','31','32'].forEach(function(sem){ var _gEl=document.getElementById('g-'+subj+'-'+sem); if(_gEl) _gradeVals['g-'+subj+'-'+sem]=_gEl.value; }); }); ['inMockMathSci','inMockKorEng','inMathLevel','inSciLevel','inEngLevel','inHisLevel'].forEach(function(id){ var _mEl=document.getElementById(id); if(_mEl) _gradeVals[id]=_mEl.value; }); const _result={date:_info.date,school:_info.school,name:_info.name,gradeVal:_info.gradeVal,gradeTxt:_info.gradeTxt,stream:_info.stream,style:_info.style,session:_info.session,avgs:_av,totalAdj:_tot,totalRaw:Math.round((_av.A+_av.B+_av.C+_av.D)*6),mentalCalibration:_cal,s0:_s0,rawAnswers:_raw,gradeVals:_gradeVals,savedAt:Date.now()}; // ★ 개선①: PDF로 저장할 때 파일명에 학생명이 자동으로 들어가도록 // document.title을 인쇄 직전에 설정 (일반 진단 직후 인쇄든, 저장된 // 이력을 다시 인쇄하는 경우든 모두 적용됨. 브라우저는 보통 문서 제목을 // PDF 저장 시 기본 파일명으로 사용함) var _pdfDate = (_info.date||'').replace(/-/g,''); document.title = 'APEX 학업역량 정밀진단_'+(_info.name||'학생')+'_'+_info.session+'차진단'+(_pdfDate?('_'+_pdfDate):''); // ★ 인쇄 전용 모드(기존 저장 결과 재출력)일 때는 저장을 건너뛰고 인쇄만 실행 if(window._printOnlyMode){ // ★ 버그수정: requestAnimationFrame은 화면에 실제로 보이지 않는(off-screen) // iframe에서는 브라우저가 아예 실행을 보류/생략할 수 있어, 그 지점에서 // 인쇄가 영원히 멈춰버리는 문제가 있었음(요청하신 인쇄가 "아무 반응 없음" // 증상의 원인). 화면 가시성과 무관하게 항상 실행되는 setTimeout만 사용하도록 변경. // (차트 애니메이션은 이미 0으로 꺼두었으므로 약간의 지연만으로 충분히 안전함) setTimeout(function(){ window.print(); }, 1300); } else if(window.parent&&window.parent!==window){window.parent.postMessage({type:'APEX_SAVE',result:_result},'*');} else if(window._apexSaveCallback){window._apexSaveCallback(_result);} })(); // ★ 버그수정: Chart.js가 로드되지 않았거나(외부 CDN 차단/네트워크 문제) // 렌더링 중 오류가 나도, try-catch로 감싸서 리포트 나머지 부분(인쇄 포함)은 // 항상 정상적으로 완료되도록 함. 그래프만 표시가 안 될 뿐 점수/인쇄는 정상 작동. try{ if(radarChart) radarChart.destroy(); radarChart = new Chart(document.getElementById('radarChart'), { type: 'radar', data: { labels: ['Inquiry(탐구)', 'Directed(주도)', 'Resilience(정서)', 'Habit(습관)'], datasets: [{ label: '학생 역량', data: [avgs.A*10, avgs.B*10, avgs.C*10, avgs.D*10], backgroundColor: 'rgba(26, 35, 126, 0.2)', borderColor: '#1A237E', borderWidth: 3, pointBackgroundColor: '#b8860b', pointRadius: 5 }] }, options: { layout: { padding: { left: 30, right: 30, top: 15, bottom: 15 } }, scales: { r: { min: 0, max: 100, ticks: { display: false }, pointLabels: { font: { size: 12, weight: 'bold' }, color: '#1A237E' } } }, plugins: { legend: { display: false } }, maintainAspectRatio: false, animation: { duration: 0 } } }); }catch(_chartErr){ console.warn('레이더 차트 렌더링 실패(외부 라이브러리 로드 문제로 추정). 리포트/인쇄는 정상 진행됩니다:', _chartErr); const _rcEl=document.getElementById('radarChart'); if(_rcEl && _rcEl.parentNode){ const _fallback=document.createElement('div'); _fallback.style.cssText='padding:20px;text-align:center;color:#999;font-size:12px'; _fallback.textContent='(그래프를 불러올 수 없습니다 - 인터넷 연결을 확인해주세요. 점수 결과에는 영향 없습니다)'; _rcEl.parentNode.replaceChild(_fallback, _rcEl); } } } </script> </body></html>