문제의 중요한 특징만 남기고 불필요한 세부를 제거해 간결하게 재정의하는 과정은 추상화이다.
컴퓨팅 사고는 분해·패턴 인식·추상화·알고리즘의 네 요소로 설명되며, 핵심만 뽑아 모델로 단순화하는 단계가 추상화에 해당한다.
- 분해: 복잡한 문제를 작고 다루기 쉬운 하위 문제로 나누는 과정이다.
- 패턴 인식: 문제 안이나 문제들 사이에서 반복되는 유사성·규칙을 찾는 과정이다.
- 알고리즘: 문제를 해결하는 단계적 절차를 설계하는 과정이다.
고급 언어 프로그램을 한꺼번에 번역한 뒤 실행하는 것은 컴파일러 방식이므로, 이를 인터프리터 방식이라 한 설명이 옳지 않다.
인터프리터는 원시 프로그램을 한 줄(문장) 단위로 번역하면서 곧바로 실행하며, 목적 프로그램을 따로 만들지 않는다.
- 소프트웨어는 하드웨어에 대응하는 개념으로, 컴퓨터를 원하는 대로 동작시키는 논리적 바탕이다.
- 운영체제처럼 컴퓨터 시스템을 가동·관리하는 소프트웨어는 시스템 소프트웨어이다.
- 문서 작성·게임처럼 특정 업무를 처리하는 소프트웨어는 응용 소프트웨어이다.
프로그램 실행 시간은 10초이다.
CPU 실행 시간 = 명령어 수 × CPI ÷ 클록 속도
분자 사이클을 초당 사이클로 나누면 로, 클록 사이클 총수 ÷ 클록 속도가 실행 시간이 된다.
-35의 8비트 2의 보수 표현은 11011101이다.
35를 2진수로 쓰면 00100011이다.
모든 비트를 반전(1의 보수)하면 11011100이다.
여기에 1을 더하면 11011101이 된다.
- 11011100은 1을 더하기 전 값, 즉 35의 1의 보수이다.
- 11101100은 2의 보수로 해석하면 -20이므로 -35가 아니다.
- 11101101은 2의 보수로 해석하면 -19이므로 -35가 아니다.
| 계층 | 데이터 단위 |
|---|---|
| 트랜스포트(Transport) 계층 | ( ㉠ ) |
| 네트워크(Network) 계층 | ( ㉡ ) |
| 데이터링크(Datalink) 계층 | ( ㉢ ) |
| 물리(Physical) 계층 | 비트 |
| ㉠ | ㉡ | ㉢ | |
|---|---|---|---|
| ① | 세그먼트 | 프레임 | 패킷 |
| ② | 패킷 | 세그먼트 | 프레임 |
| ③ | 세그먼트 | 패킷 | 프레임 |
| ④ | 패킷 | 프레임 | 세그먼트 |
㉠ 트랜스포트 계층은 세그먼트, ㉡ 네트워크 계층은 패킷, ㉢ 데이터링크 계층은 프레임이다.
캡슐화가 진행되며 상위 데이터에 TCP 헤더가 붙으면 세그먼트, IP 헤더가 붙으면 패킷, 데이터링크 헤더·트레일러가 붙으면 프레임이 되고 물리 계층에서 비트로 전송된다.
- 세그먼트·프레임·패킷 조합은 네트워크 계층과 데이터링크 계층의 단위가 서로 뒤바뀌었다.
- 패킷·세그먼트·프레임 조합은 트랜스포트 계층과 네트워크 계층의 단위가 뒤바뀌었다.
- 패킷·프레임·세그먼트 조합은 세 계층 모두 단위가 맞지 않는다.
| 최대 높이 | 최소 높이 | |
|---|---|---|
| ① | 299 | 8 |
| ② | 299 | 9 |
| ③ | 300 | 8 |
| ④ | 300 | 9 |
노드 300개로 만들 수 있는 이진 트리의 최대 높이는 300, 최소 높이는 9이다.
최대 높이: 모든 노드가 한쪽 자식으로만 이어진 편향 트리이면 노드마다 한 층씩 차지하므로 높이 300이다.
최소 높이: 높이 h인 포화 이진 트리의 노드 수는 이다. 이므로 h = 9가 필요하다.
- 최대 299·최소 8: 편향 트리의 높이는 노드 수와 같은 300이고, 높이 8로는 최대 255개 노드만 담을 수 있어 둘 다 틀리다.
- 최대 299·최소 9: 최소 높이는 맞지만, 편향 트리의 최대 높이는 299가 아니라 300이다.
- 최대 300·최소 8: 최대 높이는 맞지만, 높이 8의 이진 트리는 최대 255개 노드만 담을 수 있어 300개를 수용하지 못한다.
(11:50, 12:30), (9:00, 12:00), (13:00, 14:30),
(14:40, 15:00), (14:50, 16:00), (15:40, 16:20),
(16:10, 18:00)
각 방법을 적용해 보면 회의 시간이 긴 요청부터 확정할 때 사용 시간이 450분으로 가장 많다.
긴 순서로 9:00~12:00(180분), 16:10~18:00(110분), 13:00~14:30(90분), 14:50~16:00(70분)을 확정하고, 남은 요청은 모두 겹치므로 합계 450분이다.
- 시작 시각이 빠른 순: 9:00~12:00, 13:00~14:30, 14:40~15:00, 15:40~16:20이 확정되어 330분이다.
- 종료 시각이 빠른 순: 같은 네 회의가 확정되어 330분이다(회의 개수는 최대이나 시간 합은 아니다).
- 요청 순서대로: 11:50~12:30, 13:00~14:30, 14:40~15:00, 15:40~16:20이 확정되어 190분이다.
<제품 테이블>
| 제품ID | 제품이름 | 단가 | 제조업체 |
|---|---|---|---|
| P001 | 나사못 | 100 | A |
| P010 | 망치 | 1,000 | B |
| P011 | 드라이버 | 3,000 | B |
| P020 | 망치 | 1,500 | C |
| P021 | 장갑 | 800 | C |
| P022 | 너트 | 200 | C |
| P030 | 드라이버 | 4,000 | D |
| P031 | 절연테이프 | 500 | D |
<SQL 명령> SELECT 제조업체, MAX(단가) AS 최고단가 FROM 제품 GROUP BY ( ㉠ ) HAVING COUNT(*) > ( ㉡ );
<실행 결과>
| 제조업체 | 최고단가 |
|---|---|
| B | 3,000 |
| C | 1,500 |
| D | 4,000 |
| ㉠ | ㉡ | |
|---|---|---|
| ① | 제조업체 | 1 |
| ② | 제조업체 | 2 |
| ③ | 단가 | 1 |
| ④ | 단가 | 2 |
㉠에는 제조업체, ㉡에는 1이 들어간다.
결과가 제조업체별 최고단가이므로 제조업체로 그룹화해야 한다. 업체별 제품 수는 A 1개, B 2개, C 3개, D 2개이고, 결과에 A만 빠졌으므로 HAVING 조건은 COUNT(*) > 1이다.
- 제조업체·2 조합: 제품이 2개를 초과하는 C만 남아 결과와 다르다.
- 단가·1 조합: 단가가 모두 달라 단가별 그룹은 각각 1건이므로 COUNT(*) > 1을 만족하는 그룹이 없고, SELECT의 제조업체도 그룹 기준이 아니다.
- 단가·2 조합: 마찬가지로 단가별 그룹이 모두 1건이라 조건을 만족하는 그룹이 없어 결과와 다르다.
D, C, B, A 순으로 입력될 때 BDCA는 출력될 수 없다.
B를 먼저 출력하려면 D, C, B를 차례로 PUSH한 뒤 B를 POP해야 하고, 이때 스택 top에는 C가 있다. 따라서 다음 출력은 C나 새로 넣는 A여야 하며 C 아래 묻힌 D가 먼저 나올 수 없다.
- ABCD: 네 문자를 모두 PUSH한 뒤 연속으로 POP하면 A, B, C, D 순으로 나온다.
- CDBA: D, C를 PUSH하고 C, D를 POP한 뒤, B와 A를 각각 PUSH 직후 POP하면 된다.
- DCBA: 각 문자를 PUSH하자마자 POP하면 입력 순서 그대로 나온다.
한 프로세스가 임계구역에 있으면 다른 프로세스가 들어갈 수 없게 하는 조건은 상호 배제이므로 이 설명이 옳다.
임계구역 문제의 해결 조건은 상호 배제, 진행(Progress), 한정 대기(Bounded Waiting)의 세 가지이다.
- 진입하려는 프로세스가 무한대기에 빠지지 않게 하는 조건은 한정 대기이며, 진행의 융통성이라 한 것은 틀리다.
- 임계구역은 공유자원에 접근하는 코드 부분으로, 여러 프로세스가 동시에 접근해 변경하지 못하도록 보호해야 하는 영역이다.
- 임계구역 밖의 프로세스가 다른 프로세스의 진입을 방해하지 않게 하는 조건은 진행이며, 한정 대기가 아니다.
연쇄식(Threads) 통합은 핵심 기능 흐름을 먼저 연결하므로 초기에 시스템 골격을 파악할 수 있다. 따라서 파악하기 어렵다는 설명이 옳지 않다.
연쇄식 통합은 특정 기능을 수행하는 모듈들의 실행 경로(스레드)를 단위로 통합해 나가는 방식으로, 중요한 기능이 일찍 동작하는 형태로 드러난다.
- 빅뱅 통합은 모든 모듈을 한 번에 결합해 테스트한다.
- 상향식 통합은 최하위 모듈부터 결합하며 드라이버를 사용한다.
- 하향식 통합은 제어 구조의 최상위 모듈부터 결합하며 스텁을 사용한다.
ㄱ. 변수 선언 시 변수명 앞에 데이터형을 지정해야 한다.
ㄴ. 플랫폼에 독립적인 대화식 언어이다.
ㄷ. 클래스를 정의하여 객체 인스턴스를 생성할 수 있다.
파이썬에 대한 설명으로 옳은 것은 ㄴ, ㄷ이다.
파이썬은 동적 타이핑 언어로, 변수에 값을 대입할 때 자료형이 결정되므로 변수명 앞에 데이터형을 지정하지 않는다.
- ㄱ: 자료형 선언이 필요한 것은 C·Java 같은 정적 타이핑 언어이므로 틀리다.
- ㄴ: 인터프리터 기반의 대화식 언어이며 여러 운영체제에서 동일하게 실행되는 플랫폼 독립적 언어이다.
- ㄷ: 객체지향을 지원하여 class로 클래스를 정의하고 인스턴스를 생성할 수 있다.
해쉬 탐색은 충돌이 몰리면 최악의 경우 O(n)까지 느려지므로, 최악에도 이진 탐색보다 빠르다는 설명이 옳지 않다.
모든 키가 같은 버킷에 충돌하면 체인이나 탐사 순서를 끝까지 훑어야 하지만, 이진 탐색은 최악에도 O(log n)이 보장된다.
- 체이닝은 같은 주소로 충돌한 항목을 연결리스트로 이어 저장하므로 연결리스트가 적합하다.
- 충돌이 전혀 없으면 해쉬 함수 계산 한 번으로 위치를 찾으므로 O(1)이다.
- 해쉬 함수는 임의 길이의 입력을 받아 정해진 범위의 값으로 사상한다.
힙은 동적 메모리 할당 영역이며 주소가 커지는 방향으로 자란다는 설명이 옳다.
C 프로그램의 메모리는 코드·데이터·힙·스택으로 나뉘며, 힙은 낮은 주소에서 위로, 스택은 높은 주소에서 아래로 자라는 것이 일반적인 배치이다.
- 지역변수와 복귀 주소는 데이터 세그먼트가 아니라 스택에 저장된다.
- 전역변수는 스택이 아니라 데이터 세그먼트에 저장된다.
- main 함수의 지역변수도 스택에 저장되며, 코드 세그먼트에는 실행할 명령어만 들어간다.

그림에서 ㉣은 실행 → 대기 전이인데, 작업 완료나 실행 중단은 실행 → 종료 전이의 예이므로 이 설명이 적절하지 않다.
실행에서 대기로 가는 전이는 입출력 요청 등 이벤트를 기다려야 할 때 일어난다. 그림에는 실행에서 종료로 가는 별도의 화살표가 있다.
- ㉠(대기 → 준비): 기다리던 이벤트가 발생하면 준비 상태로 돌아간다(wake up).
- ㉡(준비 → 실행): 스케줄러가 준비 상태의 프로세스 하나를 선택해 처리기를 할당한다(dispatch).
- ㉢(실행 → 준비): 할당된 시간 할당량을 모두 쓰면 처리기를 빼앗기고 준비 상태로 간다(timeout).
-30.25×의 IEEE 754 단정도 표현은 BDF20000이다.
30.25 = = 이므로 전체 값은 이다.
부호 비트는 음수라 1, 지수는 바이어스 127을 더해 = 01111011이다.
가수부는 소수점 이하 111001 뒤를 0으로 채운다.
비트열 1 01111011 11100100…0을 4비트씩 묶으면 1011 1101 1111 0010 0000 … 이 되어 16진수 BDF20000이다.
- 5DF30000은 부호 비트가 0인 양수여서 맞지 않는다.
- 9ED40000은 지수 비트가 00111101(61)로 계산 결과 123과 다르다.
- C8F40000은 지수 비트가 10010001(145)로 계산 결과 123과 다르다.
#include <stdio.h>
int main()
{
int score = 85;
char grade;
if (score >= 90) grade='A';
if (score >= 80) grade='B';
if (score >= 70) grade='C';
if (score < 70) grade='F';
printf("학점 : %c\n", grade);
return 0;
}출력 결과는 학점 : C이다.
if 문들이 else 없이 독립적으로 모두 검사되므로, 조건이 참인 마지막 대입이 grade를 덮어쓴다.
- score >= 90: 85이므로 거짓, 대입 없음.
- score >= 80: 참, grade = 'B'.
- score >= 70: 참, grade = 'C'로 덮어씀.
- score < 70: 거짓, 대입 없음 → 최종 grade는 'C'.
- 하드웨어 자원의 부족 때문에 명령어를 적절한 클록 사이클에 실행할 수 있도록 지원하지 못할 때 ( ㉠ ) 해저드가 발생한다.
- 실행할 명령어를 적절한 클록 사이클에 가져오지 못할 때 ( ㉡ ) 해저드가 발생한다.
| ㉠ | ㉡ | |
|---|---|---|
| ① | 구조적 | 제어 |
| ② | 구조적 | 데이터 |
| ③ | 데이터 | 구조적 |
| ④ | 데이터 | 제어 |
㉠은 구조적 해저드, ㉡은 제어 해저드이다.
하드웨어 자원(메모리 포트·연산기 등)이 부족해 여러 명령어가 같은 자원을 동시에 쓰지 못하면 구조적 해저드, 분기 결과가 나오기 전이라 다음에 실행할 명령어를 제때 가져오지 못하면 제어 해저드이다.
- 구조적·데이터 조합: 데이터 해저드는 앞 명령어의 결과가 아직 준비되지 않아 뒤 명령어가 그 값을 쓰지 못할 때 생기므로 명령어를 가져오지 못하는 ㉡에 맞지 않는다.
- 데이터·구조적 조합: 자원 부족은 구조적 해저드, 명령어 인출 실패는 제어 해저드이므로 둘이 뒤바뀌었다.
- 데이터·제어 조합: ㉡은 맞지만 자원 부족으로 생기는 ㉠은 데이터 해저드가 아니라 구조적 해저드이다.
입력
| 1 | 1 | 0 | 0 |
| 1 | 1 | 1 | 1 |
| 0 | 1 | 0 | 0 |
| 1 | 1 | 0 | 1 |
필터
| 1 | 0 | 0 |
| 0 | 1 | 1 |
| 1 | 1 | 1 |
특징 맵
| ( ㉠ ) | |
특징 맵 ㉠의 값은 4이다.
4×4 입력에 3×3 필터를 보폭 1로 적용하면 2×2 특징 맵이 되고, ㉠은 입력의 좌상단 3×3 영역과 필터의 같은 위치 원소끼리 곱해 더한 값이다.
1행: 1×1 + 1×0 + 0×0 = 1
2행: 1×0 + 1×1 + 1×1 = 2
3행: 0×1 + 1×1 + 0×1 = 1
합계: 1 + 2 + 1 = 4
<패리티 비트 생성 규칙>
| 원본 데이터 | d4 | d3 | d2 | d1 | |||
|---|---|---|---|---|---|---|---|
| 인코딩된 데이터 | d4 | d3 | d2 | p4 | d1 | p2 | p1 |
p1 = (d1 + d2 + d4) mod 2
p2 = (d1 + d3 + d4) mod 2
p4 = (d2 + d3 + d4) mod 2
<인코딩 예>
| 원본 데이터 | 0 | 0 | 1 | 1 | |||
|---|---|---|---|---|---|---|---|
| 인코딩된 데이터 | 0 | 0 | 1 | 1 | 1 | 1 | 0 |
수신 데이터 0010001은 p4 한 비트의 오류로 판정되어 수정 후 데이터 0010으로 복호되므로 이 설명이 옳다.
수신 비트를 d4=0, d3=0, d2=1, p4=0, d1=0, p2=0, p1=1로 읽고 각 검사식을 다시 계산한다.
p1 검사: 1+0+1+0 = 0(짝수, 정상)
p2 검사: 0+0+0+0 = 0(정상)
p4 검사: 0+1+0+0 = 1(오류)
신드롬 100은 위치 4, 곧 p4를 가리키므로 데이터 비트는 그대로 0010이다.
- 인코딩 예 0011에서 p1 = (1+1+0) mod 2 = 0처럼 1의 개수를 짝수로 맞추므로 홀수가 아닌 짝수 패리티이다.
- 원본 0100은 p1 = 0, p2 = 1, p4 = 1이 되어 0101010으로 인코딩되며 0101110이 아니다.
- 해밍 코드는 패리티 비트를 포함한 어느 위치의 1비트 오류든 신드롬으로 위치를 찾아 정정할 수 있다.