본문으로 건너뛰기

3과목 모의 문제

정보처리기사 목차IP와 전송문제 22개

19~27단원 가운데 21단원을 뺀 여덟 단원(46레슨)을 섞은 20문제로, 시험의 3과목과 같은 필기 꼴입니다. 30분 안에 풀어 보세요. 시험에서는 과목마다 20문제 가운데 8문제 이상 맞혀야 합니다. 8문제보다 적게 맞혔다면 틀린 문제의 레슨부터 다시 보세요. 문제가 어느 레슨인지는 정답을 펼치면 보입니다. 하루 이상 지나 다시 풀면 더 오래 남습니다. 다만 두 번째 점수에는 문제를 기억해서 오른 몫이 섞여 있습니다.

끝의 21·22번은 21단원 '알고리즘'의 덤입니다. 알고리즘은 시험에서는 1과목 문제로 나와, 20문제 셈에 넣지 않습니다.

코드의 출력은 C는 clang, Java는 OpenJDK 25, Python은 3.15로 돌린 결과이고, Java의 main 머리와 문제 3의 f 머리는 폰 화면에 맞추려고 두 줄로 썼습니다. 스케줄링과 페이지 교체 문제는 종이에 간트 차트나 프레임 표를 그려 가며 풀어 보세요.

문제 1

다음 코드가 찍는 값을 고르세요.

#include <stdio.h>

int main(void) {
  int n, t = 0;
  for (n = 2; n < 20; n += 2) {
    t += n;
    if (t > 12) break;
  }
  printf("%d %d\n", n, t);
  return 0;
}
  • ① 6 12
  • ② 8 20
  • ③ 10 20
  • ④ 20 90
정답

② — 실행 결과는 이렇습니다.

실행 결과
8 20

t는 바퀴마다 2, 6, 12, 20으로 늘고, n이 8인 바퀴에서 20이 되어 t > 12가 처음 참이 됩니다. break로 끝나면 한 바퀴 뒤 칸 n += 2도 조건도 거치지 않으므로, n은 break를 만난 바퀴의 값 8에 남습니다.

  • ① t > 12를 t >= 12처럼 읽어, t가 12인 셋째 바퀴에서 멈췄습니다. 12는 12보다 크지 않아 한 바퀴 더 돕니다.
  • ③ break 뒤에도 n += 2가 한 번 실행된다고 봤습니다. 그것은 continue 다음의 흐름이고, break는 한 바퀴 뒤 칸을 거치지 않습니다.
  • ④ break를 이번 바퀴의 남은 문장만 건너뛰는 continue처럼 읽어, n이 20이 될 때까지 다 돌았다고 봤습니다. break는 반복 전체를 바로 끝냅니다.

다시 볼 레슨: 반복문과 추적 표

문제 2

C에서 두 배열을 다음과 같이 만들었습니다.

int p[6] = {4, 9, 1};
int q[] = {3, 8, 6, 2};

(가) p[4]의 값과 (나) q의 마지막 인덱스로 알맞은 것을 고르세요.

  • ① (가) 0 · (나) 3
  • ② (가) 0 · (나) 4
  • ③ (가) 정해지지 않음 · (나) 3
  • ④ (가) 정해지지 않음 · (나) 4
정답

① — 크기보다 값을 적게 주면 앞 칸부터 채우고 모자란 칸은 0이라, p는 4, 9, 1, 0, 0, 0이고 p[4]는 0입니다. 크기를 비우면 준 값의 개수가 크기라 q의 크기는 4이고, 인덱스는 0부터라 마지막 인덱스는 4 − 1 = 3입니다.

  • ② 크기 4를 마지막 인덱스로 봤습니다. 크기가 n이면 인덱스는 0부터 n − 1까지입니다.
  • ③ 값을 주지 않은 p[4]를 배열 밖 칸처럼 정해지지 않는다고 봤습니다. 크기 6 안의 칸이고, 값을 일부만 주면 남은 칸은 0이 됩니다.
  • ④ 두 오해가 겹쳤습니다. p[4]는 0으로 채운 칸이고, q의 마지막 인덱스는 크기 4에서 1을 뺀 3입니다.

다시 볼 레슨: 배열

문제 3

다음 Java 코드가 찍는 값을 고르세요.

public class Main {
  static void f(
      int[] v, int k) {
    v[0] += k;
    k = k - 1;
  }
  public static void main(
      String[] args) {
    int[] a = {4, 6};
    int k = 3;
    f(a, k);
    f(a, k);
    System.out.print(a[0] + k);
  }
}
  • ① 5
  • ② 7
  • ③ 10
  • ④ 13
정답

④ — 실행 결과는 이렇습니다.

실행 결과
13

Java에서 배열을 넘기면 f가 바꾼 칸이 부른 쪽 배열에 남아, v[0] += k는 main의 a[0]을 바꿉니다. int를 넘기면 f는 부른 쪽 변수를 바꾸지 못해, f 안에서 k를 줄여도 main의 k는 3 그대로입니다. 두 번 불러 a[0]은 4 + 3 + 3 = 10이 되고, 10 + 3 = 13을 찍습니다.

  • ① 거꾸로 봤습니다 — 배열은 바뀌지 않고 k만 줄어 남는다고 보면 a[0]은 4, k는 1이라 4 + 1입니다. 남는 쪽은 배열의 칸이고, int는 남지 않습니다.
  • ② 배열도 바뀌지 않는다고 봤습니다. 그러면 a[0]은 4 그대로라 4 + 3입니다. 배열을 넘기면 바꾼 칸이 부른 쪽에 남습니다.
  • ③ int k도 부른 쪽에서 바뀐다고 봤습니다. 그러면 k가 3, 2, 1로 줄어 a[0]은 4 + 3 + 2 = 9이고 9 + 1 = 10입니다. f 안의 k는 main의 k와 따로라 main의 k는 바뀌지 않습니다.

다시 볼 레슨: 함수 호출과 값·참조 전달

문제 4

다음 가운데 나타내는 값이 가장 큰 것을 고르세요.

  • ① 2진수 101111
  • ② 8진수 71
  • ③ 10진수 58
  • ④ 16진수 3B
정답

④ — 자리 값을 곱해 더해 모두 10진수로 바꿉니다. 101111(2)은 32 + 8 + 4 + 2 + 1 = 47, 71(8)은 7 × 8 + 1 = 57, 3B(16)는 3 × 16 + 11 = 59라, 47·57·58·59 가운데 59가 가장 큽니다.

  • ① 자릿수가 가장 많아 가장 큰 수로 봤습니다. 2진수는 왼쪽으로 한 자리 갈 때마다 자리 값이 2배씩만 커져, 여섯 자리라도 47입니다.
  • ② 8진수 71을 10진수 71처럼 읽었습니다. 8진수의 둘째 자리 값은 8이라 7 × 8 + 1 = 57입니다.
  • ③ 16진수 3B의 둘째 자리를 10으로 셈해 3 × 10 + 11 = 41로 봤습니다. 그러면 58이 가장 커 보입니다. 16진수의 둘째 자리 값은 16이라 3B는 59로, 58보다 큽니다.

다시 볼 레슨: 진법 변환

문제 5

8비트 2의 보수로 나타낸 11110110이 나타내는 10진수 값을 고르세요.

  • ① −118
  • ② −10
  • ③ −9
  • ④ 246
정답

② — 맨 왼쪽 비트가 1이라 음수이고, 크기는 다시 뒤집고 1을 더해 읽습니다. 11110110을 뒤집은 00001001에 1을 더하면 00001010, 곧 10이라 −10입니다. 거꾸로 10(00001010)을 뒤집어 11110101에 1을 더하면 11110110이 되어 맞습니다.

  • ① 맨 왼쪽 비트를 부호로만 보고, 나머지 일곱 비트 1110110을 그대로 크기 118로 읽었습니다. 2의 보수에서 음수의 크기는 다시 뒤집고 1을 더해 읽습니다.
  • ③ 뒤집기만 하고 1을 더하지 않았습니다. 뒤집기만 한 것은 1의 보수라 크기가 1 작은 9로 나옵니다.
  • ④ 부호 없이 여덟 비트를 모두 크기로 읽었습니다. 8비트 2의 보수에는 −128부터 127까지만 담겨, 246은 나올 수 없습니다.

다시 볼 레슨: 비트 연산과 2의 보수

문제 6

빈 스택과 빈 큐에 똑같이 다음 차례로 넣고 뺐습니다.

넣기 4 → 넣기 7 → 빼기 → 넣기 2 → 넣기 9 → 빼기

마지막 빼기에서 나오는 값으로 (가) 스택과 (나) 큐를 알맞게 짝지은 것을 고르세요.

  • ① (가) 7 · (나) 7
  • ② (가) 7 · (나) 9
  • ③ (가) 9 · (나) 7
  • ④ (가) 9 · (나) 9
정답

③ — 스택은 나중에 넣은 것이 먼저 나오는 후입선출(LIFO)이라, 첫 빼기에 7이 나가고 남은 4 위에 2·9가 쌓여 마지막 빼기에 9가 나옵니다. 큐는 먼저 넣은 것이 먼저 나오는 선입선출(FIFO)이라, 첫 빼기에 4가 나가고 7·2·9가 줄을 서 마지막 빼기에 7이 나옵니다.

  • ① 스택도 큐처럼 먼저 넣은 것부터 꺼낸다고 봤습니다. 스택은 맨 위, 곧 가장 나중에 넣은 것부터 나옵니다.
  • ② 두 규칙을 바꿔 봤습니다. 스택이 먼저 넣은 것부터, 큐가 나중에 넣은 것부터 꺼낸다고 보면 7과 9가 나옵니다.
  • ④ 큐도 스택처럼 나중에 넣은 것부터 꺼낸다고 봤습니다. 큐는 줄의 맨 앞, 곧 먼저 넣은 것부터 나옵니다.

다시 볼 레슨: 스택과 큐

문제 7

중위 표기식 A * B - (C + D) / E를 전위 표기식으로 바꾼 것을 고르세요.

  • ① + - * A B C / D E
  • ② / - * A B + C D E
  • ③ - * A B / + C D E
  • ④ A B * C D + E / -
정답

③ — 계산하는 차례대로 괄호로 묶으면 ((A * B) - ((C + D) / E))⁠입니다. 괄호마다 연산자를 그 괄호의 왼쪽 밖으로 옮기고 괄호를 지우면 - * A B / + C D E입니다. 맨 앞의 -는 가장 나중에 계산하는 연산자입니다.

  • ① 괄호를 무시하고 A * B - C + D / E로 묶었습니다. 괄호 안의 C + D를 먼저 묶어야 합니다.
  • ② *·/가 +·-보다 먼저라는 우선순위를 무시하고 괄호 밖을 왼쪽부터 차례로 묶었습니다. -보다 (C + D) / E를 먼저 묶습니다.
  • ④ 연산자를 괄호의 오른쪽 밖으로 옮긴 후위 표기식입니다. 전위 표기식은 연산자를 왼쪽 밖으로 옮깁니다.

다시 볼 레슨: 이진 트리 순회와 수식 표기

문제 8

정점이 7개인 무방향 그래프가 있습니다. 같은 두 정점 사이의 간선은 하나뿐이고, 자기 자신으로 가는 간선은 없습니다. 이 그래프에 (가) 둘 수 있는 간선의 최대 개수와 (나) 일곱 정점을 모두 잇는 신장 트리의 간선 개수로 알맞은 것을 고르세요.

  • ① (가) 21 · (나) 6
  • ② (가) 21 · (나) 7
  • ③ (가) 42 · (나) 6
  • ④ (가) 42 · (나) 7
정답

① — 모든 정점 쌍이 이어진 완전 그래프일 때 간선이 가장 많습니다. 정점마다 나머지 6개와 이어지고, 무방향은 한 간선을 양 끝에서 두 번 세게 되니 7 × 6 ÷ 2 = 21개입니다. 신장 트리는 정점을 모두 잇되 사이클이 없어, 정점이 n개면 간선은 n − 1 = 6개입니다.

  • ② 신장 트리의 간선을 정점 수와 같은 7개로 셌습니다. 일곱 정점을 사이클 없이 모두 이으면 간선은 하나 적은 6개입니다.
  • ③ 방향 그래프의 최대 간선 수 n(n − 1)로 셌습니다. 무방향은 같은 간선을 두 번 센 것이라 2로 나눕니다.
  • ④ 두 오해가 겹쳤습니다. 무방향 그래프의 최대 간선 수는 n(n − 1)/2, 신장 트리의 간선 수는 n − 1입니다.

다시 볼 레슨: 그래프와 탐색

문제 9

다음 Python 코드가 찍는 값을 고르세요.

for n in [5, 0]:
    try:
        x = 10 // n
        print('A', end='')
    except ZeroDivisionError:
        print('B', end='')
    else:
        print('C', end='')
    finally:
        print('D', end='')
  • ① ACBD
  • ② ACDBD
  • ③ ACDABD
  • ④ ACDBCD
정답

② — 실행 결과는 이렇습니다.

실행 결과
ACDBD

n이 5일 때는 예외가 없어 A를 찍고, 예외가 나지 않았을 때만 실행되는 else가 C를, finally가 D를 찍습니다. n이 0일 때는 10 // n에서 ZeroDivisionError가 나 그 아래 print를 건너뛰고, except가 B를, finally가 D를 찍습니다. end=''라 다섯 글자가 한 줄에 이어집니다.

  • ① finally가 예외가 날 때만 실행된다고 봤습니다. finally는 예외가 났든 안 났든 마지막에 실행되어, n이 5일 때도 D를 찍습니다.
  • ③ n이 0일 때도 A가 찍힌다고 봤습니다. 10 // n에서 예외가 나는 순간 except로 뛰어, 같은 try 안의 다음 줄은 실행되지 않습니다.
  • ④ else가 예외가 나도 실행된다고 봤습니다. else는 try에서 예외가 나지 않았을 때만 실행되어, n이 0일 때는 건너뜁니다.

다시 볼 레슨: 예외 처리

문제 10

Red Hat 계열 Linux 서버에 웹 서버 Apache를 패키지 관리자로 깔려고 합니다. 알맞은 명령을 고르세요.

  • ① apt install apache2
  • ② apt install httpd
  • ③ yum install apache2
  • ④ yum install httpd
정답

④ — 패키지 관리자는 Linux 계열마다 다릅니다. Debian·Ubuntu는 apt를, Red Hat 계열은 yum을 씁니다. 같은 Apache라도 패키지 이름이 달라, apt로는 apache2를, yum으로는 httpd를 깝니다.

  • ① Debian·Ubuntu에서 Apache를 까는 명령을 골랐습니다. Red Hat 계열은 apt가 아니라 yum을 씁니다.
  • ② 패키지 이름만 Red Hat 계열 것으로 맞추고 관리자는 apt를 골랐습니다. httpd를 쓰는 Red Hat 계열은 yum으로 깝니다.
  • ③ 관리자는 맞지만 패키지 이름을 Debian 계열 것으로 썼습니다. Red Hat 계열에서 Apache의 패키지 이름은 httpd입니다.

다시 볼 레슨: 개발환경 구축

문제 11

다음 가운데 이벤트 배치에 해당하는 것을 고르세요.

  • ① 저장 공간이 90%를 넘는 순간 오래된 로그를 한꺼번에 옮긴다
  • ② 매달 1일 0시에 지난달 요금을 회원마다 한꺼번에 계산한다
  • ③ 담당자가 실행을 누를 때 쌓인 설문 응답을 한꺼번에 집계한다
  • ④ 회원이 결제할 때마다 그 한 건을 곧바로 승인해 결과를 보인다
정답

① — 이벤트 배치는 미리 정한 조건이 맞는 순간에 깨어나, 쌓인 것을 사람 없이 한꺼번에 처리합니다. '저장 공간이 90%를 넘는다'는 조건이 깨우므로 이벤트 배치입니다.

  • ② 한꺼번에 처리하면 모두 이벤트 배치로 봤습니다. 매달 1일 0시처럼 정한 때가 되면 도는 것은 정기 배치입니다.
  • ③ 실행을 누르는 일을 이벤트로 봤습니다. 사람이 요청해 깨우는 것은 온디맨드 배치이고, 깨운 뒤에는 사람 없이 끝까지 돌아갑니다.
  • ④ 결제라는 일이 생길 때마다 도니 이벤트 배치로 봤습니다. 요청마다 한 건씩 바로 처리하는 것은 배치가 아니라 온라인 처리입니다.

다시 볼 레슨: 배치 프로그램

문제 12

프로세스 넷이 다음과 같이 도착합니다.

프로세스도착 시각실행 시간
P05
Q12
R23
S41

비선점 SJF로 스케줄링할 때 평균 대기 시간으로 알맞은 것을 고르세요.

  • ① 2
  • ② 3
  • ③ 3.75
  • ④ 4.75
정답

② — 시각 0에는 P뿐이라 P(0~5)가 돌고, 비선점이라 Q·R·S가 와도 P가 끝날 때까지 CPU를 쥡니다. 시각 5에는 Q(2)·R(3)·S(1)가 기다려 가장 짧은 S(5~6), 다음 Q(6~8), 마지막 R(8~11) 차례입니다.

프로세스시작 시각대기 시간
P00 − 0 = 0
S55 − 4 = 1
Q66 − 1 = 5
R88 − 2 = 6

(0 + 1 + 5 + 6) ÷ 4 = 3입니다.

  • ① 선점 SRT로 셌습니다. 비선점에서는 P가 CPU를 잡으면 더 짧은 Q·R·S가 와도 빼앗기지 않습니다.
  • ③ 도착순으로 고르는 FCFS로 셌습니다(Q 5~7, R 7~10, S 10~11). SJF는 기다리는 것 가운데 실행 시간이 짧은 것부터 고릅니다.
  • ④ 시작 시각 0·5·6·8을 그대로 평균 냈습니다. 대기 시간은 시작 시각에서 도착 시각을 뺀 값입니다.

다시 볼 레슨: CPU 스케줄링: 비선점

문제 13

12번과 같은 네 프로세스입니다.

프로세스도착 시각실행 시간
P05
Q12
R23
S41

SRT로 스케줄링할 때 평균 대기 시간으로 알맞은 것을 고르세요.

  • ① 2
  • ② 3
  • ③ 3.75
  • ④ 4.75
정답

① — SRT는 새 프로세스가 올 때마다 돌던 프로세스의 남은 시간과 견줘, 남은 실행 시간이 가장 짧은 것에 CPU를 줍니다. 시각 1에 Q(2)가 오면 P의 남은 4보다 짧아 Q가 CPU를 빼앗고, 시각 2에 R(3)이 와도 Q의 남은 1이 짧아 Q(1~3)가 마저 돕니다. 시각 3에는 P의 남은 4보다 짧은 R이 돌다가, 시각 4에 S(1)가 오면 R의 남은 2보다 짧아 S(4~5)가 돕니다. 이어 R(5~7), 마지막에 P가 남은 4를 돕니다(7~11).

프로세스반환 시간대기 시간
Q3 − 1 = 22 − 2 = 0
S5 − 4 = 11 − 1 = 0
R7 − 2 = 55 − 3 = 2
P11 − 0 = 1111 − 5 = 6

선점이 있으면 한 프로세스가 나눠 돌아, 대기 시간은 반환 시간 − 실행 시간으로 셉니다. (0 + 0 + 2 + 6) ÷ 4 = 2입니다.

  • ② 비선점 SJF로 셌습니다. SRT는 P가 도는 중이라도 남은 시간이 더 짧은 프로세스가 오면 CPU를 빼앗아 줍니다.
  • ③ 도착순인 FCFS로 셌습니다. SRT는 도착 차례가 아니라 남은 실행 시간으로 고릅니다.
  • ④ 평균 반환 시간 (2 + 1 + 5 + 11) ÷ 4 = 4.75를 셌습니다. 대기 시간은 반환 시간에서 실행 시간을 한 번 더 뺀 값입니다.

다시 볼 레슨: CPU 스케줄링: 선점

문제 14

페이지 프레임이 3개이고 처음에는 비어 있습니다. 페이지를 다음 차례로 참조합니다.

1 5 4 3 1 5 3 1 3 4 3 1

FIFO로 교체할 때 페이지 부재는 모두 몇 번인지 고르세요.

  • ① 5
  • ② 6
  • ③ 7
  • ④ 9
정답

④ — 처음 1·5·4는 빈 프레임에 들어오며 부재입니다. FIFO는 가장 먼저 들어온 페이지를 내보내므로, 3이 1을, 1이 5를, 5가 4를 내보내며 부재가 셋 더 나고 프레임은 3·1·5가 됩니다. 다음 3·1·3은 프레임에 있어 부재가 아닙니다. 이어 4가 3을, 3이 1을, 1이 5를 내보내 부재가 셋 더 나서 모두 9번입니다.

  • ① 앞으로 가장 오랫동안 쓰이지 않을 페이지를 내보내는 OPT로 셌습니다. FIFO는 앞으로의 참조도, 최근에 쓴 때도 보지 않고 들어온 차례만 봅니다.
  • ② 처음 세 번은 빈 프레임을 채운 것이라 부재로 세지 않았습니다. 빈 프레임에 처음 들어오는 것도 부재로 셉니다.
  • ③ 가장 오래전에 쓴 페이지를 내보내는 LRU로 셌습니다. FIFO는 7·9번째에 3을 다시 썼어도, 가장 먼저 들어왔으니 10번째에 3을 내보냅니다.

다시 볼 레슨: 페이지 교체 알고리즘

문제 15

14번과 같은 참조열입니다. 페이지 프레임이 3개이고 처음에는 비어 있습니다.

1 5 4 3 1 5 3 1 3 4 3 1

LRU로 교체할 때 페이지 부재는 모두 몇 번인지 고르세요.

  • ① 5
  • ② 6
  • ③ 7
  • ④ 9
정답

③ — 처음 여섯 번은 모두 부재입니다. 빈 프레임을 채운 1·5·4에 이어, 3이 1을, 1이 5를, 5가 4를 내보냅니다. 다음 3·1·3은 프레임에 있습니다. 10번째에 4가 올 때 마지막으로 쓴 때가 3은 9번째, 1은 8번째, 5는 6번째라, 가장 오래전에 쓴 5를 내보냅니다. 남은 3·1은 프레임에 있어 부재는 모두 7번입니다.

  • ① 앞으로 가장 오랫동안 쓰이지 않을 페이지를 내보내는 OPT로 셌습니다. OPT는 앞날을 알아야 해 실제로는 쓰지 못하고, LRU는 지난 참조만 봅니다.
  • ② 가장 최근에 쓴 페이지를 내보낸다고 거꾸로 읽었습니다. LRU(Least Recently Used)는 가장 오래전에 쓴 페이지를 내보냅니다.
  • ④ 들어온 차례로 내보내는 FIFO로 셌습니다. LRU는 들어온 때가 아니라 마지막으로 쓴 때를 봐, 7·9번째에 다시 쓴 3을 10번째에 남겨 둡니다.

다시 볼 레슨: 페이지 교체 알고리즘

문제 16

다음 (가)·(나)에 맞는 셸을 알맞게 짝지은 것을 고르세요.

  • (가) sh로 쓴 스크립트를 고치지 않고 돌리면서, csh에서 쓰던 기능도 함께 쓰고 싶을 때 고르는 셸

  • (나) 대부분의 Linux에서 터미널을 열면 처음 뜨는 셸

  • ① (가) ksh · (나) sh

  • ② (가) ksh · (나) bash

  • ③ (가) csh · (나) sh

  • ④ (가) csh · (나) bash

정답

② — (가)는 ksh(콘 셸)입니다. sh와 호환되며 csh의 기능을 더한 셸이라, sh 스크립트를 그대로 돌리면서 csh의 기능도 씁니다. (나)는 bash(본 어게인 셸)입니다. sh와 호환되고, 대부분의 Linux에서 기본 셸입니다.

  • ① UNIX의 표준 셸인 sh를 Linux의 기본 셸로 봤습니다. sh는 bash·ksh의 바탕이 된 셸이고, 대부분의 Linux에서 기본 셸은 bash입니다.
  • ③ 두 오해가 겹쳤습니다. ksh가 기능을 가져온 csh를 (가)로, UNIX의 표준 셸인 sh를 Linux의 기본 셸로 봤습니다.
  • ④ (가)에 나온 csh를 그대로 골랐습니다. csh(C 셸)의 특징은 C 언어와 닮은 문법입니다. 보기의 (가) 칸에 있는 ksh · csh 가운데 sh와 호환되면서 csh의 기능을 더한 것은 ksh입니다.

다시 볼 레슨: 환경 변수와 셸 스크립트

문제 17

온라인 시험 프로그램이 시험 서버의 프로그램과 대화를 엽니다. 답안을 올리는 동안 다섯 문항마다 표시를 남겨, 중간에 끊겼다 이어지면 처음부터가 아니라 마지막 표시 다음 문항부터 올립니다. 시험이 끝나면 대화를 닫습니다. 이 일을 맡는 OSI 계층을 고르세요.

  • ① 응용 계층
  • ② 표현 계층
  • ③ 세션 계층
  • ④ 전송 계층
정답

③ — 두 프로그램 사이의 대화를 열고 닫으며, 동기점을 두어 끊기면 그 지점부터 다시 잇는 것은 세션 계층(5층)의 일입니다. 다섯 문항마다 남긴 표시가 동기점입니다.

  • ① 시험 프로그램이 하는 일이라 응용 계층으로 봤습니다. 응용 계층은 프로그램이 네트워크를 쓰는 창구이고, 대화를 열고 닫으며 동기점을 두는 일은 세션 계층이 맡습니다.
  • ② 표현 계층과 세션 계층을 바꿔 봤습니다. 표현 계층은 코드 변환·압축·암호화처럼 데이터의 꼴을 바꿉니다.
  • ④ 끊긴 뒤 이어 보내는 일을 전송 계층의 일로 봤습니다. 전송 계층은 포트 번호로 프로그램 사이 끝에서 끝까지 전하며 오류와 흐름을 다루고, 대화에 동기점을 두는 것은 세션 계층입니다.

다시 볼 레슨: OSI 7계층

문제 18

짝수 패리티로 7비트 데이터 1011010에 패리티 비트 하나를 붙여 8비트로 보냅니다. (가) 붙이는 패리티 비트와 (나) 보내는 동안 여덟 비트 가운데 세 비트가 뒤집혔을 때 받는 쪽이 오류를 알아채는지로 알맞은 것을 고르세요.

  • ① (가) 0 · (나) 알아챈다
  • ② (가) 0 · (나) 알아채지 못한다
  • ③ (가) 1 · (나) 알아챈다
  • ④ (가) 1 · (나) 알아채지 못한다
정답

① — 1011010에는 1이 넷이라 이미 짝수입니다. 짝수 패리티는 1의 개수를 짝수로 맞추므로 0을 붙여 10110100을 보냅니다. 비트 하나가 뒤집힐 때마다 1의 개수의 홀짝이 바뀌어, 세 비트가 뒤집히면 1의 개수가 홀수가 되므로 받는 쪽은 오류를 알아챕니다. 패리티 검사는 홀수 개 비트의 오류를 검출합니다.

  • ② 패리티 검사는 한 비트 오류만 검출한다고 봤습니다. 홀수 개가 뒤집히면 몇 개든 1의 개수가 홀수가 되어 알아채고, 놓치는 것은 짝수 개가 함께 뒤집힐 때입니다.
  • ③ 1의 개수를 홀수로 맞추는 홀수 패리티처럼 1을 붙였습니다. 짝수 패리티에서는 1이 이미 넷이라 0을 붙입니다.
  • ④ 두 오해가 겹쳤습니다. 패리티 비트는 0이고, 세 비트처럼 홀수 개가 뒤집히면 알아챕니다.

다시 볼 레슨: 오류 검출과 정정

문제 19

네트워크 10.8.44.0/22를 /25 서브넷으로 똑같이 나눕니다. (가) 만들어지는 서브넷의 개수와 (나) 서브넷 하나에서 호스트에 줄 수 있는 주소의 개수로 알맞은 것을 고르세요.

  • ① (가) 2 · (나) 126
  • ② (가) 2 · (나) 128
  • ③ (가) 8 · (나) 126
  • ④ (가) 8 · (나) 128
정답

③ — /22에서 /25로 경계를 옮기면 호스트 부분에서 25 − 22 = 3비트를 빌려 서브넷이 2³ = 8개 생깁니다. 남는 호스트 비트는 32 − 25 = 7개라 서브넷마다 주소가 2⁷ = 128개이고, 네트워크 주소와 브로드캐스트 주소는 장치에 줄 수 없어 128 − 2 = 126개입니다. 여덟 서브넷은 10.8.44.0/25부터 10.8.47.128/25까지입니다.

  • ① 빌린 비트를 /24부터 셌습니다(25 − 24 = 1비트, 2개). 나누는 네트워크가 /22라 25 − 22 = 3비트를 빌립니다.
  • ② 두 오해가 겹쳤습니다. 빌린 비트를 /24부터 셌고, 호스트 수에서 2도 빼지 않았습니다.
  • ④ 주소 128개를 모두 호스트에 줄 수 있다고 봤습니다. 쓸 수 있는 호스트 수는 2ʰ − 2입니다.

다시 볼 레슨: 서브넷과 CIDR

문제 20

TCP에 대한 설명으로 옳지 않은 것을 고르세요.

  • ① 연결을 맺을 때 SYN, SYN+ACK, ACK가 차례로 세 번 오간다
  • ② 보낸 조각의 확인이 제때 오지 않으면 그 조각을 다시 보낸다
  • ③ 조각이 보낸 차례와 다르게 와도 받는 쪽이 순서 번호로 차례를 맞춘다
  • ④ 한쪽이 FIN을 보내면 그때부터 상대도 데이터를 더 보낼 수 없다
정답

④ — 한쪽의 FIN은 '나는 다 보냈다'는 뜻일 뿐입니다. 끊을 때는 양쪽이 각자 FIN을 보내고 상대가 ACK로 받아 네 번 오가므로(4-way 핸드셰이크), 상대는 보낼 것이 남았으면 마저 보낸 뒤 자기 FIN을 보냅니다.

  • ① 맞습니다. 연결을 맺는 3-way 핸드셰이크의 차례입니다.
  • ② 맞습니다. 확인이 정해진 시간 안에 오지 않으면 그 조각을 다시 보내 신뢰성을 지킵니다.
  • ③ 맞습니다. TCP는 바이트마다 순서 번호를 매겨, 받는 쪽이 조각의 차례를 맞추고 겹친 것은 버립니다.

다시 볼 레슨: TCP와 UDP

문제 21 (시험에서는 1과목)

입력 크기 n이 충분히 클 때, 시간 복잡도를 느리게 자라는 것부터 늘어놓은 것을 고르세요.

  • ① O(n log n), O(n), O(2ⁿ), O(n²)
  • ② O(n log n), O(n), O(n²), O(2ⁿ)
  • ③ O(n), O(n log n), O(n²), O(2ⁿ)
  • ④ O(n), O(n log n), O(2ⁿ), O(n²)
정답

③ — n log n은 n에 log n을 곱한 것이라 n이 2보다 크면 n보다 크고, n²은 n log n보다, 2ⁿ은 n²보다 빨리 자랍니다. n이 64면 n은 64, n log n은 64 × 6 = 384, n²은 4096이고, 2ⁿ은 약 1.8 × 10¹⁹입니다.

  • ① 두 오해가 겹쳤습니다. n log n은 n보다 빨리 자라고, n이 커지면 2ⁿ이 n²을 크게 앞지릅니다.
  • ② log가 붙으면 작아진다고 봐 O(n log n)을 O(n) 앞에 뒀습니다. log n은 n을 2로 몇 번 나눠야 1이 되는지라 n이 2보다 크면 1보다 크고, 그만큼 곱한 n log n은 n보다 큽니다.
  • ④ 작은 n으로 견줬습니다. n이 3이면 2³ = 8이 3² = 9보다 작지만, 시간 복잡도는 n이 충분히 클 때로 견주고, n이 커지면 2ⁿ이 n²을 크게 앞지릅니다.

다시 볼 레슨: 알고리즘과 시간 복잡도

문제 22 (시험에서는 1과목)

6, 5, 2, 7, 3, 1을 오름차순으로 버블 정렬합니다. 한 회전은 이웃한 두 칸을 왼쪽부터 견줘 앞이 크면 맞바꿉니다. 2회전이 끝난 뒤의 줄을 고르세요.

  • ① 1, 2, 5, 7, 3, 6
  • ② 2, 5, 3, 1, 6, 7
  • ③ 2, 5, 6, 7, 3, 1
  • ④ 5, 2, 6, 3, 1, 7
정답

② — 버블 정렬은 이웃한 두 칸을 왼쪽부터 견줘 앞이 크면 맞바꿉니다. 1회전에는 6이 5·2와, 7이 3·1과 차례로 바뀌어 5, 2, 6, 3, 1, 7이 되고 가장 큰 7이 맨 뒤에 섭니다. 2회전에는 5가 2와, 6이 3·1과 바뀌어 2, 5, 3, 1, 6, 7이 되고 6이 끝에서 둘째 자리에 섭니다.

  • ① 가장 작은 값을 골라 맨 앞 칸과 바꾸는 선택 정렬로 2회전을 돌렸습니다. 선택 정렬은 앞이, 버블 정렬은 뒤가 한 칸씩 정해집니다.
  • ③ 값을 하나씩 꺼내 앞쪽 정렬된 줄에 끼우는 삽입 정렬로 2회전을 돌렸습니다. 버블 정렬은 회전마다 이웃끼리 견줘 큰 값을 뒤로 보냅니다.
  • ④ 1회전까지만 돌렸습니다. 2회전은 1회전이 끝난 줄을 한 번 더 왼쪽부터 견줍니다.

다시 볼 레슨: 선택·버블·삽입 정렬

끝까지 내려오면 저절로 표시됩니다. 이 기기에만 저장합니다.

정보처리기사 목차로