작은 것부터 바르게 나열한 것은 GB, TB, PB, EB 순서이다.
정보량 단위는 KB → MB → GB → TB → PB → EB → ZB 순으로 커지며, 한 단계마다 배(10진 접두어로는 1000배)씩 커진다.
- EB, GB, PB, TB 순서는 가장 큰 EB를 맨 앞에 두어 틀리다.
- EB, PB, GB, TB 순서도 큰 단위가 앞에 와서 틀리다.
- GB, TB 다음에 EB를 PB보다 앞에 둔 나열은 PB가 EB보다 작다는 점에 어긋난다.

F는 X와 (Y XOR Z)의 OR이므로 F가 0이 되려면 X=0이면서 Y=Z여야 하며, 입력 X=0, Y=1, Z=1 조합이 이에 해당한다.
OR는 입력이 모두 0일 때만 0이고, XOR는 두 입력이 같을 때 0이다. X=0, Y=1, Z=1이면 이다.
- X=0, Y=0, Z=1 — Y XOR Z가 1이므로 F=1이다.
- X=0, Y=1, Z=0 — Y XOR Z가 1이므로 F=1이다.
- X=1, Y=0, Z=0 — X가 1이므로 OR 출력 F=1이다.
개인키와 공개키를 쓰는 비대칭키 암호화 기법은 RSA이다.
RSA는 큰 수의 소인수분해의 어려움에 안전성을 두며, 공개키로 암호화한 것을 개인키로만 복호화할 수 있다.
- AES는 하나의 비밀키로 암·복호화하는 대칭키 블록 암호이다.
- DES는 56비트 키를 쓰는 대칭키 블록 암호이다.
- SEED는 국내에서 개발된 대칭키 블록 암호이다.
네트워크 계층 프로토콜이 아닌 것은 SLIP(Serial Line Internet Protocol)으로, 직렬 회선에서 IP 패킷을 캡슐화하는 데이터 링크 계층 프로토콜이다.
나머지는 모두 IP 패킷 전달과 관련된 네트워크 계층 프로토콜이다.
- ICMP는 오류·제어 메시지를 전달하는 네트워크 계층 프로토콜이다.
- IGMP는 멀티캐스트 그룹을 관리하는 네트워크 계층 프로토콜이다.
- IP는 주소 지정과 라우팅을 담당하는 네트워크 계층의 핵심 프로토콜이다.
애플리케이션을 구축·테스트·설치할 수 있는 통합 환경을 제공하는 것은 PaaS(Platform as a Service)이다.
PaaS는 운영체제·미들웨어·런타임·개발 도구 같은 개발 플랫폼을 제공해, 사용자는 인프라 관리 없이 애플리케이션 개발에 집중한다.
- IaaS는 서버·스토리지·네트워크 같은 인프라 자원을 제공한다.
- NAS는 네트워크에 연결된 파일 저장 장치로 클라우드 서비스 모델이 아니다.
- SaaS는 완성된 소프트웨어를 서비스로 제공한다.
계산 결과는 1111 1011로, 8비트 2의 보수 표현에서 이다.
뺄셈은 빼는 수의 2의 보수를 더한다. 을 반전하면 , 여기에 1을 더해 이다.
과 더하면 이다.
검산하면 의 2의 보수가 이므로 결과는 음수 5가 맞다.
- 0000 0100과 0000 0101은 부호 비트가 0인 양수여서 음수 결과일 수 없다.
- 1111 0101은 을 나타내므로 틀리다.
옳지 않은 것은 RAID 1이 패리티 비트로 오류를 검출한다는 설명이다. RAID 1은 패리티 없이 미러링으로 같은 데이터를 두 디스크에 복제한다.
패리티를 쓰는 것은 RAID 3·4·5 등이며, RAID 1은 한 디스크가 고장 나도 복제본으로 복구한다.
- RAID 0이 패리티 없이 데이터를 분산(스트라이핑) 저장한다는 설명은 옳다.
- RAID 2가 해밍 코드로 오류를 검출·정정한다는 설명은 옳다.
- RAID 5가 데이터와 패리티를 블록 단위로 분산 저장한다는 설명은 옳다.
CISC의 특징으로 옳지 않은 것은 명령어 길이가 고정적이다는 설명이다. CISC는 가변 길이 명령어를 쓰고, 고정 길이는 RISC의 특징이다.
CISC는 복잡하고 다양한 명령어를 마이크로프로그램으로 구현하므로 명령어마다 길이와 실행 사이클이 다르다.
- 명령어의 종류가 많다는 것은 CISC의 특징이다.
- 명령어 길이와 실행 시간이 제각각이라 파이프라인이 비효율적이라는 것은 CISC의 특징이다.
- 회로 구성이 복잡하다는 것은 CISC의 특징이다.
def binary(ds, key):
low = 0
high = len(ds) - 1
while low <= high:
mid = (low+high) // 2
if key == ds[mid]:
return mid
elif key < ds[mid]:
(가)
else:
(나)
return| (가) | (나) | |
|---|---|---|
| ① | high = mid - 1 | low = mid - 1 |
| ② | high = mid - 1 | low = mid + 1 |
| ③ | high = mid + 1 | low = mid - 1 |
| ④ | high = mid + 1 | low = mid + 1 |
(가)는 high = mid - 1, (나)는 low = mid + 1이다.
key가 ds[mid]보다 작으면 찾는 값은 mid 왼쪽에 있으므로 상한을 mid 바로 앞으로 줄이고, 크면 오른쪽에 있으므로 하한을 mid 바로 뒤로 올린다. 이미 비교한 mid를 범위에서 빼야 구간이 줄어 low <= high 조건으로 반복이 끝난다.
- high = mid - 1, low = mid - 1 연결 — key가 오른쪽에 있을 때 하한이 오히려 왼쪽으로 가서 구간이 줄지 않고 반복이 끝나지 않을 수 있다.
- high = mid + 1, low = mid - 1 연결 — 두 경우 모두 찾는 방향과 반대로 경계를 옮겨 범위가 줄지 않는다.
- high = mid + 1, low = mid + 1 연결 — key가 왼쪽에 있을 때 상한을 mid 오른쪽으로 넓혀 범위가 줄지 않는다.
참조열: 2 1 2 3 1 4 5 1 4 3
참조열에 각 기법을 적용하면 페이지 부재가 FIFO 7회, LFU 7회, LRU 6회, MFU 7회로 LRU가 가장 적다.
LRU는 2, 1, 3을 적재한 뒤 4에서 가장 오래 안 쓴 2를, 5에서 3을 내보내 {1, 4, 5}가 되고 이어지는 1과 4는 적중한다. 마지막 3에서 5를 내보내므로 부재는 2, 1, 3, 4, 5, 3에서 일어난 6회이다.
- FIFO — 4에서 2, 5에서 1, 1에서 3, 3에서 4를 차례로 교체해 부재가 7회이다.
- LFU — 사용 횟수가 적은 3, 4, 5, 4를 차례로 내보내 두 번째 4와 마지막 3에서도 부재가 나 7회이다.
- MFU — 자주 쓴 2와 1을 먼저 내보내 다시 참조된 1에서 부재가 나고, 마지막 3에서도 부재가 나 7회이다.
교착상태의 필요조건이 아닌 것은 선점이다. 필요조건은 비선점(no preemption)이다.
교착상태는 상호 배제, 점유와 대기, 비선점, 순환 대기의 네 조건이 동시에 성립할 때 발생하며, 자원을 강제로 빼앗을 수 있으면(선점) 교착상태가 풀린다.
- 상호 배제는 한 자원을 한 프로세스만 쓸 수 있다는 필요조건이다.
- 순환 대기는 프로세스들이 원형으로 서로의 자원을 기다리는 필요조건이다.
- 점유와 대기는 자원을 가진 채 다른 자원을 기다리는 필요조건이다.
- ㄱ. FCFS(First Come First Served) 스케줄링
- ㄴ. HRN(Highest Response-ratio Next) 스케줄링
- ㄷ. RR(Round Robin) 스케줄링
- ㄹ. SRT(Shortest Remaining Time) 스케줄링
비선점형 알고리즘은 FCFS와 HRN이다.
FCFS는 도착 순서대로, HRN은 (대기시간+서비스시간)/서비스시간으로 구한 응답 비율이 높은 순서로 프로세스를 고르며, 일단 CPU를 받으면 끝날 때까지 빼앗기지 않는다.
- RR — 시간 할당량이 끝나면 CPU를 빼앗아 준비 큐 뒤로 보내는 선점형이다.
- SRT — 남은 실행 시간이 더 짧은 프로세스가 도착하면 CPU를 넘기는 SJF의 선점형 버전이다.
옳지 않은 것은 병목 현상이 나타나지 않는다는 설명이다. 트리형은 상위 노드로 트래픽이 모이므로 병목 현상이 생길 수 있다.
트리형은 중앙 노드에서 계층적으로 가지를 뻗는 구조라 하위 노드 간 통신도 상위 노드를 거친다.
- 가지를 추가하는 방식이라 네트워크 확장이 용이하다는 설명은 옳다.
- 계층별로 처리를 나누어 분산처리 방식을 구현할 수 있다는 설명은 옳다.
- 중앙(최상위) 노드에 장애가 나면 전체 네트워크에 영향을 준다는 설명은 옳다.
B 클래스에 해당하는 것은 128.128.128.128이다.
클래스는 첫 옥텟으로 구분하며, A 클래스는 0~127, B 클래스는 128~191, C 클래스는 192~223이다.
- 12.23.34.45는 첫 옥텟이 12이므로 A 클래스이다.
- 111.111.11.11은 첫 옥텟이 111이므로 A 클래스이다.
- 222.111.222.111은 첫 옥텟이 222이므로 C 클래스이다.
한 모듈이 다른 모듈의 내부 기능 및 자료를 직접 참조하거나 사용하는 경우로, 한 모듈에서 다른 모듈의 내부로 제어가 이동하는 경우도 이에 해당한다.
한 모듈이 다른 모듈의 내부 기능·자료를 직접 참조하거나 내부로 제어가 이동하는 경우는 내용 결합도이다.
내용 결합도는 결합도 중 가장 강한(가장 바람직하지 않은) 단계로, 한 모듈을 고치면 그 내부를 참조하는 모듈도 함께 고쳐야 한다.
- 공통 결합도 — 여러 모듈이 전역 변수 같은 공통 데이터 영역을 함께 쓰는 경우이다.
- 외부 결합도 — 모듈이 외부에 선언된 데이터나 외부 장치·통신 형식을 참조하는 경우이다.
- 자료 결합도 — 필요한 데이터만 매개변수로 주고받는 가장 약한(바람직한) 결합이다.
<정 보>
- Create(s, n): 스택을 위한 크기 n의 비어 있는 배열 s를 생성하고, top의 값을 -1로 지정한다.
- Push(s, e): top을 1 증가시킨 후, s[top]에 요소 e를 할당한다.
- Pop(s): s[top]의 요소를 삭제한 후, top을 1 감소시킨다.
Create(s, 4); Push(s, 'S'); Push(s, 'T'); Pop(s); Push(s, 'R'); Push(s, 'P'); Push(s, 'Q'); Pop(s);




연산 후 스택에는 인덱스 0부터 S, R, P가 남고 top은 2(P의 위치)를 가리킨다.
Create로 top=-1이 된다. Push S로 top=0, Push T로 top=1, Pop으로 T를 삭제한 뒤 top=0이 된다.
Push R로 top=1, Push P로 top=2, Push Q로 top=3, Pop으로 Q를 삭제한 뒤 top=2가 된다.
- 인덱스 0에 P, 2에 S가 있고 top이 2인 상태 — 먼저 넣은 S가 바닥인 인덱스 0에 있어야 하므로 틀리다.
- 인덱스 0부터 S, R, P이고 top이 빈 인덱스 3을 가리키는 상태 — Pop은 삭제 후 top을 1 감소시키므로 top은 마지막 요소 P의 인덱스 2여야 한다.
- 인덱스 0에 P, 2에 S가 있고 top이 3인 상태 — 요소 순서와 top 위치가 모두 틀렸다.
| 버킷 번호 | 0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 |
|---|---|---|---|---|---|---|---|---|---|---|---|
| 슬롯 |
입력키 23은 버킷 4에 저장된다.
h(k)=k mod 11로 차례로 넣으면 12→1, 33→0, 13→2에 저장된다. 55는 55 mod 11=0인데 0이 차 있어 선형 조사로 1, 2를 지나 3에 저장된다.
23은 23 mod 11=1인데 1, 2, 3이 모두 차 있으므로 다음 빈 버킷인 4에 저장된다.
class Student:
def __init__(self, id, kor, eng):
self.id = id
self.kor = kor
self.eng = eng
def sum(self):
return self.kor + self.eng
def avg(self):
return (가)
std = [
Student("ok", 90, 100),
Student("pk", 80, 90),
Student("rk", 80, 80)
]
for to in (나):
print((다))| (가) | (나) | (다) | |
|---|---|---|---|
| ① | self.sum() / 2 | std | to.id, to.avg() |
| ② | self.sum() / 2 | Student | Student.id, Student.avg() |
| ③ | sum(self) / 2 | std | to.id, to.avg(self) |
| ④ | sum(self) / 2 | Student | Student.id, Student.avg(self) |
(가) self.sum() / 2, (나) std, (다) to.id, to.avg()로 연결해야 한다.
메서드 안에서 같은 객체의 메서드는 self.sum()으로 호출하고, 반복문은 객체 리스트 std를 순회하며 각 객체 to의 id와 avg()를 출력해야 한다. 메서드를 호출할 때 self는 자동으로 전달되므로 인자로 넘기지 않는다.
- self.sum() / 2, Student, Student.id·Student.avg() 연결 — 클래스 Student 자체는 순회할 수 없고 id도 인스턴스 속성이라 클래스에서 읽을 수 없다.
- sum(self) / 2, std, to.id·to.avg(self) 연결 — sum(self)는 메서드가 아닌 내장 함수 sum에 객체를 넘겨 오류가 나고, 반복문의 self는 정의되지 않은 이름이다.
- sum(self) / 2, Student, Student.id·Student.avg(self) 연결 — 위 두 연결의 문제를 모두 가진다.
옳은 것은 2단계 로킹 규약은 직렬 가능성을 보장하지만 교착상태가 발생할 수 있다는 설명이다.
2단계 로킹은 잠금을 얻는 확장 단계와 해제하는 축소 단계를 나누어 직렬 가능성을 보장하지만, 서로 상대의 잠금을 기다리는 교착상태는 막지 못한다.
- 공용(shared) lock을 건 트랜잭션은 read만 할 수 있고, read와 write를 모두 하려면 전용(exclusive) lock이 필요하다.
- 일관성 없는 상태의 데이터를 읽어 모순된 결과가 생기는 것은 연쇄 복귀가 아니라 모순성(불일치) 문제이다.
- 장애로 rollback한 트랜잭션이 변경한 데이터를 읽은 다른 트랜잭션까지 rollback해야 하는 것은 갱신 분실이 아니라 연쇄 복귀이다.
#include <stdio.h>
int recursive(int n) {
int sum;
if (n > 2) {
sum = recursive(n-1) + recursive(n-2);
printf("%d ", sum);
}
else
sum = n;
return sum;
}
int main(void) {
int result;
result = recursive(5);
printf("%d", result);
return 0;
}출력 결과는 3 5 3 8 8이다.
n>2일 때만 두 호출의 합을 구해 출력하고, n이 2 이하이면 n을 그대로 반환한다.
recursive(5)는 recursive(4)를 먼저 호출하고, recursive(4) 안의 recursive(3)=2+1=3을 출력한 뒤 recursive(4)=3+2=5를 출력한다.
이어서 recursive(5)의 두 번째 항 recursive(3)=3을 다시 출력하고 recursive(5)=5+3=8을 출력한다.
main에서 반환값 8을 한 번 더 출력하므로 전체 출력은 3 5 3 8 8이 된다.