2026년 2회 진단 E01

53점을 받은 그 20문항을 시계를 켜고 다시 푼다. 7점이 어느 묶음에서 샜는지가 여기서 숫자로 나온다

왜 이 장을 하나
같은 문제를 다시 풀면 아는데 틀린 것몰라서 틀린 것이 갈린다. 앞의 것은 05절(틀리는 자리)로, 뒤의 것은 분야 장 03절(밑바닥)로 가야 하고, 그 갈림이 남은 40일의 순서를 정한다.
다루는 것2026년 2회 20문항 · 복원본
시계150분 · 실제 시험과 같다
끝나면묶음별 샌 점수가 표로 나온다

01푸는 법

왜 이걸 하나 — 진단은 시험장과 같은 조건에서만 뜻이 있다. 조건이 느슨하면 숫자가 거짓이 된다.

02절의 시작 버튼을 누르면 150분 시계가 돈다. 그 뒤로는 시험장에서 하는 것만 한다. 종이와 펜을 옆에 두고, 코드는 종이에 변수표를 그리며 따라간다.

구간시간무엇
1회독100분1번부터 20번까지 차례로. 한 문항에 5분이 넘으면 답 칸을 비우고 넘어간다
2회독40분비운 문항만 돌아간다. 코드 추적은 여기서 종이에 표를 그린다
검토10분답 칸을 처음부터 읽는다. 문제가 묻는 것(기호인가 이름인가, 단위가 있나)과 답의 꼴을 맞춘다

정답은 20문항을 다 적은 뒤에 연다. 한 문항씩 열어 보면 뒤 문항을 풀 때 앞 문항의 해설이 머리에 남아 진단이 흐려진다.

자가 판정은 답안지에 그대로 적었을 때 채점자가 맞다고 할 것인가 하나로 정한다. 철자가 하나 다르면 틀렸다, 기호를 묻는데 이름을 적었으면 틀렸다, 줄 단위 출력에서 한 줄이 빠졌으면 틀렸다를 누른다. 후하게 판정한 5점은 시험장에서 그대로 사라진다.
이 20문항은 공식 원문이 아니라 복원본이다. 문장 · 변수명 · 숫자가 실제 시험지와 다를 수 있다. 다만 정답은 코드 · SQL 전부를 직접 실행해 확인했고, 계산 문제는 같은 규칙을 프로그램으로 돌려 맞췄다. 어느 문항이 시험장의 어느 문항이었는지 기억나면 답 칸에 함께 적어 둔다.

02실전 세트

왜 이걸 하나 — 7/19 에 받은 53점의 재현이다. 재현되지 않으면 그 자체가 정보다.

시작을 누르면 시계가 돌고, 화면을 닫아도 이어진다. 멈춤은 시험장에 없으므로 누르지 않는다. 20문항을 다 적은 뒤 문항마다 정답 보기 → 맞았다 · 틀렸다를 누르면 위 막대에 점수와 묶음별 결과가 모인다.

2026-2회 · 1번테스트

다음 [평가표]의 등급 기준을 바탕으로, 테스트 케이스의 입력값이 [테스트 내역]의 예상 결과값처럼 출력되는지 비교하는 명세 기반 테스트 기법을 쓰시오.

[평가표]

점수성적
90~100A
80~89B
70~79C
0~69D

[테스트 내역]

입력값-1030758595110
예상 결과에러DCBA에러
실제 결과에러DCBA에러
정답동치 분할 테스트

— 동치 분할 테스트(동등 분할, Equivalence Partitioning). 평가표의 등급 하나하나가 동치 클래스이고, 테스트 내역은 클래스마다 대표값 하나씩이다.

원리 — 평가표는 입력 0~100 을 A(90~100) · B(80~89) · C(70~79) · D(0~69) 네 묶음으로 나누고, 범위 밖(음수, 101 이상)은 에러다. 같은 묶음 안의 값은 프로그램이 같은 길로 처리하므로 하나만 검사하면 나머지도 같이 검증된 셈이다. 테스트 내역의 −10(무효 아래) · 30(D) · 75(C) · 85(B) · 95(A) · 110(무효 위)은 여섯 묶음에서 가운데쯤 값을 하나씩 고른 것이다 — 이것이 동치 분할이다. 명세(평가표)만 보고 만들었으니 명세 기반(블랙박스) 기법이고, 예상 결과와 실제 결과를 비교해 통과를 판정한다.

따라가기

  1. 평가표 → 유효 4묶음(A · B · C · D) + 무효 2묶음(범위 아래 · 위)
  2. 입력값 −10 · 30 · 75 · 85 · 95 · 110 → 묶음마다 대표 하나
  3. 경계(89 · 90)가 아니라 대표값 → 동치 분할 테스트

헷갈리는 자리 — 경계값 분석으로 적는 것. 경계값이었다면 입력이 −1 · 0 · 69 · 70 · 79 · 80 · 89 · 90 · 100 · 101 처럼 경계 양옆이어야 한다. 이 문제의 30 · 75 · 85 · 95 는 묶음 한가운데다. "대표값"이면 동치 분할, "경계값"이면 경계값 분석 — 입력 표를 보고 판정한다.

표준 · 교재 정의(ISTQB 용어 · 커버리지 6단계 · 테스트 수준)와 대조했다. 복원 출처 grandlife.co.kr(2026-09-14) — 공식 원문이 아니라 문장이 실제와 다를 수 있다.

2026-2회 · 2번SW공학

다음 설명에 해당하는 결합도를 보기에서 골라 기호로 쓰시오.

한 모듈이 다른 모듈의 내부 데이터나 내부 제어 흐름을 직접 참조하거나 수정한다. 예를 들어 다른 모듈의 내부 코드 위치로 분기하거나, 내부에 선언된 자료를 직접 사용하는 경우이다.

ㄱ. 자료 결합도
ㄴ. 스탬프 결합도
ㄷ. 제어 결합도
ㄹ. 외부 결합도
ㅁ. 내용 결합도

정답ㅁ (내용 결합도)

— ㅁ 내용 결합도. 다른 모듈의 내부 데이터 · 내부 코드를 직접 참조하거나 수정하는 가장 나쁜 결합이다.

원리 — 결합도 6단계 중 최악이 내용 결합(Content Coupling)이다. 정상적인 모듈은 인터페이스(인자 · 반환값)로만 대화하는데, 내용 결합은 그 벽을 무시하고 상대 모듈 안의 변수를 직접 읽고 쓰거나, 상대 코드의 중간 위치로 goto 하듯 분기한다. 그러면 상대 모듈을 조금만 고쳐도(변수 이름 · 코드 순서) 이쪽이 깨진다 — 상대를 고칠 수 없게 만드는 결합이다. 자바로 치면 남의 private 필드를 리플렉션으로 바꾸는 것이 여기 해당한다.

따라가기

  1. "내부 데이터나 내부 제어 흐름을 직접 참조 · 수정" → 인터페이스를 거치지 않는다
  2. "내부 코드 위치로 분기 · 내부 선언 자료를 직접 사용" → 남의 속을 만진다
  3. 6단계 중 가장 높은 결합 → ㅁ 내용 결합도

헷갈리는 자리 — ㄹ 외부 결합도를 고르는 것. 외부는 파일 형식 · 프로토콜 · 장치 같은 바깥 것을 공유하는 것이고, 내용은 모듈 안을 직접 만진다. 보기에 없는 공통 결합도(전역 변수 공유)와도 구분한다 — 공통은 "모듈 밖 전역", 내용은 "모듈 안"이다.

표준 · 교재 정의(결합도 6단계 · 응집도 7단계 · UML 2.x 다이어그램 분류)와 대조했다. 복원 출처 grandlife.co.kr(2026-09-14) — 공식 원문이 아니라 문장이 실제와 다를 수 있다.

2026-2회 · 3번OS

다음 프로세스를 선점형 SRT(Shortest Remaining Time) 방식으로 스케줄링할 때 평균 대기시간을 구하시오. 문맥 교환 시간은 무시하며, 시간 단위는 ms이다.

프로세스도착서비스
P108
P214
P329
P435
정답6.5ms

— 6.5ms. SRT 로 돌리면 P1 9 · P2 0 · P3 15 · P4 2, 합 26 ÷ 4 = 6.5 다.

원리 — SRT 는 매 순간 "남은 실행 시간이 가장 짧은" 프로세스가 CPU 를 갖는다. 새 프로세스가 도착하는 시각마다 지금 도는 것의 남은 시간과 새로 온 것의 실행 시간을 비교해, 새것이 더 짧으면 선점한다. 도착이 끝난 뒤에는 남은 것들을 짧은 순으로 돌린다. 대기 시간 = 끝난 시각 − 도착 − 실행 시간이다. 2025-2-13 과 같은 표를 RR 대신 SRT 로 돌리는 문제라 두 결과(11.75 대 6.5)를 나란히 두면 선점 알고리즘의 효과가 보인다.

따라가기

  1. 0~1 P1(남 7). 1 에 P2(4) 도착 → 4 < 7 이라 P2 선점
  2. 1~5 P2. 2 에 P3(9) · 3 에 P4(5) 도착하지만 P2 남은 시간(3 · 2)이 더 짧아 계속. 5 에 P2 끝
  3. 남은 것 P1 7 · P3 9 · P4 5 → 5~10 P4 끝 · 10~17 P1 끝 · 17~26 P3 끝
  4. 대기: P1 = 17−0−8 = 9, P2 = 5−1−4 = 0, P3 = 26−2−9 = 15, P4 = 10−3−5 = 2
  5. 합 26 ÷ 4 = 6.5ms

헷갈리는 자리 — 1단계에서 P1 이 1ms 만 돌고 뺏긴다는 것을 놓치고 P1 을 끝까지 돌리는 것(그러면 SJF 가 돼 값이 달라진다). 선점 뒤 P1 의 "남은 시간 7"을 표에 적어 두어야 3단계에서 P4(5)가 P1(7)보다 먼저라는 것이 보인다.

표를 손으로 한 칸씩 채우고 파이썬 시뮬레이션 스크립트로 같은 값을 확인했다. 복원 출처 grandlife.co.kr(2026-09-14) — 공식 원문이 아니라 표 · 값이 실제와 다를 수 있다.

2026-2회 · 4번네트워크

다음 설명에 해당하는 라우팅 프로토콜의 영문 약어를 쓰시오.

자율 시스템 내부에서 사용하는 링크 상태 라우팅 프로토콜이다. 최단 경로 계산에 다익스트라 알고리즘을 사용하고, 영역(Area)을 이용하는 계층 구조를 지원하여 대규모 네트워크에 적합하다.

정답OSPF

— OSPF. 자율 시스템 안에서 링크 상태 · 다익스트라 · Area 를 쓰는 라우팅 프로토콜이다.

원리 — 문제 문장의 낱말 넷이 전부 OSPF 의 표지다. "자율 시스템 내부" → IGP(RIP 또는 OSPF). "링크 상태" → OSPF(RIP 은 거리 벡터). "다익스트라" → OSPF(RIP 은 벨만-포드). "영역(Area) 계층 구조 · 대규모" → OSPF(RIP 은 홉 15 제한이라 작은 망용). 하나만 보여도 OSPF 로 좁혀지고, 넷이 다 있으니 의심할 곳이 없다. E01 진단 4번이 이 문항이다.

따라가기

  1. 내부 + 링크 상태 + 다익스트라 + Area → OSPF

헷갈리는 자리 — 영문 약어를 요구하니 "개방형 최단 경로 우선"이라 풀어 쓰면 안 된다. BGP 는 자율 시스템 "사이"(EGP)라 "내부"에서 탈락한다.

표준 · 교재 정의와 대조했다. 복원 출처 grandlife.co.kr(2026-09-14) — 공식 원문이 아니라 문장이 실제와 다를 수 있다.

2026-2회 · 5번Python

다음 Python 프로그램의 실행 결과를 쓰시오.

str = "_THIS_IS_KIM_SPEAKING" a = str[:4] b = str[6:8] c = str[18:] ans = a + b + c print(ans)
정답_THIISING

— _THIISING. 세 조각 _THI · IS · ING 을 이은 것이다.

원리 — 슬라이스 [a:b] 는 a 부터 b 앞까지, 첨자는 0 부터다. 밑줄 _ 도 글자 하나로 센다. "_THIS_IS_KIM_SPEAKING" 위에 첨자를 적으면 0 은 _, 1 T, 2 H, 3 I, 4 S, 5 _, 6 I, 7 S, 8 _, 9 K, 10 I, 11 M, 12 _, 13 S, 14 P, 15 E, 16 A, 17 K, 18 I, 19 N, 20 G 다. str 이라는 이름은 내장 타입 이름을 덮어쓴 것이라 좋은 코드는 아니지만 동작에는 문제가 없다.

따라가기

  1. [:4] → 첨자 0~3 → _THI
  2. [6:8] → 첨자 6 · 7 → IS
  3. [18:] → 첨자 18 부터 끝 → ING
  4. 이어서 _THIISING

헷갈리는 자리 — 밑줄을 안 세어 첨자가 하나씩 밀리는 것과, [6:8] 을 세 글자로 세는 것. 답의 맨 앞 밑줄을 빼먹고 THIISING 으로 적으면 틀린다 — [:4] 의 첫 글자가 밑줄이다.

복원 코드를 Python 3.12 로 실행해 같은 출력을 확인했다. 복원 출처 grandlife.co.kr(2026-09-14) — 공식 원문이 아니라 문장 · 변수명이 실제와 다를 수 있다.

2026-2회 · 6번SQL

다음 [학생] 테이블을 이용해 이름이 ‘이’로 시작하는 학생들을 이름 기준 내림차순으로 정렬하려고 한다. [쿼리]의 빈칸 ①과 ②에 들어갈 알맞은 내용을 쓰시오.

[학생]

학번이름학년학과
202101이순신3컴퓨터공학
202102김영희1전기공학
202103이상4건축공학
202104임꺽정2전자공학
202105이정재3토목공학

[쿼리]

SELECT * FROM 학생 WHERE 이름 LIKE ① ORDER BY 이름 ②;
정답① '이%' ② DESC

— ① '이%'DESC. "이로 시작"은 앞이 고정되고 뒤가 자유인 무늬, 내림차순은 DESC 다.

원리LIKE% 는 "아무 글자 0개 이상"이므로 '이%' 는 첫 글자가 이인 모든 이름이다(이순신 · 이상 · 이정재). 문자열이라 작은따옴표로 감싼다. ORDER BY 이름 은 기본이 오름차순(ASC)이고 내림차순은 뒤에 DESC 를 붙인다. 이름이 한글이면 가나다 역순이다.

따라가기

  1. LIKE '이%' → 이순신, 이상, 이정재
  2. ORDER BY 이름 DESC → 이정재, 이순신, 이상

헷갈리는 자리'%이%' 로 적는 것(어디든 이가 들어가면 임꺽정 · 김영희는 안 걸리지만 뜻이 다르다). 따옴표를 빼는 것. ② 에 DESCENDING 이나 "내림차순"을 적는 것 — 예약어는 DESC 다. 한 글자 자리에는 _ 를 쓴다는 것도 같은 묶음이다. 예를 들어 '이_' 는 두 글자 이름 이상만 걸리고, '%신' 은 신으로 끝나는 이순신만 걸린다 — %와 _ 의 자리로 무늬를 읽는다.

표를 sqlite 3.49 에 넣고 같은 SQL 을 실행해 결과를 확인했다. 복원 출처 grandlife.co.kr(2026-09-14) — 공식 원문이 아니라 표 · 값이 실제와 다를 수 있다.

2026-2회 · 7번C

다음 C 프로그램의 실행 결과를 쓰시오.

#include <stdio.h> typedef struct N { int v; struct N *a; struct N *b; } N; int c = 0; int result; void func(N *n) { if (!n) return; func(n->a); func(n->b); if (++c == 3) result = n->v; } int main(void) { N ne = { 35, 0, 0 }; N nd = { 64, 0, 0 }; N nc = { 53, 0, 0 }; N nb = { 12, &ne, &nc }; N na = { 21, &nb, &nd }; func(&na); printf("%d", result); return 0; }
정답12

— 12. 후위 순회(왼쪽 → 오른쪽 → 자기)에서 세 번째로 도착하는 노드가 nb 이고 그 값이 12 다.

원리 — 구조체 N 은 값 v 와 자식 두 개(a 왼쪽, b 오른쪽)를 가진 트리 노드다. na(21) 아래 nb(12) · nd(64), nb 아래 ne(35) · nc(53) 가 있다. func 는 자식 a, 자식 b 를 먼저 다 처리한 다음에 자기 차례에 ++c 를 센다 — 이것이 후위 순회다. 전역 c 는 "자기 차례가 온 횟수"이고, 그것이 3 이 되는 순간의 노드 값이 result 에 들어간다. if (!n) return 은 자식이 없을 때(0) 되돌아가는 멈춤 조건이다.

따라가기

  1. func(na) → func(nb) → func(ne): 자식 둘 다 0 → ne 차례, c = 1
  2. nb 의 둘째 자식 func(nc): 자식 0 → nc 차례, c = 2
  3. nb 차례, c = 3 → result = nb.v = 12
  4. 이어서 nd 차례 c = 4, na 차례 c = 5 — 조건이 ==3 이라 result 는 안 바뀐다

헷갈리는 자리 — 전위 순회(자기 먼저)로 세어 세 번째를 ne(35)로 적는 것. 자기 처리(++c)가 두 재귀 호출 뒤에 있으니 후위다. c 가 3 을 지난 뒤에도 순회는 계속되지만 result 는 그대로다.

복원 코드를 gcc(도커 alpine)로 실행해 같은 출력을 확인했다. 복원 출처 grandlife.co.kr(2026-09-14) — 공식 원문이 아니라 문장 · 변수명이 실제와 다를 수 있다.

2026-2회 · 8번네트워크

10.0.0.0/27 네트워크를 동일한 크기의 2개 서브넷으로 분할하였다.

구분주소 블록 범위
첫 번째 서브넷10.0.0.0 ~ 10.0.0.15
두 번째 서브넷10.0.0.16 ~ 10.0.0.31

이때 10.0.0.1이 속한 서브넷의 프리픽스 비트 길이는 ( ) bit이다. 빈칸에 들어갈 값을 쓰시오.

정답28

— 28. /27 을 같은 크기 둘로 나누면 네트워크 비트가 하나 늘어 /28 이다.

원리 — 프리픽스 /n 은 앞 n 비트가 네트워크 부분이라는 뜻이고, 나머지 32 − n 비트가 호스트 부분이다. /27 은 호스트 5비트 → 32개 주소(10.0.0.0~31). 이것을 반으로 나누려면 호스트 비트 하나를 네트워크 쪽으로 넘겨야 하므로 /28 이 되고, 호스트 4비트 → 16개 주소씩 두 묶음(0~15, 16~31)이다. 표의 범위가 딱 16 개씩인 것이 그 증거다. 10.0.0.1 은 첫 묶음이지만 어느 묶음이든 프리픽스는 같다.

따라가기

  1. /27 → 32개 → 둘로 → 16개씩
  2. 16 = 2⁴ → 호스트 4비트 → 32 − 4 = 28

헷갈리는 자리 — 둘로 나누니 27 이 2 만큼 변한다고 보거나 26 으로 줄이는 것. 서브넷 수가 2배 되면 프리픽스는 1 늘고, 4배면 2 늘어난다(2ⁿ 배 → n 증가). 답은 숫자 28 하나다.

파이썬 ipaddress 로 네트워크 · 범위를 계산해 같은 값을 확인했다. 복원 출처 grandlife.co.kr(2026-09-14) — 공식 원문이 아니라 표 · 값이 실제와 다를 수 있다.

2026-2회 · 9번Java

다음 Java 프로그램의 실행 결과를 쓰시오.

class A { int a; public A(int a) { this.a = a; } void print() { System.out.print(a + "a"); } } class B extends A { int b; public B(int a, int b) { super(a); this.b = b; } @Override void print() { super.print(); System.out.print(b + "b"); } } public class Main { public static void main(String[] args) { B obj = new B(10, 20); obj.print(); } }
정답10a20b

— 10a20b. 자식의 print 가 먼저 부모 print 를 부르고(10a), 이어서 자기 것을 찍는다(20b).

원리super(a) 는 부모 생성자에 값을 넘겨 부모 필드 a 를 채우는 것이고, super.print() 는 갈아끼우기 전의 부모 판 print 를 그 자리에서 한 번 부르는 것이다. 자식이 print 를 덮어썼어도 super. 을 붙이면 부모 판이 돈다. 문자열과 숫자를 + 로 이으면 덧셈이 아니라 붙이기라 a + "a" 는 "10a" 다. 두 print 는 print(줄바꿈 없음)라 한 줄에 이어진다.

따라가기

  1. new B(10, 20) → super(10) → A.a = 10, 이어서 B.b = 20
  2. obj.print() → B.print → super.print() → A.print → 10a
  3. 이어서 b + "b" → 20b. 합쳐서 10a20b

헷갈리는 자리 — 20b 만 적는 것(super.print 를 빼먹음)이나 순서를 바꿔 20b10a 로 적는 것. super.print() 가 먼저 오는 줄이라 10a 가 앞이다. 10 + "a" 를 계산하려 드는 것 — 한쪽이 문자열이면 붙이기다.

복원 코드를 JDK 17 로 컴파일 · 실행해 같은 출력을 확인했다. 복원 출처 grandlife.co.kr(2026-09-14) — 공식 원문이 아니라 문장 · 변수명이 실제와 다를 수 있다.

2026-2회 · 10번네트워크

다음 구성도에서 네트워크 A, B, C에 연결된 두 장비는 각각 같은 네트워크에 속해야 한다. 빈칸 ②, ④, ⑤에 들어갈 수 있는 IP 주소를 각각 하나씩 쓰시오. 답안에는 프리픽스를 제외한 IP 주소만 쓴다.

구성도는 네트워크 A — 라우터 — 네트워크 B — 라우터 — 네트워크 C 로 이어지고, 각 네트워크에 장비가 2대씩 있다.

네트워크장비주소
A1192.168.35.3/24
A2( ② )
B3129.200.10.72/22
B4( ④ )
C5( ⑤ )
C6192.168.36.16/24
정답② 192.168.35.1 ~ 192.168.35.254 중 .3 을 뺀 하나 (예 192.168.35.72)
④ 129.200.8.1 ~ 129.200.11.254 중 129.200.10.72 를 뺀 하나 (예 129.200.8.249)
⑤ 192.168.36.1 ~ 192.168.36.254 중 .16 을 뺀 하나 (예 192.168.36.249)

— ② 192.168.35.1~254 중 .3 을 뺀 아무 주소(예 192.168.35.72), ④ 129.200.8.1~129.200.11.254 중 129.200.10.72 를 뺀 아무 주소(예 129.200.8.249), ⑤ 192.168.36.1~254 중 .16 을 뺀 아무 주소(예 192.168.36.249). 각 네트워크의 호스트 범위 안에서 이미 쓴 주소만 피하면 된다.

원리 — 같은 네트워크에 속한다는 것은 프리픽스만큼의 앞부분이 같다는 뜻이다. A · C 는 /24 라 앞 세 옥텟이 같고 마지막 옥텟만 1~254 에서 고른다. B 는 /22 라 셋째 옥텟이 4 씩 묶여 10 은 8~11 묶음이고, 호스트 범위가 129.200.8.1 부터 129.200.11.254 까지 넓다. 네트워크 주소(맨 앞) · 브로드캐스트(맨 끝) · 이미 쓰는 주소 셋만 빼면 답이 여럿이라 "하나씩 쓰라"고 한 것이다. 2024년 1회 5번과 같은 구성도다.

따라가기

  1. ② A: 192.168.35.0/24 → .1~.254, .3 제외
  2. ④ B: 129.200.8.0/22 → 8.1~11.254, 10.72 제외
  3. ⑤ C: 192.168.36.0/24 → .1~.254, .16 제외

헷갈리는 자리 — ④ 에 129.200.10.x 만 된다고 보는 것. /22 는 8~11 이 다 같은 망이다. 답에 /24 같은 프리픽스를 붙이는 것 — 문제가 "프리픽스를 제외"하라고 했다. 마지막 옥텟 0 이나 255 를 고르면 틀린다.

파이썬 ipaddress 로 네트워크 · 범위를 계산해 같은 값을 확인했다. 복원 출처 grandlife.co.kr(2026-09-14) — 공식 원문이 아니라 표 · 값이 실제와 다를 수 있다.

2026-2회 · 11번SQL

다음 테이블과 SQL문을 보고 실행 결과를 쓰시오.

[A]

idx
110
220
330
440

[B]

idy
15
115
220
335
550
SELECT COUNT(*) FROM A WHERE A.x > ( SELECT AVG(B.y) FROM B WHERE B.id IN ( SELECT A2.id FROM A AS A2 WHERE A2.x < A.x ) );
정답3

— 3. A 의 행마다 "자기보다 x 가 작은 행들의 id 에 해당하는 B.y 평균"을 구해 견주면, x 가 20 · 30 · 40 인 세 행이 남는다.

원리 — 안쪽 SELECT 가 바깥 행의 값(A.x)을 쓰므로 바깥 행마다 서브쿼리를 다시 계산해야 한다(상관 서브쿼리). 절차는 셋이다: 가장 안쪽에서 "지금 행보다 x 가 작은 A 행들의 id" 목록을 만들고, 가운데에서 B 중 그 id 인 행들의 y 평균을 내고, 바깥에서 지금 행의 x 가 그 평균보다 큰지 본다. 목록이 비면 평균은 NULL 이고 NULL 과의 비교는 참이 아니라 그 행은 빠진다.

따라가기

  1. x = 10: 더 작은 x 없음 → 목록 비어 AVG NULL → 제외
  2. x = 20: 목록 {1} → B.y 5, 15 → 평균 10 → 20 > 10 ✓
  3. x = 30: 목록 {1, 2} → 5, 15, 20 → 평균 13.3 → ✓
  4. x = 40: 목록 {1, 2, 3} → 5, 15, 20, 35 → 평균 18.75 → ✓ → 3

헷갈리는 자리 — 첫 행을 "비교할 것이 없으니 참"으로 보고 4 를 적는 것. NULL 비교는 거짓 취급이다. B 의 id 5 행(50)은 A 에 없는 id 라 한 번도 안 쓰인다는 것과, 상관 서브쿼리는 행마다 다시 센다는 것이 이 문제의 두 축이다.

표를 sqlite 3.49 에 넣고 같은 SQL 을 실행해 결과를 확인했다. 복원 출처 grandlife.co.kr(2026-09-14) — 공식 원문이 아니라 표 · 값이 실제와 다를 수 있다.

2026-2회 · 12번C

다음 C 프로그램의 실행 결과를 줄 단위로 쓰시오. 단, sizeof(int)=4, sizeof(int*)=8이다.

#include <stdio.h> void function1(int *p) { *p = 50; } void function2(int p) { p = 60; } void function3(int arr[]) { printf("3.%zu\n", sizeof(arr) / sizeof(arr[0])); } void function4(int (*arr)[8]) { printf("4.%zu\n", sizeof(*arr) / sizeof((*arr)[0])); } int main(void) { int value = 10; int arr[8] = { 0 }; function1(&value); printf("1.%d\n", value); function2(value); printf("2.%d\n", value); function3(arr); function4(&arr); return 0; }
정답1.50
2.50
3.2
4.8

— 네 줄: 1.50 / 2.50 / 3.2 / 4.8. 주소를 넘긴 함수만 원본을 바꾸고, 배열 매개변수의 sizeof 는 포인터 크기가 된다.

원리 — 함수에 값을 넘기면 복사본이 만들어져 함수 안에서 아무리 바꿔도 원본은 그대로다(function2). 주소를 넘기면 함수가 그 주소로 찾아가 원본을 고친다(function1). 배열을 매개변수로 받을 때 int arr[] 라고 써도 실제로는 int *arr, 즉 주소 하나만 받는다. 그래서 sizeof(arr) 는 배열 전체(32)가 아니라 포인터 크기 8 이다. 반면 int (*arr)[8] 은 "int 8개짜리 배열을 가리키는 포인터"라 *arr 가 배열 자체이고 sizeof(*arr) 는 4 × 8 = 32 다.

따라가기

  1. function1(&value) → *p = 50 → 원본 value = 50 → 1.50
  2. function2(value) → 복사본 p 만 60 → value 는 여전히 50 → 2.50
  3. function3(arr) → sizeof(arr) = 8(포인터), sizeof(arr[0]) = 4 → 8 / 4 = 2 → 3.2
  4. function4(&arr) → sizeof(*arr) = 32, / 4 = 8 → 4.8

헷갈리는 자리 — 둘째 줄을 2.60 으로 적는 것(값 전달은 원본을 못 바꾼다)과 셋째 줄을 3.8 로 적는 것(배열 매개변수는 포인터). "1." "2." 같은 앞 글자는 프로그램이 찍는 것이라 답에 그대로 들어간다. 문제가 sizeof(int) = 4, sizeof(int*) = 8 을 준 이유가 셋째 줄이다.

복원 코드를 gcc(도커 alpine)로 실행해 같은 출력을 확인했다. 복원 출처 grandlife.co.kr(2026-09-14) — 공식 원문이 아니라 문장 · 변수명이 실제와 다를 수 있다.

2026-2회 · 13번Python

다음 Python 프로그램의 실행 결과를 쓰시오. 딕셔너리는 작성된 순서대로 순회한다고 가정한다.

class LocationDict: locations = { "NYC": "New York", "LON": "London", "PAR": "Paris", "TKY": "Tokyo" } obj = LocationDict() result = "" for key, location in obj.locations.items(): result += key[-1] + location[0] print(result, end="")
정답CNNLRPYT

— CNNLRPYT. 딕셔너리를 넣은 순서로 돌며 키의 마지막 글자와 값의 첫 글자를 번갈아 붙인다.

원리 — 클래스 안에 바로 적은 locations 는 클래스 변수라 객체 obj 로도 그대로 읽힌다. items() 는 (키, 값) 짝을 순서대로 준다 — 파이썬 3.7 부터 딕셔너리는 넣은 순서를 지킨다(문제도 그렇게 가정한다고 적었다). key[-1] 은 음수 첨자라 키의 마지막 글자, location[0] 은 값의 첫 글자다. end="" 는 마지막 줄바꿈을 없앤 것이라 출력 내용은 같다.

따라가기

  1. NYC → New York: C + N
  2. LON → London: N + L
  3. PAR → Paris: R + P
  4. TKY → Tokyo: Y + T → 이어서 CNNLRPYT

헷갈리는 자리 — key[-1] 을 첫 글자로 읽어 NNLLPPTT 를 적는 것. −1 은 마지막이다. 값의 첫 글자를 소문자로 적거나 "New York" 의 공백 뒤 Y 를 고르는 것 — [0] 은 맨 앞 N 이다. 순서를 알파벳순으로 다시 세우지 않는다.

복원 코드를 Python 3.12 로 실행해 같은 출력을 확인했다. 복원 출처 grandlife.co.kr(2026-09-14) — 공식 원문이 아니라 문장 · 변수명이 실제와 다를 수 있다.

2026-2회 · 14번Java

다음 Java 프로그램의 실행 결과를 쓰시오.

public class Main { static int compute(int num) { if (num <= 1) { return num; } return compute(num - 1) + compute(num - 3); } public static void main(String[] args) { System.out.print(compute(5)); } }
정답1

— 1. 규칙이 n − 1 과 n − 3 이고 멈춤 조건이 1 이하일 때 그 수 자체라, 음수 −1 이 섞여 값이 작아진다.

원리 — 재귀는 작은 입력부터 표로 만들면 안전하다. 멈춤 조건 num <= 1 은 "1 이하이면 그 수를 그대로 돌려준다"라, compute(0) = 0, compute(−1) = −1 처럼 음수도 값이 된다. 이것을 0 으로 잘못 두면 답이 어긋난다. 규칙은 두 개 앞이 아니라 "하나 앞 + 셋 앞"이라 피보나치와 다르다.

따라가기 — c(n) = c(n − 1) + c(n − 3).

  1. c(1) = 1, c(0) = 0, c(−1) = −1
  2. c(2) = c(1) + c(−1) = 0
  3. c(3) = c(2) + c(0) = 0
  4. c(4) = c(3) + c(1) = 1
  5. c(5) = c(4) + c(2) = 1 + 0 = 1

헷갈리는 자리 — c(−1) 을 0 으로 두면 c(2) = 1, c(3) = 1, c(4) = 2, c(5) = 3 이 된다. 피보나치로 풀어 5 를 적는 것도 흔하다. 2023년 3회 14번(같은 규칙으로 compute(7) = 2)과 짝이다.

복원 코드를 JDK 17 로 컴파일 · 실행해 같은 출력을 확인했다. 복원 출처 grandlife.co.kr(2026-09-14) — 공식 원문이 아니라 문장 · 변수명이 실제와 다를 수 있다.

2026-2회 · 15번보안

다음 설명의 빈칸에 들어갈 용어를 쓰시오.

임의의 길이를 가진 입력 데이터를 고정된 길이의 값으로 변환하며, 데이터 무결성 확인과 메시지 인증 등에 활용되는 일방향 함수는 ( ) 함수이다.

정답해시

— 해시. 임의 길이 입력을 고정 길이로 바꾸는 일방향 함수이고, 무결성 확인과 메시지 인증에 쓴다.

원리 — 2023년 2회 16번의 정의가 빈칸으로 다시 나왔다. 해시 함수는 문서의 지문을 만든다 — 길이가 늘 같고, 입력이 조금만 달라도 값이 크게 바뀌며, 값에서 입력을 되찾을 수 없다. 그래서 파일이 바뀌었는지(무결성)를 해시 비교로 알고, 비밀 키와 섞어 만든 HMAC 으로 메시지 인증을 한다. 암호화와 달리 되돌리는 연산이 없다. SHA-256 · SHA-3 · MD5 가 이름들이다.

따라가기

  1. 임의 길이 → 고정 길이 · 일방향 · 무결성 · 메시지 인증 → 해시 함수

헷갈리는 자리 — "암호화 함수"라 적는 것. 되돌릴 수 없는 것은 암호화가 아니다. 답은 빈칸 하나에 들어갈 낱말 "해시"이고 "해시 함수"까지 적어도 된다.

표준 · 교재 정의(암호 · 인증 · 접근 통제 용어)와 대조했다. 복원 출처 grandlife.co.kr(2026-09-14) — 공식 원문이 아니라 문장이 실제와 다를 수 있다.

2026-2회 · 16번Java

다음 Java 프로그램의 실행 결과를 쓰시오.

class A { int a; private int b; protected int c; A(int a, int b, int c) { this.a = a; this.b = b; this.c = c; } int func() { return a + b + c; } } class B extends A { B(int a, int b, int c) { super(a, b, c); } @Override public int func() { return a * c; } } public class Main { public static void main(String[] args) { A a = new A(1, 5, 3); B b = new B(10, 30, 50); System.out.print(a.func() + b.func()); } }
정답509

— 509. a.func() 는 부모 판이라 1 + 5 + 3 = 9, b.func() 는 갈아끼운 판이라 10 × 50 = 500 이다.

원리 — a 는 A 로 만든 객체이므로 A.func 가 그대로 돌고, b 는 B 로 만들었으니 B 가 덮어쓴 func 가 돈다. B.func 안에서 ac 를 쓸 수 있는 이유는 접근 범위 때문이다 — int a(기본, 같은 패키지)와 protected int c 는 자식이 볼 수 있지만 private int b 는 A 안에서만 보인다. 그래서 B.func 가 b 를 안 쓴 것이고, 만약 썼다면 컴파일 오류다. super(a, b, c) 로 값은 전부 부모 칸에 저장돼 있다.

따라가기

  1. a = new A(1, 5, 3) → a.func() = 1 + 5 + 3 = 9
  2. b = new B(10, 30, 50) → super 로 a 10, b 30, c 50
  3. b.func() → B.func → 10 × 50 = 500
  4. 9 + 500 = 509

헷갈리는 자리 — b.func() 도 부모 판으로 계산해 90 을 더하는 것(99). 오버라이딩된 객체는 자기 판이다. 답이 정수 덧셈인 것도 확인한다 — 둘 다 int 라 붙이기가 아니라 더하기다(9509 가 아니다).

복원 코드를 JDK 17 로 컴파일 · 실행해 같은 출력을 확인했다. 복원 출처 grandlife.co.kr(2026-09-14) — 공식 원문이 아니라 문장 · 변수명이 실제와 다를 수 있다.

2026-2회 · 17번디자인패턴

다음 설명에 해당하는 디자인 패턴을 보기에서 골라 쓰시오.

구체적인 클래스를 명시하지 않고 서로 관련되거나 의존적인 객체들의 집합을 생성하기 위한 인터페이스를 제공한다. ‘Kit’라고도 한다.

ㄱ. Builder
ㄴ. Factory Method
ㄷ. Abstract Factory
ㄹ. Prototype

정답ㄷ (Abstract Factory)

— ㄷ Abstract Factory. "관련 · 의존적인 객체들의 집합"과 별명 "Kit" 이 결정적이다.

원리 — 생성 패턴 네 개를 구분한다. Builder 는 복잡한 객체 하나를 단계별로 조립한다(빌더.setA().setB().build()). Factory Method 는 객체 생성 메서드를 하위 클래스가 재정의해 "어떤 클래스의 인스턴스를 만들지"를 하위가 정한다 — 객체 하나. Abstract Factory 는 서로 어울려야 하는 객체 여러 개(버튼 · 창 · 메뉴 = 한 테마)를 한 팩토리가 세트로 만들고, 팩토리를 바꾸면 세트 전체가 바뀐다 — 그래서 Kit(공구 세트)이라 부른다. Prototype 은 원본을 복제(clone)해 새 객체를 만든다.

따라가기

  1. "구체적인 클래스를 명시하지 않고" → 팩토리 계열
  2. "관련되거나 의존적인 객체들의 집합" → 세트 → 추상 팩토리
  3. "Kit 라고도 한다" → ㄷ Abstract Factory

헷갈리는 자리 — ㄴ Factory Method 를 고르는 것. 팩토리 메서드는 "하나"를 만들고 하위 클래스가 종류를 정하며 별명은 Virtual Constructor 다. 추상 팩토리는 "집합"을 만들고 별명이 Kit 다. 2024-1-20 과 같은 정의라 두 문제를 같이 묶는다.

GoF 책 Design Patterns 의 패턴 정의(생성 5 · 구조 7 · 행위 11)와 대조했다. 복원 출처 grandlife.co.kr(2026-09-14) — 공식 원문이 아니라 문장이 실제와 다를 수 있다.

2026-2회 · 18번SQL

다음 테이블과 SQL문의 실행 결과를 쓰시오.

[A]

idv
110
120
230

[B]

idw
1100
2200
3300
4400
SELECT COUNT(*) FROM A RIGHT OUTER JOIN B ON A.id = B.id WHERE A.id IS NULL;
정답2

— 2. RIGHT OUTER JOIN 은 B 의 행을 전부 남기므로 짝이 없는 B 의 id 3 · 4 가 A 쪽 NULL 로 나오고, 그 두 행만 A.id IS NULL 에 걸린다.

원리RIGHT OUTER JOIN 은 오른쪽 테이블(B)의 모든 행을 결과에 남기고, 왼쪽(A)에 짝이 있으면 붙이고 없으면 A 쪽 열을 NULL 로 채운다. 그래서 "B 에는 있는데 A 에는 없는 것"을 찾으려면 WHERE A.id IS NULL 을 건다 — 외부 조인의 대표 용법이다. A 의 id 1 이 두 행이라 B 의 id 1 은 두 번 나오지만 A.id 가 있으니 세지 않는다. NULL 은 = NULL 로 못 찾고 IS NULL 로만 찾는다.

따라가기

  1. B id 1 ↔ A 두 행 → 2행(A.id 1)
  2. B id 2 ↔ A 한 행 → 1행(A.id 2)
  3. B id 3 · 4 ↔ 짝 없음 → A.id NULL → 2행
  4. WHERE A.id IS NULL → 2

헷갈리는 자리 — 조인 결과 전체 5 행을 적는 것. INNER JOIN 으로 읽어 0 을 적는 것 — 내부 조인은 짝 없는 행이 아예 없어 IS NULL 이 하나도 안 걸린다. LEFT 였다면 A 쪽 전부가 남아 답이 0 이다 — 방향이 곧 답이다.

표를 sqlite 3.49 에 넣고 같은 SQL 을 실행해 결과를 확인했다. 복원 출처 grandlife.co.kr(2026-09-14) — 공식 원문이 아니라 표 · 값이 실제와 다를 수 있다.

2026-2회 · 19번SQL

다음 SQL문의 빈칸 ①에 들어갈 키워드를 쓰시오.

CREATE DOMAIN SEASON AS VARCHAR(6) ① (VALUE IN ('spring', 'summer', 'autumn', 'winter'));
정답CHECK

— CHECK. 값이 정해진 범위 · 목록 안에 있는지 검사하는 제약이다.

원리CREATE DOMAIN 은 "이 이름의 자료형은 VARCHAR(6) 이되 값은 이 네 가지만 된다"처럼 자료형에 규칙을 붙여 이름을 만드는 문장이다. 값의 범위를 제한하는 제약이 CHECK (조건) 이고, 도메인 안에서는 열 이름 대신 VALUE 라는 낱말로 그 값을 가리킨다. 테이블의 열에 붙일 때는 급여 INT CHECK (급여 >= 0) 처럼 열 이름을 쓴다. NOT NULL · UNIQUE · DEFAULT 와 함께 열 제약의 네 식구다.

따라가기

  1. VALUE IN ('spring', …) — 값을 네 개로 제한하는 조건
  2. 조건을 거는 제약 낱말 → CHECK

헷갈리는 자리 — IN 이 보인다고 WHERE 나 CONSTRAINT 를 적는 것. 조건이 붙는 제약은 CHECK 이고, CONSTRAINT 는 제약에 이름을 붙이는 낱말이라 자리가 다르다. DEFAULT 는 값을 안 넣었을 때의 기본값이라 뜻이 다르다.

SQL 표준 · 교재 정의와 대조했다. 복원 출처 grandlife.co.kr(2026-09-14) — 공식 원문이 아니라 문장이 실제와 다를 수 있다.

2026-2회 · 20번DB

관계형 데이터 모델에서는 데이터 중복으로 인한 이상 현상을 방지하고 데이터의 일관성과 정확성을 유지하기 위해 정규화를 수행한다. 속성명 아래에 밑줄이 그어진 고객아이디와 강좌명은 함께 기본키를 구성한다. 다음 [강좌신청] 릴레이션이 만족하는 가장 높은 정규형을 [보기]에서 고르시오.

[강좌신청]

고객아이디강좌명강사번호
apple영어회화P001
banana기초토익P002
carrot영어회화P001
carrot기초토익P004
orange영어회화P003
orange기초토익P004

[보기]

제1정규형 · 제2정규형 · 제3정규형 · 제4정규형 · 제5정규형 · BCNF

정답제3정규형

— 제3정규형. 2024년 1회 6번과 같은 표다 — 키 아닌 속성이 강사번호 하나뿐이고 복합키 전체에 종속돼 부분 · 이행 종속이 없다.

원리 — 정규형 판정은 함수 종속을 본다. 기본키 (고객아이디, 강좌명)의 일부만으로 강사번호가 정해지면 부분 함수 종속(2NF 위반), 키 아닌 속성끼리 A → B → C 로 이어지면 이행 함수 종속(3NF 위반)이다. 표에서 영어회화의 강사가 P001 과 P003 으로 갈리니 강좌명 → 강사번호 가 성립하지 않고, 고객아이디 → 강사번호 도 carrot 이 P001 · P004 라 성립하지 않는다. 즉 강사번호는 두 속성을 합친 키에만 매달려 2NF 이고, 키 아닌 속성이 하나라 이행 종속은 있을 수 없어 3NF 다.

따라가기

  1. 원자값 → 1NF
  2. 강좌명 → 강사번호? 영어회화 P001 · P003 → 아니다. 고객아이디 → 강사번호? carrot P001 · P004 → 아니다 → 부분 종속 없음 → 2NF
  3. 키 아닌 속성 하나 → 이행 종속 없음 → 3NF

헷갈리는 자리 — 보기에 BCNF 가 있어 고민하는 것. 결정자가 키 전체뿐이라 BCNF 조건도 만족하지만, 이 표에는 "후보키가 여럿이고 그중 하나가 결정자" 같은 BCNF 특유의 상황이 없으므로 출제자가 고른 답은 3NF 다(복원 가답안). 표의 값을 보고 함수 종속을 검사하는 습관이 답을 정한다.

교재 정의(관계형 모델 · 정규화 · 트랜잭션 표준 용어)와 대조했다. 복원 출처 grandlife.co.kr(2026-09-14) — 공식 원문이 아니라 문장이 실제와 다를 수 있다.

03채점 뒤 할 일

왜 이걸 하나 — 점수는 결과가 아니라 순서를 정하는 재료다. 여기서 남은 날의 순서를 정한다.

세트 막대의 묶음별 결과를 아래 표에 옮긴다. 틀린 문항 수에 5를 곱한 것이 그 묶음에서 샌 점수다. 샌 점수가 큰 묶음의 장부터 본다.

문항분야가는 장무엇을 묻나
1테스트E18동치 분할과 경계값 분석의 구분
2SW공학E15결합도 6단계의 이름과 기호
3OSE16SRT 선점 스케줄링 계산
4네트워크E12OSPF 와 RIP 의 표지
5PythonE07슬라이싱의 끝 인덱스
6SQLE08LIKE 의 % 자리와 DESC
7CE03구조체 포인터 트리의 후위 순회
8네트워크E12서브넷 분할과 프리픽스
9JavaE05super 호출 순서와 문자열 결합
10네트워크E12/22 네트워크의 호스트 범위
11SQLE08상관 서브쿼리와 NULL 비교
12CE02배열 매개변수의 sizeof
13PythonE07딕셔너리 순회와 음수 인덱스
14JavaE06음수까지 내려가는 재귀
15보안E13해시의 정의
16JavaE05오버라이딩된 메서드의 선택
17디자인패턴E17생성 패턴 4개의 구분
18SQLE08RIGHT OUTER JOIN 과 IS NULL
19SQLE09CHECK 제약
20DBE103NF 와 BCNF 의 경계

→ 묶음으로 세면 프로그래밍 7문항(35점) · SQL·DB 5문항(25점) · 네트워크 3문항(15점) · SW공학 4문항(20점) · 보안 1문항(5점)이다. 프로그래밍과 SQL·DB 만 다 맞아도 60점이 된다. 이 회차가 「평이했다」는 총평은 이 배점 때문이다.

두 가지를 나눠 적는다

구분판정 기준가는 곳
몰라서 틀렸다정답을 보고도 왜 그런지 바로 안 잡힌다그 분야 장 03절 밑바닥부터 읽고, 04절 기출을 전부 푼다
알았는데 틀렸다정답을 보는 순간 「아」 소리가 난다. 철자 · 순서 · 단위 · 줄바꿈 · 기호 대신 이름그 분야 장 05절 틀리는 자리만 읽고, 같은 꼴의 기출을 필터로 골라 다시 푼다
맞았는데 시간이 오래 걸렸다1회독에서 넘겼다가 2회독에서 맞았다06절 훈련을 매일 5문항. 시험장에서는 이 문항이 먼저 떨어진다
지금 다시 풀어서 맞았으니 그 문항은 됐다.7/19 에 틀린 문항을 오늘 맞았다면 그것은 그날의 조건에서 새는 자리가 있다는 뜻이다. 시간 압박 · 긴장 · 종이 계산 중 무엇이었는지 답 칸에 한 줄 적어 둔다. 실전 세트 12개를 돌릴 때 같은 자리에서 다시 새는지 보는 것이 이 노트의 마지막 단계다.

남은 날의 순서

샌 점수가 큰 묶음부터 간다. 같은 점수면 배점이 큰 묶음이 먼저다. 프로그래밍은 11회분에서 매 회 7~9문항이라, 여기서 2문항이 샜다면 다른 묶음의 4문항과 같은 무게다.

샌 묶음먼저 볼 장이유
프로그래밍E02 → E03 → E05 → E06 → E07 → E04C 포인터 · 재귀, Java 상속이 매 회 나온다. 훈련 90제가 붙어 있다
SQL·DBE08 → E10 → E09조회 결과 문제가 가장 많고, 정규화 판정이 그 다음이다
네트워크E12 → E11서브네팅 계산이 회차마다 있다. 절차를 외우면 5점이 확실해진다
SW공학E15 → E18 → E17 → E16결합도 · 테스트 기법 · 패턴은 짝으로 외우는 문제다
보안E13 → E14용어 문제라 철자 연습이 곧 점수다

기록은 브라우저 저장소에 문항별로 남는다. 채점을 마친 뒤 이 화면을 닫아도 세트 막대의 점수와 묶음별 결과는 다음에 열 때 그대로 있고, 오답노트에서도 회차별 점수와 틀린 문항으로 읽는다.

04다음

왜 이걸 하나 — 진단의 결과는 다음 장의 이름이어야 한다.