컨테이너의 장점은 호스트 OS 커널을 공유해 오버헤드가 적고 시작이 빠르다는 점이다.
가상머신은 인스턴스마다 게스트 OS를 통째로 부팅하지만, 컨테이너는 게스트 OS 없이 프로세스 격리만으로 동작하므로 가볍다.
- 하드웨어 완전 에뮬레이션과 높은 격리 수준: 가상머신 쪽의 특징이다. 커널을 공유하는 컨테이너는 격리가 오히려 약하다.
- 서로 다른 커널 버전의 OS 실행: 호스트 커널 하나를 함께 쓰는 컨테이너로는 불가능하고, 가상머신이 가능한 일이다.
- 하이퍼바이저를 통한 자원 분배: 가상머신의 구성 요소이며, 컨테이너는 컨테이너 런타임이 관리한다.
| [학생] 테이블 STUDENT_ID, STUDENT_NAME [수강] 테이블 ENROLLMENT_ID, STUDENT_ID, COURSE_ID |
[수강].STUDENT_ID를 [학생]의 기본키를 참조하는 외래키(Foreign Key)로 정의해야 한다.
외래키는 참조되는 테이블에 있는 값만 입력되도록 DBMS가 강제하는 참조 무결성 제약이다.
- 학생 이름을 직접 저장: 데이터가 중복되고, 존재하는 학생인지 보장하는 제약도 생기지 않는다.
- 관계없는 독립 후보키로 지정: 후보키는 자기 테이블 안의 유일성만 보장하므로 [학생]의 값을 참조하지 못한다.
- STUDENT_ID를 기본키로 선언해 통합: 수강 내역에서 STUDENT_ID가 유일해져 한 학생이 한 과목만 수강할 수 있게 된다.
| < 보 기 > ㄱ.출력되는 특징 맵(Feature Map)의 크기는 2×2이다. ㄴ.커널(필터)을 이동시키는 간격인 스트라이드(Stride) 값을 크게 할수록 출력 특징 맵의 크기는 작아진다. ㄷ.합성곱 전후의 크기를 동일하게 맞추기 위해 입력 데이터의 외곽에 특정 값을 채워 넣는 패딩 방법을 수행해야 한다. ㄹ.합성곱 연산은 커널(필터)의 각 요소와 입력 데이터의 대응 요소를 각각 곱한 9개 값의 평균을 계산하는 방식이다. |
옳은 설명은 스트라이드 효과를 말한 ㄴ과 패딩의 역할을 말한 ㄷ이다.
출력 크기 = (입력 − 커널 + 2 × 패딩) ÷ 스트라이드 + 1 이다.
- ㄱ: 출력 특징 맵의 크기는 2×2가 아니라 3×3이다.
- ㄹ: 합성곱은 대응 요소끼리 곱한 값의 평균이 아니라 합을 구하는 연산이다.
| 15, 3, 27, 1 |
삽입을 마친 뒤 루트의 오른쪽 자식에 있는 값은 27이다.
최소힙은 맨 끝에 넣은 뒤 부모보다 작으면 교환하며 올린다.
15 삽입: [15]
3 삽입: 15와 교환해 [3, 15]
27 삽입: 교환 없이 [3, 15, 27]
1 삽입: 15의 자식으로 들어가 15, 3과 차례로 교환해 [1, 3, 27, 15]
- 1: 가장 작은 값이라 루트에 있다.
- 3: 루트의 왼쪽 자식에 있다.
- 15: 3의 왼쪽 자식으로 내려가 있다.
틀린 설명은 항상 가장 많은 자원을 점유한 프로세스를 먼저 종료한다는 내용이다.
희생 프로세스는 자원 점유량만으로 정해지지 않고, 우선순위·수행 시간·복구 비용 등을 고려해 최소 비용이 되도록 고른다.
- 점유하며 대기: 자원을 보유한 채 추가 자원을 기다리는 상태라는 정의가 맞다.
- 비선점 방지: 즉시 할당받지 못하면 보유 자원을 내놓게 하여 사실상 선점을 허용하는 방식이다.
- 은행원 알고리즘: 최대 요구량을 미리 선언받고 안전 상태가 유지될 때만 할당하는 회피 기법이다.
| #include <stdio.h> int main() { char a[] = "KOREA"; char *p = &a[1]; *(p+3) = 'D'; p++; printf("%s", p); } |
문자열이 KORED로 바뀐 뒤 a[2]부터 출력되므로 결과는 RED이다.
p = &a[1] 이므로 p는 'O'를 가리킨다.
*(p+3) = 'D' 는 a[4]를 바꾸어 a가 KORED가 된다.
p++ 로 p는 a[2]인 'R'을 가리킨다.
%s는 그 위치부터 널 문자 전까지 출력한다.
- READ: 'D'는 뒤에 덧붙는 것이 아니라 a[4]의 'A'를 덮어쓰므로 나올 수 없다.
- KORED: a[0]부터 출력할 때의 값인데, p는 a[2]를 가리킨다.
- KOREA: 원래 문자열로, 수정과 포인터 이동이 모두 빠진 값이다.
| •시간지역성(temporal locality): ( 가 ) 사용된 데이터가 가까운 미래에 다시 사용될 가능성이 높은 성질 •공간지역성(spatial locality): 특정 위치의 데이터가 사용되었을 때, ( 나 ) 위치의 데이터가 가까운 미래에 사용될 가능성이 높은 성질 |
(가)는 최근에, (나)는 인접한이 들어간다.
시간지역성은 방금 쓴 데이터를 곧 다시 쓰는 성질이고, 공간지역성은 쓴 데이터의 주변을 곧 쓰는 성질이다. 배열 순차 접근이 공간지역성의 대표 예이다.
- 최근에 / 동일한: 동일한 위치를 다시 쓰는 것은 시간지역성의 내용이라 공간지역성 설명에 맞지 않는다.
- 빈번히 / 인접한: 시간지역성의 기준은 사용 빈도가 아니라 사용 시점이다.
- 빈번히 / 동일한: 두 괄호 모두 지역성의 정의와 어긋난다.
다음 SQL문에서 빈칸 ( )에 들어갈 내용으로 가장 적절한 것은?
| SELECT 출판사명, AVG(가격) FROM 도서 ( ) ORDER BY AVG(가격) DESC; |
출판사별로 묶고 그룹 조건을 거는 GROUP BY 출판사명 HAVING AVG(가격) >= 20000이 알맞다.
집계 함수에 대한 조건은 그룹을 만든 뒤에 적용하므로 HAVING을 쓰고, 절의 순서는 WHERE → GROUP BY → HAVING → ORDER BY이다.
- GROUP BY 가격 HAVING 출판사명 >= 20000: 출판사가 아니라 가격으로 묶었고, 문자열인 출판사명을 금액과 비교한다.
- HAVING AVG(가격) >= 20000 WHERE 출판사명: HAVING이 WHERE보다 앞에 올 수 없고, WHERE에 조건식도 없다.
- WHERE AVG(가격) >= 20000 GROUP BY 출판사명: WHERE 절에는 집계 함수를 쓸 수 없다.
| #include <stdio.h> long min(long x, long y) { return x < y ? x : y; } long max(long x, long y) { return x < y ? y : x; } void decr(long *xp, long v) { *xp -= v; } long sq(long x) { return x*x; } void main() { long x = 20, y = 50, t = 0, i; for (i = max(x, y) - 1; i >= min(x, y); decr(&i, 1)) t += sq(i); } |
decr()은 반복 본문이 끝날 때마다 한 번씩 호출되므로 총 30회 호출된다.
i의 초기값은 max(20, 50) − 1 = 49이고, 반복 조건은 i >= 20이다.
본문 실행 횟수:
for 문의 증감식은 조건이 참이어서 본문을 수행한 뒤에만 실행된다. i가 19가 되는 마지막 decr() 호출까지 포함해 호출 수와 본문 실행 수가 같다.
| #include <stdio.h> int main() { int data[] = {10, 20, 30, 40, 50}; int *ptr = data; ptr++; *ptr += 5; printf("%d", *(ptr+1) + *(ptr)); return 0; } |
*(ptr+1)이 30, *ptr이 25이므로 출력값은 55이다.
ptr = data 이므로 ptr은 data[0]을 가리킨다.
ptr++ 로 data[1]을 가리킨다.
*ptr += 5 로 data[1]이 20에서 25로 바뀐다.
값 20을 그대로 더하면 50이 되지만, 앞 문장에서 data[1]이 이미 25로 바뀌었으므로 맞지 않다.
틀린 설명은 PaaS를 완성된 소프트웨어 제공 모델이라고 한 내용이다.
그 설명은 SaaS에 해당한다. PaaS는 개발·실행 플랫폼을 제공하며, 소비자는 그 위에 자신의 애플리케이션을 배포하고 제어한다.
- IaaS: 가상 서버·네트워크 같은 인프라를 받아 소비자가 설정과 운영을 맡는다는 설명이 맞다.
- 자원 풀링: 자원을 풀로 묶어 수요에 따라 동적으로 할당하고 통계적 다중화를 활용한다.
- 가상화: 물리 서버와 스토리지를 가상 서버와 가상 디스크로 추상화해 제공한다.
틀린 설명은 중앙 서버를 반드시 두어야 한다는 내용이다.
분산 시스템은 중앙 관리 서버가 필수가 아니며, P2P 구조처럼 노드들이 메시지 교환과 합의로 상태를 유지할 수도 있다. 중앙 서버 의존은 오히려 단일 장애점이 될 수 있다.
- 네트워크 연결: 여러 단위 시스템이 네트워크로 연결된다는 것이 분산 시스템의 기본 정의이다.
- 독립적 동작: 각 단위 시스템은 자체 CPU·메모리·운영체제를 갖추어 독립적으로 동작한다.
- 투명성: 사용자에게 하나의 시스템처럼 보이도록 용도에 맞는 수준의 투명성을 제공해야 한다.
틀린 설명은 자식이 둘인 노드를 삭제할 때 자식을 그 자리에 올린다는 내용이다.
자식이 둘이면 왼쪽 서브트리의 최댓값이나 오른쪽 서브트리의 최솟값으로 대체해야 한다. 자식을 바로 올리는 것은 자식이 하나일 때의 처리이다.
- 키의 유일성: 이진 탐색 트리의 정의에서 모든 노드는 유일한 키를 가진다.
- 왼쪽 서브트리: 부모보다 작은 키만 모인다는 설명이 맞다.
- 균형 탐색 트리: 높이를 로그 수준으로 유지하므로 최악에도 탐색 시간이 이다.
| ㄱ.보조기억장치(Auxiliary Memory)는 대용량이지만 주기억장치보다 느리고 저렴하다. ㄴ.SRAM(Static RAM)은 플립플롭(Flip-flop)을 사용하여 재충전(Refresh)이 필요없고 전원 공급 시 데이터가 유지된다. ㄷ.DRAM(Dynamic RAM)은 SRAM에 비해 속도가 더 빨라서 주로 높은 속도가 필요한 캐시로 사용된다. ㄹ.기억장치의 상위 계층(CPU에 가까운 쪽)일수록 접근 속도는 빠르나 용량은 작고 비트 당 가격은 비싸진다. |
옳은 설명은 ㄱ, ㄴ, ㄹ이고, DRAM을 SRAM보다 빠르다고 한 ㄷ만 틀렸다.
캐시에 쓰이는 것은 더 빠른 SRAM이고, DRAM은 집적도가 높고 저렴해 주기억장치에 쓰인다.
- ㄱ: 보조기억장치는 주기억장치보다 용량이 크고 느리며 저렴하다.
- ㄴ: SRAM은 플립플롭으로 저장해 재충전 없이 전원이 있는 동안 데이터를 유지한다.
- ㄹ: CPU에 가까운 계층일수록 빠르고, 용량은 작고, 비트당 가격은 비싸다.
틀린 설명은 딥페이크의 GAN에서 두 신경망이 협력해 평균값으로 합성한다는 내용이다.
GAN은 가짜를 만드는 생성자와 진위를 가리는 판별자가 경쟁하며 학습하고, 이 과정에서 실제와 비슷한 데이터를 생성한다.
- 공간 컴퓨팅: 가상·증강현실을 기반으로 디지털 정보와 물리 공간을 결합하는 기술이다.
- 대규모 언어모델: 방대한 텍스트를 학습해 자연스러운 언어 생성과 추론을 수행한다.
- 소버린 클라우드: 데이터 주권을 지키기 위해 해당 국가의 법령과 규제 요건을 준수하는 모델이다.
CPU 할당 순서는 P1 → P2 → P1 → P3 → P2이다.
0~3: P1 실행, 2 남음. 1에 도착한 P2가 큐에 있고 P1이 그 뒤로 간다.
3~6: P2 실행, 1 남음. 4에 P3가 도착해 P1 뒤에 서고, P2는 P3 뒤로 간다.
6~8: P1 실행 후 완료
8~10: P3 실행 후 완료
10~11: P2 실행 후 완료
핵심은 시각 6에 큐가 P1, P3, P2 순서라는 점이다. 시각 3에 P1이 큐로 돌아갈 때 P3는 아직 도착하지 않아 P1이 P3보다 앞선다.
- P1 → P2 → P3: P1과 P2의 남은 시간이 처리되지 않은 순서이다.
- P3 → P2 → P1: 도착 시각이 가장 늦은 P3가 처음 실행될 수 없다.
- P1 → P2 → P3 → P1 → P2: P1이 P3보다 먼저 큐에 들어간 점을 놓친 순서이다.
틀린 설명은 RNN이 병렬처리에 효율적이라는 내용이다.
RNN은 앞 시점의 은닉 상태를 받아 다음 시점을 계산하므로 순차 처리가 필요해 병렬화가 어렵다.
- CNN: 공간적 특징 추출에 강해 객체 인식 등에 주로 쓰인다.
- 트랜스포머: 어텐션으로 단어 간 관계를 파악해 자연어처리에 널리 쓰인다.
- 멀티모달 AI: 텍스트·이미지·오디오 등 서로 다른 형태의 데이터를 통합해 학습한다.
나선형 모형은 위험 분석을 포함한 4단계를 반복하는 모형이다.
목표·제약조건 결정, 위험 분석, 개발과 평가, 다음 단계 계획을 나선처럼 돌며 점진적으로 완성해, 위험 관리가 가장 큰 특징이다.
- 핵심 기능을 실험적으로 만들어 평가: 프로토타이핑 모형의 설명이다.
- 단계가 명확하고 재작업 없음: 폭포수 모형의 설명이다.
- 짧은 사이클로 실행 가능한 소프트웨어 개발: 애자일 방식의 설명이다.
| < 보 기 > 한 기업에서 사용 중인 급여 관리 시스템이 기존 Windows 10 환경에서 최신 운영체제인 Windows 11로 업그레이드됨에 따라, 시스템이 새로운 운영체제 환경에서도 오류 없이 정상적으로 동작할 수 있도록 내부 코드를 수정하고 환경 설정을 변경하였다. |
운영체제 변경에 맞춰 코드를 고친 작업은 적응(Adaptive) 유지보수이다.
적응 유지보수는 운영체제·하드웨어 같은 외부 환경 변화에 소프트웨어를 맞추는 활동이다.
- 수정 유지보수: 사용 중 발견된 결함을 고치는 활동이다.
- 완전 유지보수: 기능 추가나 성능 개선처럼 사용자 요구를 반영하는 활동이다.
- 예방 유지보수: 앞으로 생길 문제를 막으려고 구조를 미리 개선하는 활동이다.
옳은 설명은 강화학습에 대한 내용이다.
강화학습은 에이전트가 행동하고 환경에서 받은 보상이 최대가 되도록 정책을 스스로 개선한다.
- 정답 없는 데이터에서 패턴·군집 탐색: 지도학습이 아니라 비지도학습의 설명이다.
- 분류와 회귀: 비지도학습이 아니라 지도학습의 대표 응용이다.
- 대량의 라벨 데이터로 처음부터 학습: 전이학습은 이미 학습된 모델의 지식을 새 문제에 재사용하는 방법이다.
| [학생(R) 릴레이션] | [수강(S) 릴레이션] | |||||||||||||||||||||||||||
|
|
평균 시간 복잡도가 이 아닌 것은 삽입 정렬이다.
삽입 정렬은 각 원소를 앞쪽 정렬 구간과 비교해 끼워 넣으므로 평균 이다.
- 병합 정렬: 절반씩 나누어 병합하므로 평균과 최악 모두 이다.
- 힙 정렬: 삭제와 재정렬을 원소 수만큼 반복해 평균 이다.
- 퀵 정렬: 최악은 이지만 평균은 이다.
틀린 설명은 리스트는 변경 불가, 튜플은 변경 가능이라는 내용으로, 두 자료형의 성질이 뒤바뀌었다.
리스트는 원소를 바꿀 수 있는 가변(mutable) 자료형이고, 튜플은 바꿀 수 없는 불변(immutable) 자료형이다.
- 대괄호와 소괄호 표기: 대괄호는 리스트, 소괄호는 튜플이 맞다.
- 리스트의 중첩: 리스트 안에 다른 리스트를 원소로 넣을 수 있다.
- 인덱싱: 순서가 있는 리스트와 튜플은 가능하고, 순서가 없는 집합은 불가능하다.
모두 반영되거나 전혀 반영되지 않아야 하는 성질은 원자성(Atomicity)이다.
원자성은 트랜잭션을 더 나눌 수 없는 하나의 단위로 다루는 성질로, All or Nothing으로 요약한다.
- 일관성: 트랜잭션 전후에 데이터베이스가 무결성 제약을 지키는 성질이다.
- 고립성: 동시에 실행되는 트랜잭션이 서로 간섭하지 않는 성질이다.
- 지속성: 완료된 트랜잭션의 결과가 장애 후에도 유지되는 성질이다.
재현율은 0.90, 정밀도는 0.82이다.
TP = 90, FN = 10, FP = 20이다.
재현율 = TP ÷ (TP + FN):
정밀도 = TP ÷ (TP + FP):
- 재현율 0.90 / 정밀도 0.85: 정밀도 계산값과 다르다.
- 재현율 0.85 / 정밀도 0.90: 두 값 모두 계산 결과와 다르다.
- 재현율 0.82 / 정밀도 0.90: 두 지표의 값이 서로 뒤바뀌었다.