2024년 2회 실전 E23

new String 세 개의 == 비교, RIP 경로, SRT 평균 대기 6.5, 재귀 dcba. 계산과 참조 규칙이 반씩이다

왜 이 장을 하나
2024년 2회는 Java 4문항 중 셋이 참조와 String이다. 1번 NNN 은 new 로 만든 String 이 전부 다른 객체라는 것, 17번은 재귀가 돌아오는 길에 중복을 거른다는 것, 20번 split 은 배열 첫 원소다. 13번 RIP 경로와 16번 SRT 는 표를 그리는 5점이라 여기서 잃으면 절차 문제다.
다루는 것2024년 2회 20문항 · 복원본
시계150분 · 실제 시험과 같다
끝나면문항마다 가는 장이 표로 나온다

01푸는 법

왜 이걸 하나 — 세트는 시험장과 같은 조건에서만 숫자가 된다. 조건은 E01 과 같다.

규칙은 E01 진단의 01절 그대로다. 시작을 누르면 150분이 돌고, 1회독 100분 · 2회독 40분 · 검토 10분으로 나눈다. 한 문항에 5분이 넘으면 답 칸을 비우고 넘어가며, 정답은 20문항을 다 적은 뒤에 연다.

이 회차의 배점은 프로그래밍 9문항(45점) · SW공학 4문항(20점) · SQL·DB 3문항(15점) · 네트워크 2문항(10점) · 보안 2문항(10점)이다. 코드 문항 수만큼 5분씩을 1회독에서 먼저 떼어 두고, 남는 시간을 용어에 쓴다. 용어는 아는 것을 바로 적고 모르는 것은 비운다 — 용어에서 고민하는 시간이 코드 한 문항의 값이다.

자가 판정은 답안지에 그대로 적었을 때 채점자가 맞다고 할 것인가 하나다. 철자 하나, 줄바꿈 하나, 기호 대신 이름이면 틀렸다를 누른다. 후하게 준 5점은 시험장에서 사라진다.

02실전 세트

왜 이걸 하나 — 20문항을 한 번에 150분 안에 푸는 것 자체가 연습이다. 분야 장의 문제와 같은 문항이어도 조건이 다르다.

시작을 누르면 시계가 돌고 화면을 닫아도 이어진다. 다 적은 뒤 문항마다 정답 보기 → 맞았다 · 틀렸다를 누르면 위 막대에 점수와 분야별 결과가 모인다. 이 세트에서 채점한 기록은 분야 장의 같은 문항에도 그대로 보인다.

2024-2회 · 1번Java

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

public class Main { public static void main(String[] args) { String a = new String("KOREA"); String b = new String("KOREA"); String c = a; System.out.print(a == b ? "Y" : "N"); System.out.print(b == c ? "Y" : "N"); System.out.print(a == new String("KOREA") ? "Y" : "N"); } }
정답NNN

— NNN. new 로 만든 문자열은 전부 다른 객체라 == 가 모두 false 이고, c 는 a 와 같지만 비교 상대가 b 다.

원리new String("KOREA") 는 글자가 같아도 매번 새 덩어리를 만든다. == 는 두 변수가 같은 덩어리를 가리키는지만 본다. String c = a 는 a 가 가리키는 덩어리를 c 도 가리키게 한 것이라 a == c 는 true 겠지만, 코드가 묻는 것은 b == c 라서 false 다. 삼항 연산자는 참이면 "Y", 거짓이면 "N" 을 찍는다.

따라가기

  1. a == b → 서로 다른 new → N
  2. b == c → c 는 a 와 같은 덩어리, b 는 다른 덩어리 → N
  3. a == new String("KOREA") → 방금 만든 또 다른 덩어리 → N

헷갈리는 자리 — 둘째를 Y 로 적는 것. c 가 a 와 같다는 것에 눈이 가지만 비교 상대는 b 다. 문자열 풀은 따옴표 글자(literal)에만 적용되고 new 에는 적용되지 않는다는 것이 2023년 2회 8번과 짝이 되는 규칙이다.

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

2024-2회 · 2번DB

정규화된 데이터 모델을 성능 향상을 위해 의도적으로 통합·중복·분리하는 데이터 모델링 기법은?

정답반정규화 (비정규화, 역정규화)

— 반정규화(비정규화 · 역정규화). 정규화로 쪼갠 표를 성능 때문에 일부러 다시 합치거나 중복을 두는 일이다.

원리 — 정규화는 중복을 없애 이상 현상을 막지만, 표가 잘게 쪼개져 조회할 때마다 조인이 많아진다. 조회가 잦은 곳에서는 그 조인 비용이 더 아프다. 그래서 설계자가 알고서 표를 합치거나(테이블 통합), 자주 쓰는 값을 복사해 두거나(중복 컬럼), 합계 같은 계산 결과를 미리 저장(파생 컬럼)한다. 이것이 반정규화이고, 대가로 중복 관리(갱신 시 여러 곳을 고쳐야 함)를 떠안는다. "성능 향상을 위해 의도적으로"가 표지 문구다.

따라가기

  1. 정규화된 모델 → 조인 많음 → 느림
  2. 의도적으로 통합 · 중복 · 분리 → 반정규화

헷갈리는 자리 — 정규화라고 적는 것(반대말이다). 반정규화의 "반"은 反(거스른다)이라 절반이 아니다. 무결성이 깨질 위험을 감수하는 선택이라는 점도 함께 묻는다.

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

2024-2회 · 3번SQL

다음 SQL문의 괄호 ①부터 ④에 들어갈 키워드를 순서대로 쓰시오.

INSERT INTO member(id, name) ① (10, 'Mina'); ② name ③ member WHERE id = 10; UPDATE member ④ name = 'Jin' WHERE id = 10;
정답① VALUES ② SELECT ③ FROM ④ SET

— ① VALUES ② SELECT ③ FROM ④ SET. 넣기 · 읽기 · 고치기 세 문장의 자리를 채우는 것이다.

원리 — INSERT 는 INSERT INTO 테이블(열) VALUES(값), 읽기는 SELECT 열 FROM 테이블 WHERE …, 고치기는 UPDATE 테이블 SET 열 = 값 WHERE … 꼴이다. 세 문장의 예약어 자리는 정해져 있어서 앞뒤 낱말만 보면 채워진다: INTO 뒤에 괄호 값이 오면 그 앞은 VALUES, 열 이름 앞이 문장 시작이면 SELECT, 테이블 이름 앞은 FROM, UPDATE 뒤에서 열 = 값 앞은 SET 이다.

따라가기

  1. INSERT INTO member(id, name) VALUES (10, 'Mina')
  2. SELECT name FROM member WHERE id = 10
  3. UPDATE member SET name = 'Jin' WHERE id = 10

헷갈리는 자리 — ④ 에 VALUES 를 적는 것. UPDATE 는 SET 이다. ① 에 VALUE(단수)를 적는 것 — 표준은 VALUES 다. 네 칸을 순서대로 적어야 하며 하나라도 자리가 바뀌면 그 칸은 0 점이다.

답의 SQL 을 sqlite 3.49 에서 실행해 확인했다. 복원 출처 grandlife.co.kr(2026-09-14) — 공식 원문이 아니라 문장 · 열 이름이 실제와 다를 수 있다.

2024-2회 · 4번DB

튜플 5개, 속성 4개인 릴레이션의 카디널리티와 디그리는?

정답카디널리티 5, 디그리 4

— 카디널리티 5, 디그리 4. 카디널리티는 행(튜플)의 수, 디그리는 열(속성)의 수다.

원리 — 관계형 모델은 표의 크기를 두 방향으로 부른다. 세로 방향으로 몇 줄이 쌓였나(튜플 수)가 카디널리티(cardinality), 가로 방향으로 칸이 몇 개인가(속성 수)가 차수 · 디그리(degree)다. 카디널리티는 행이 들어오고 나갈 때마다 바뀌지만 디그리는 표의 틀이라 잘 안 바뀐다.

따라가기

  1. 튜플 5개 → 카디널리티 5
  2. 속성 4개 → 디그리 4

헷갈리는 자리 — 둘을 바꿔 적는 것 하나뿐이다. "카드 한 장이 한 행"으로 카디널리티 = 행 수를 고정하면 디그리는 자연히 열 수다. 답에 두 수를 짝과 함께 적는다. 영문으로 물으면 cardinality · degree 이고, 2025년 1회 8번이 그 꼴이다. 행을 하나 지우면 카디널리티만 4 가 되고 디그리는 그대로 4 라는 것으로 둘의 성격 차이를 확인한다.

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

2024-2회 · 5번보안

네트워크 계층에서 IP 패킷 단위로 암호화·인증을 제공하며, AH와 ESP 프로토콜을 사용하는 보안 프로토콜은?

정답IPSec

— IPSec. IP 패킷 단위로 인증(AH)과 암호화(ESP)를 붙이는 3계층 보안 프로토콜이다.

원리 — SSL/TLS 가 응용 사이(웹 · 메일)의 데이터를 지킨다면 IPSec 은 그 아래 네트워크 계층에서 IP 패킷 자체를 지키므로 위에서 무슨 응용이 돌든 상관없이 보호된다. 두 프로토콜로 이뤄진다 — AH(Authentication Header)는 패킷이 바뀌지 않았고 보낸 이가 맞다는 것(무결성 · 인증)만 보장하고 암호화는 안 한다, ESP(Encapsulating Security Payload)는 암호화까지 한다. 동작 모드는 데이터만 보호하는 전송 모드와 IP 헤더까지 통째로 싸는 터널 모드(VPN)가 있다. L2TP 와 짝지어 VPN 을 만드는 것이 2023년 1회 6번이다.

따라가기

  1. 네트워크 계층 + IP 패킷 단위 + AH · ESP → IPSec

헷갈리는 자리 — SSL/TLS(전송 · 응용 사이)나 SSH(응용)와 섞는 것. "AH · ESP" 두 낱말이 보이면 IPSec 이다. 대소문자는 IPSec 또는 IPsec 둘 다 통용된다.

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

2024-2회 · 6번SW공학

모듈 내 한 활동의 출력이 다음 활동의 입력 데이터로 사용되는 응집도는?

정답순차적 응집도 (Sequential Cohesion)

— 순차적 응집도(Sequential Cohesion). 앞 활동의 출력이 뒤 활동의 입력이 되는 파이프라인 모양이다.

원리 — 응집도 7단계 중 기능적 다음으로 높은 것이 순차적이다. 모듈 안의 활동들이 "A 의 결과를 B 가 받고, B 의 결과를 C 가 받는" 식으로 자료가 흘러가면 순차적이다. 예를 들어 "파일을 읽어 → 파싱해 → 검증한다"가 한 모듈에 있으면 읽은 내용이 파싱의 입력, 파싱 결과가 검증의 입력이다. 활동들이 자료로 단단히 이어져 있어 한 가지 일에 가깝다. 이보다 느슨한 교환적 응집도는 같은 자료를 "쓰기만" 하고 출력 → 입력 연결은 없다.

따라가기

  1. "한 활동의 출력이 다음 활동의 입력" → 자료가 순서대로 흐른다
  2. 기능적 바로 아래, 교환적 바로 위 단계 → 순차적 응집도

헷갈리는 자리 — 절차적 응집도를 적는 것. 절차적은 "순서대로 실행되지만 자료를 주고받지는 않는다"이고, 순차적은 "자료가 앞에서 뒤로 넘어간다"다. "출력 · 입력"이라는 말이 나오면 순차적이다.

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

2024-2회 · 7번디자인패턴

컬렉션의 내부 구조를 노출하지 않고 요소들에 순차적으로 접근하게 하는 행위 패턴으로, Cursor라고도 불리는 것은?

정답이터레이터 (Iterator)

— 이터레이터(Iterator). 컬렉션이 배열인지 리스트인지 트리인지 모르고도 "다음 것 주세요"만으로 순회하게 하는 행위 패턴이다.

원리 — 컬렉션마다 저장 구조가 다르면 순회 코드도 달라진다(배열은 인덱스, 연결 리스트는 next 포인터). 이터레이터는 hasNext() · next() 두 메서드를 가진 순회 객체를 컬렉션이 내주게 해서, 클라이언트는 내부 구조를 전혀 모르고 같은 코드로 돈다. 자바의 Iterator, for-each 문이 그대로 이 패턴이다. 커서(Cursor)라고도 부르는 이유는 "지금 어디까지 읽었나"를 가리키는 위치 표시를 순회 객체가 들고 있기 때문이다 — DB 커서와 같은 발상이다.

따라가기

  1. "내부 구조를 노출하지 않고" → 구조를 숨긴다
  2. "요소들에 순차적으로 접근" → 하나씩 next()
  3. "Cursor 라고도 불림" → 이터레이터

헷갈리는 자리 — 컴포지트(Composite)와 섞는 것. 컴포지트는 트리 구조를 "만드는" 구조 패턴이고, 이터레이터는 구조를 "도는" 행위 패턴이다. 시험은 별명(Cursor)으로 힌트를 준다 — 옵저버는 Dependents · Publish-Subscribe, 어댑터는 Wrapper, 추상 팩토리는 Kit 다.

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

2024-2회 · 8번Python

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

text = "ab3ca3a3" print(text[:2] + str(text.count("3")) + text[3:5] + str(text.count("a")))
정답ab3ca3

— ab3ca3. 슬라이스 두 조각과 count 로 센 개수 두 개를 문자열로 이어 붙인다.

원리text[:2] 는 첨자 0 · 1(ab), text[3:5] 는 첨자 3 · 4(ca)다. text.count("3") 은 문자열 안에 "3" 이 몇 번 있는지 세어 정수를 돌려주므로, 문자열과 붙이려면 str() 로 글자로 바꿔야 한다 — 그래서 코드에 str 이 붙어 있다. 네 조각을 + 로 이으면 답이다. "ab3ca3a3" 에서 3 은 첨자 2 · 5 · 7 에 세 번, a 는 첨자 0 · 3 · 6 에 세 번 있다.

따라가기

  1. text[:2] → ab
  2. count("3") → 3
  3. text[3:5] → ca
  4. count("a") → 3. 이어서 ab3ca3

헷갈리는 자리 — text[3:5] 를 첨자 3 · 4 · 5 로 세어 "ca3" 을 넣는 것. 끝 첨자는 빠진다. count 를 첨자 위치로 착각하는 것 — count 는 개수다. str() 없이 정수를 문자열에 더하면 TypeError 라, 빈칸 문제로 str 이 나올 수도 있다.

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

2024-2회 · 9번네트워크

패킷 교환 방식 2가지: ① 전송 전에 논리적 경로를 미리 설정하는 연결형 ② 각 패킷이 독립적으로 경로를 찾는 비연결형

정답① 가상 회선 방식 ② 데이터그램 방식

— ① 가상 회선 방식 ② 데이터그램 방식. 2023년 1회 5번과 같은 두 방식을 번호 순서대로 적는 문제다.

원리 — 패킷 교환은 연결형과 비연결형으로 나뉜다. 가상 회선은 전송 전에 논리적 경로를 미리 잡고 모든 패킷이 그 길을 순서대로 따라간다 — 순서 보장, 초기 설정 비용. 데이터그램은 경로를 잡지 않고 패킷마다 목적지 주소로 각자 길을 찾는다 — 순서 뒤바뀜 가능, 설정 비용 없음, 장애에 유연. 인터넷의 IP 는 데이터그램, TCP 가 그 위에서 순서 · 신뢰성을 보탠다.

따라가기

  1. 전송 전 논리 경로 설정 · 연결형 → 가상 회선
  2. 패킷마다 독립 경로 · 비연결형 → 데이터그램

헷갈리는 자리 — 순서가 정해져 있으니 ①② 를 바꿔 적으면 둘 다 틀린다. 회선 교환은 패킷 교환이 아니라 별개의 방식이라 보기에 넣지 않는다.

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

2024-2회 · 10번C

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

#include <stdio.h> int calculate(int value) { int result = -value; switch (value % 3) { case 0: result += 3; case 1: result -= 4; default: result -= 2; } return result; } int main(void) { printf("%d", calculate(7)); return 0; }
정답-13

— −13. 7 % 3 = 1 이라 case 1 로 들어가고, break 가 없어 default 까지 흘러내려 −7 − 4 − 2 다.

원리int result = -value 로 출발점이 음수(−7)다. switch 는 맞는 case 로 뛰어든 뒤 break 가 없으면 아래 case 를 전부 실행한다. 이 코드는 case 0 · 1 · default 어디에도 break 가 없으니 진입한 자리부터 끝까지 다 더하고 뺀다. 7 을 3 으로 나눈 나머지는 1 이므로 case 0 의 += 3 은 건너뛰고 case 1 부터다. 음수에서 빼면 더 작아진다는 것만 조심하면 된다.

따라가기

  1. result = −7, 7 % 3 = 1 → case 1 진입
  2. result −= 4 → −11
  3. break 없음 → default: result −= 2 → −13

헷갈리는 자리 — case 0 의 +3 까지 넣어 −10 으로 적는 것(위쪽 case 는 안 지나간다). break 가 있다고 넘겨짚어 −11 로 적는 것. 답의 음수 기호를 빼먹는 것. 세 함정이 한 문제에 있다.

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

2024-2회 · 11번C

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

#include <stdio.h> #include <string.h> int main(void) { char text[10] = "abc"; strcpy(text + 3, "de"); printf("%d", (int)strlen(text) + (text[4] - 'a') + 1); return 0; }
정답10

— 10. "abc" 뒤에 "de" 를 이어 붙여 "abcde" 가 되고, 5 + (e − a) + 1 = 5 + 4 + 1 이다.

원리char text[10] = "abc" 는 열 칸짜리 상자 줄에 a · b · c · 끝표를 넣고 나머지는 0 으로 채운 것이다. text + 3 은 넷째 칸(첨자 3, 지금은 끝표가 있는 자리)의 주소이고, strcpy(text + 3, "de") 는 그 자리부터 d · e · 끝표를 써넣는다. 그러면 줄은 a b c d e 끝표가 되어 strlen(끝표 전까지 글자 수)이 5 다. 글자는 코드값이라 text[4] - 'a' 는 e 와 a 의 거리, 알파벳에서 e 는 a 로부터 네 번째이니 4 다.

따라가기

  1. 처음: [a, b, c, \0, 0, 0, 0, 0, 0, 0]
  2. strcpy 뒤: [a, b, c, d, e, \0, …] → strlen(text) = 5
  3. text[4] = 'e', 'e' − 'a' = 101 − 97 = 4
  4. 5 + 4 + 1 = 10

헷갈리는 자리 — strcpy 가 "이어 붙이기"가 아니라 "그 자리부터 덮어쓰기"라는 것. 시작 주소를 text 로 주면 "de" 가 a · b 를 덮어 "de" 만 남아 strlen 이 2 가 된다. 이 문제는 시작을 text + 3 으로 잡아 이어 붙이기처럼 보이게 한 것이다. 배열 크기 10 은 답에 안 쓰인다 — 크기와 길이는 다르다.

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

2024-2회 · 12번Java

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

public class Main { public static void main(String[] args) { int odd = 0; int even = 0; for (int i = 1; i <= 9; i++) { if (i % 2 == 0) even += i; else odd += i; } System.out.printf("%d, %d", odd, even); } }
정답25, 20

25, 20. 1 부터 9 까지 홀수의 합이 25, 짝수의 합이 20 이고 printf 의 서식대로 쉼표와 띄어쓰기가 붙는다.

원리i % 2 == 0 은 2 로 나눠 나머지가 0, 즉 짝수라는 뜻이다. 반복이 1 부터 9 까지 돌며 짝수는 even 에, 나머지(홀수)는 odd 에 더한다. printf("%d, %d", odd, even) 은 서식 문자열의 %d 자리에 차례로 값을 끼우고 나머지 글자(쉼표 · 공백)는 그대로 찍는다. 자바의 printf 는 C 와 같은 꼴이며 줄바꿈은 안 넣는다.

따라가기

  1. 홀수 1 + 3 + 5 + 7 + 9 = 25
  2. 짝수 2 + 4 + 6 + 8 = 20
  3. 서식 "%d, %d" → 25, 20

헷갈리는 자리 — 순서를 바꿔 20, 25 로 적는 것(첫 %d 가 odd). 쉼표 뒤 공백을 빼먹는 것 — 서식 문자열의 글자가 답의 일부다. 9 를 짝수에 넣거나 0 을 세는 것도 흔한 실수인데, 반복은 1 부터라 0 은 없다. 조건이 i < 9 였다면 9 가 빠져 16, 20 이 된다 — 등호를 본다.

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

2024-2회 · 13번네트워크

RIP 라우팅 테이블을 갱신했을 때 A에서 F까지 선택되는 경로를 쓰시오. RIP은 목적지까지 거치는 홉 수가 가장 적은 경로를 선택한다. 각 링크의 숫자는 비용이 아니라 한 번 이동하는 홉으로 계산한다.

구성도의 링크

링크
A – B2
A – D1
B – D2
D – C2
C – E1
C – F5
E – F2
정답A → D → C → F

— A → D → C → F. RIP 은 링크 값이 아니라 거치는 홉 수로 고르므로 3홉짜리 이 길이 최단이다.

원리 — RIP 의 거리는 "몇 개의 라우터를 거치나"(홉)이고 링크에 적힌 숫자는 안 본다 — 문제도 그렇게 못 박았다. 그래서 A 에서 F 까지 가는 모든 길의 홉 수를 세어 가장 적은 것을 고른다. 같은 그림을 OSPF 로 풀면 링크 값을 더한 비용으로 고르므로 답이 달라진다(훈련 T-N-04 가 그 짝이다). 표로 그린 링크를 그림으로 되돌려 길을 전부 적어 본다.

따라가기

  1. A → D → C → F: 3홉
  2. A → D → C → E → F: 4홉
  3. A → B → D → C → F: 4홉
  4. 최소 3홉 → A → D → C → F

헷갈리는 자리 — 링크 값을 더해(1 + 2 + 5 = 8 vs 1 + 2 + 1 + 2 = 6) A → D → C → E → F 를 고르는 것. 그것은 OSPF 의 답이다. 문제 첫 줄의 "RIP · 홉 수"가 채점 기준이다.

링크 표로 홉 수 · 비용을 손으로 세고 다익스트라 스크립트로 같은 경로를 확인했다. 복원 출처 grandlife.co.kr(2026-09-14) — 그림은 링크 표로 옮겼다.

2024-2회 · 14번보안

1997년 NIST 공모로 선정되어 DES를 대체했으며, 128/192/256비트 키를 사용하는 대칭키 블록 암호는?

정답AES

— AES. 1997년 NIST 공모로 뽑혀(Rijndael) DES 를 대체한 대칭키 블록 암호이고 키는 128 · 192 · 256비트다.

원리 — DES 는 1970년대 미국 표준이었지만 키가 56비트라 1990년대에 하루 만에 깨졌다. NIST 는 공모전을 열어 벨기에의 Rijndael 을 새 표준으로 골랐고, 그것이 AES(Advanced Encryption Standard)다. 128비트 블록을 라운드마다 치환 · 섞기 · 키 더하기로 변환하고, 키 길이에 따라 10 · 12 · 14 라운드다. 대칭키라 잠그는 키와 여는 키가 같고, 지금 인터넷 암호화(TLS · 무선 WPA2)의 기본이다. "NIST · DES 대체 · 128/192/256" 이 표지다.

따라가기

  1. NIST 공모 · DES 대체 · 128/192/256 키 → AES

헷갈리는 자리 — 3DES(DES 를 세 번 돌린 과도기 방식)나 RSA(비대칭)를 적는 것. "블록 암호 · 대칭"이면 AES 다. 키 길이 세 가지를 블록 길이(고정 128)와 섞지 않는다.

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

2024-2회 · 15번C

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

#include <stdio.h> int main(void) { int values[] = { 3, 5, 7, 9 }; int *p = values + 1; printf("%d", *p + *(p + 1) + values[3]); return 0; }
정답21

— 21. p 는 둘째 칸(5)을 가리키고, *p = 5, *(p + 1) = 7, values[3] = 9 를 더하면 21 이다.

원리 — 배열 이름 values 는 첫 칸의 주소다. 주소에 1 을 더하면 "한 칸 옆"이지 "1바이트 옆"이 아니다 — int 한 칸이 4바이트라도 values + 1 은 둘째 칸이다. 그래서 int *p = values + 1 은 p 를 둘째 칸(5)에 세워 두는 것이다. 별표는 그 칸을 여는 것이므로 *p 는 5, *(p + 1) 은 p 에서 한 칸 더 간 셋째 칸 7 이다. values[3] 은 첨자로 직접 넷째 칸을 여는 것이라 9 다.

따라가기

  1. values: 첨자 0 → 3, 1 → 5, 2 → 7, 3 → 9
  2. p = values + 1 → 첨자 1 의 주소. *p = 5
  3. *(p + 1) → 첨자 2 → 7
  4. values[3] → 9. 합 5 + 7 + 9 = 21

헷갈리는 자리*p + 1(값 5 에 1 을 더한 6)과 *(p + 1)(한 칸 옆의 값 7)의 차이다. 괄호가 있으면 자리를 옮기고, 없으면 값을 더한다. 또 p 가 첫 칸이 아니라 둘째 칸에서 시작한다는 것을 놓치면 3 + 5 + 9 = 17 로 틀린다.

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

2024-2회 · 16번OS

모든 프로세스가 시각 0에 도착할 때 SRT 방식의 평균 대기 시간을 구하시오.

프로세스실행 시간
P112
P22
P315
P44
정답6.5

— 6.5. 전부 시각 0 에 도착했으므로 SRT 는 SJF 와 같아 짧은 순서 P2 → P4 → P1 → P3 이고 대기 합 26 ÷ 4 = 6.5 다.

원리 — SRT(Shortest Remaining Time)는 "남은 실행 시간이 가장 짧은" 프로세스를 먼저 돌리는 선점 방식이다. 새 프로세스가 도착할 때마다 남은 시간을 비교해 더 짧으면 뺏는다. 그런데 이 문제는 모두 시각 0 에 도착해 도중에 새로 들어오는 프로세스가 없다 — 그러면 선점이 일어날 일이 없어 비선점 SJF 와 똑같이 짧은 것부터 차례로 돈다. 대기 시간은 "끝난 시각 − 도착 − 실행 시간"이고, 도착이 0 이면 "내 앞에서 돈 시간의 합"이다.

따라가기

  1. 짧은 순 정렬 → P2(2) → P4(4) → P1(12) → P3(15)
  2. P2: 0~2, 대기 0
  3. P4: 2~6, 대기 2
  4. P1: 6~18, 대기 6
  5. P3: 18~33, 대기 18
  6. 합 0+2+6+18 = 26, 평균 26 ÷ 4 = 6.5

헷갈리는 자리 — 반환 시간(turnaround)을 구하는 것. 반환은 "끝난 시각 − 도착"이라 실행 시간이 포함돼 (2+6+18+33) ÷ 4 = 14.75 가 된다. 문제는 "대기"를 물었다. 그리고 SRT 라고 해서 복잡한 선점 표를 그릴 필요가 없다 — 동시 도착이면 SJF 다.

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

2024-2회 · 17번Java

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

public class Main { static String uniqueReverse(String value, int index) { if (index < 0) return ""; char current = value.charAt(index); String rest = uniqueReverse(value, index - 1); return rest.indexOf(current) >= 0 ? rest : current + rest; } public static void main(String[] args) { String value = "abacad"; System.out.print(uniqueReverse(value, value.length() - 1)); } }
정답dcba

— dcba. 재귀가 앞 글자부터 돌아오면서 아직 없는 글자만 앞에 붙이므로, 중복을 뺀 뒤집힌 문자열이 된다.

원리 — 이 재귀는 index 를 줄이며 끝까지 내려간 뒤(index < 0 이면 빈 문자열) 돌아오면서 결과를 만든다. 돌아오는 순서는 index 0 → 1 → 2 → … 라 앞 글자부터 처리되고, 각 단계에서 current + rest 로 "새 글자를 앞에" 붙인다. 앞에 붙이니 뒤집힌다. 단 rest.indexOf(current) >= 0, 즉 이미 그 글자가 있으면 붙이지 않고 rest 를 그대로 넘긴다. 그래서 "중복 없는 역순"이다.

따라가기 — abacad, index 5 부터 내려가 0 부터 돌아온다.

  1. index 0 'a': rest "" → "a"
  2. index 1 'b': "b" + "a" → "ba"
  3. index 2 'a': 이미 있음 → "ba"
  4. index 3 'c': → "cba", index 4 'a': 있음 → "cba"
  5. index 5 'd': → dcba

헷갈리는 자리 — 내려가는 순서(뒤 글자부터)로 붙여 "dacaba" 류를 적는 것. 재귀의 결과는 돌아올 때 만들어진다. 중복을 안 거르면 "dacaba" 가 뒤집힌 전체가 되고, 앞이 아니라 뒤에 붙였다면(rest + current) "abcd" 가 된다 — 붙이는 방향과 거름 조건 두 가지를 본다.

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

2024-2회 · 18번SW공학

다른 모듈 내부의 논리적 흐름을 제어하기 위해 플래그·스위치 등 제어 요소를 전달하는 결합도는?

정답제어 결합도 (Control Coupling)

— 제어 결합도(Control Coupling). 플래그 · 스위치 값을 넘겨 상대 모듈의 실행 흐름을 조종하는 결합이다.

원리 — 결합도는 "모듈끼리 얼마나 얽혀 있나"이고 낮을수록 좋다. 6단계를 낮은 쪽부터 — 자료(값만 넘김) < 스탬프(자료구조째 넘김) < 제어(깃발로 조종) < 외부(외부 형식 공유) < 공통(전역 변수 공유) < 내용(남의 속을 직접 만짐). 제어 결합은 호출하는 쪽이 "이 값이면 이렇게 동작해라"라는 제어 요소를 넘기는 것이다 — 예: print(data, mode) 에서 mode 가 1이면 화면, 2면 파일. 호출자가 상대의 내부 논리를 알아야 하므로 자료 결합보다 얽혀 있다.

따라가기

  1. "플래그 · 스위치 등 제어 요소를 전달" → 값이 아니라 동작 지시를 넘긴다
  2. "다른 모듈의 논리적 흐름을 제어" → 제어 결합도

헷갈리는 자리 — 자료 결합도로 보는 것. 자료 결합은 넘긴 값을 상대가 "계산에" 쓰고, 제어 결합은 상대가 그 값으로 "분기"한다. 넘긴 것이 flag · mode · type 이면 제어다. 고치는 법은 분기별로 함수를 나누어 호출자가 필요한 것을 직접 부르게 하는 것이다 — 그러면 자료 결합으로 내려간다. 시험에서는 "플래그 · 스위치 · 제어 요소"라는 낱말이 곧 제어 결합의 신호다.

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

2024-2회 · 19번C

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

#include <stdio.h> struct Item { int price; int count; }; int main(void) { struct Item item = { 4, 5 }; struct Item *p = &item; printf("%d", p->price * p->count); return 0; }
정답20

— 20. 포인터 p 가 가리키는 구조체의 price 4 와 count 5 를 곱한다.

원리 — 구조체는 이름 붙은 칸들을 한 묶음으로 만든 것이다. {4, 5} 로 초기화하면 선언한 순서대로 price = 4, count = 5 가 들어간다. struct Item *p = &item 은 그 묶음의 주소를 p 에 적은 것이고, p->price 는 "p 를 따라가서 그 안의 price"다. 화살표 접근은 값을 복사하는 것이 아니라 원본 칸을 읽는 것이라 item.price 와 같은 값이다. 이 문제는 구조체 포인터 문법을 아는지 하나만 묻는다.

따라가기

  1. item = {price 4, count 5}
  2. p = &item
  3. p->price × p->count = 4 × 5 = 20

헷갈리는 자리 — 초기화 순서를 바꿔 읽는 것(price 가 먼저 선언됐으니 4 가 price). p.price 는 컴파일 오류이고 (*p).price 는 화살표와 같다. 곱셈이라 답은 20 이지 "4 5" 가 아니다. 구조체는 배열과 달리 칸마다 이름과 자료형이 따로 있어 첨자가 아니라 이름으로 꺼낸다 — 그래서 p[0] 같은 꼴은 안 쓰고 p->price 로 쓴다.

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

2024-2회 · 20번Java

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

public class Main { public static void main(String[] args) { String value = "S/W/ENGINEER"; String[] words = value.split("/"); System.out.print(words[0]); } }
정답S

— S. split("/") 이 문자열을 / 마다 잘라 배열로 만들고, 그 첫 조각이 S 다.

원리split(구분자) 는 구분자를 기준으로 문자열을 잘라 String 배열을 돌려준다. 구분자 자체는 결과에 들어가지 않는다. "S/W/ENGINEER" 를 / 로 자르면 "S", "W", "ENGINEER" 세 조각이고, 배열 첨자는 0 부터이므로 words[0] 은 첫 조각이다. 조각 수는 구분자 수 + 1 이다.

따라가기

  1. words = ["S", "W", "ENGINEER"]
  2. words[0] → S

헷갈리는 자리 — words[0] 을 "첫 번째"가 아니라 "0번째 = 없음"으로 보거나, 구분자 / 가 조각에 포함된다고 보는 것. 자바 split 은 정규식을 받으므로 "." 이나 "|" 로 자를 때는 "\\." 처럼 이스케이프가 필요하다 — / 는 특수문자가 아니라 그대로 쓴다. words.length 는 3 이고 words[3] 을 읽으면 ArrayIndexOutOfBoundsException 이 난다는 것도 같은 문제 꼴에서 자주 묻는다.

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

03채점 뒤 할 일

왜 이걸 하나 — 점수보다 어느 장으로 돌아가느냐가 결과다. 문항마다 가는 장이 정해져 있다.

코드 9문항 중 C 4 · Java 4 · Python 1 이다. 10번은 calculate(7) 이 −7 에서 시작해 case 1 부터 흘러내려 −13, 11번은 strcpy 가 text + 3 에 이어 붙여 abcde 가 되고 strlen 5 + (e − a) 4 + 1 = 10 이다. 15번 포인터 산술은 values + 1 이 5 를 가리켜 5 + 7 + 9 = 21.

17번 uniqueReverse 는 돌아오는 길에 문자를 붙이며 이미 있으면 건너뛴다. abacad 를 뒤에서부터 d · a · c · a · b · a 로 보되 중복을 지우면 dcba 다. 재귀는 내려가는 순서가 아니라 돌아오는 순서로 결과가 쌓인다는 것이 E06 의 규칙이다.

용어 11문항은 SW공학 4(순차적 응집도 · 제어 결합도 · 이터레이터 · SRT) · SQL·DB 3(반정규화 · 카디널리티와 디그리 · SQL 키워드 4칸) · 네트워크 2(패킷 교환 · RIP 경로) · 보안 2(IPSec · AES)다. 3번은 VALUES · SELECT · FROM · SET 네 낱말을 순서대로 적는 부분 점수 문제다.

문항마다 가는 장

틀린 문항의 「가는 장」을 열면 그 문항이 04절에 그대로 있고, 앞뒤로 같은 꼴의 문항이 붙어 있다. 몰라서 틀렸으면 그 장 03절부터, 알았는데 틀렸으면 05절만 읽는다. 판정 기준은 E01 의 03절 표와 같다.

문항분야가는 장무엇을 묻나
1JavaE06new String 세 개의 == 비교
2DBE10반정규화 정의
3SQLE09INSERT · SELECT · UPDATE 키워드 빈칸
4DBE10카디널리티와 디그리
5보안E13AH · ESP 의 IPSec
6SW공학E15순차적 응집도
7디자인패턴E17이터레이터 패턴
8PythonE07슬라이스와 count 섞은 문자열
9네트워크E11가상 회선 · 데이터그램
10CE04break 없는 switch 와 음수 시작
11CE02strcpy 이어 붙이기와 strlen
12JavaE051~9 홀수 합 · 짝수 합 printf
13네트워크E12RIP 이 고르는 최소 홉 경로
14보안E13DES 를 대체한 AES
15CE02포인터 산술 *p + *(p + 1)
16OSE16SRT 평균 대기 시간
17JavaE06재귀로 중복 없는 역순 문자열
18SW공학E15제어 결합도
19CE03구조체 포인터 -> 곱
20JavaE06split 결과의 첫 원소

이 회차에서 눈여겨볼 문항

문항왜 갈리나
1번a 와 b 는 서로 다른 new, c 는 a 와 같은 참조지만 b 와 비교하므로 N, new String 과 비교도 N. NNN
13번RIP 은 비용이 아니라 홉 수다. A → D → C → F 가 3홉으로 가장 짧다. 링크 값에 속으면 A → B 로 간다
16번0 에 전부 도착한 SRT 는 SJF 와 같다. P2(2) → P4(4) → P1(12) → P3(15). 대기 0 + 2 + 6 + 18 = 26 ÷ 4 = 6.5
17번재귀 결과는 돌아올 때 쌓인다. rest 에 없는 문자만 앞에 붙여 dcba

채점 결과는 오답노트에 회차별 점수와 틀린 문항 목록으로 모인다. 세트를 하나 끝낼 때마다 거기서 같은 장에서 반복해서 틀리는지를 본다. 두 세트에서 같은 장이 나오면 그 장의 06절 훈련을 그날 5문항 푼다.

04다음

왜 이걸 하나 — 세트의 결과는 다음에 열 장의 이름이어야 한다.