정보처리기사 실기 코드·계산 8문제, 스케줄링부터 SQL까지 풀이 포함

정보처리기사 실기는 개념을 아는 것만으로는 점수가 안 나오는 시험입니다. 코드를 눈으로 따라가며 출력값을 맞히고, 스케줄링이나 페이지 교체 같은 계산을 손으로 끝까지 해내야 합니다. 이번 글에서는 그런 유형을 8문제로 묶었습니다.

모든 문제는 학습용으로 직접 만든 예상문제이며 실제 기출 문제가 아닙니다. 코드 출력과 계산 결과는 직접 실행해서 검산했습니다.

이 글의 구성

  • 운영체제 계산: 프로세스 스케줄링, 페이지 교체
  • 자료구조: 이진 탐색 트리 순회
  • 프로그래밍: Python, C, Java 출력 추적
  • 데이터베이스와 소프트웨어 공학: SQL 집계, 순환 복잡도

문제 1. 비선점 SJF 스케줄링 평균 대기시간

다음 프로세스를 FCFS와 비선점 SJF로 각각 처리할 때 평균 대기시간을 구하시오.

프로세스  도착시간  실행시간
P1        0         6
P2        1         3
P3        2         8
P4        3         2

정답: FCFS 6.5, SJF 4.75

대기시간은 시작 시각에서 도착 시각을 뺀 값입니다. FCFS는 도착 순서대로 P1(0~6), P2(6~9), P3(9~17), P4(17~19)가 실행되어 대기시간이 0, 5, 7, 14이고 합 26을 4로 나누면 6.5입니다.

비선점 SJF는 P1이 끝나는 6초 시점에 대기 중인 P2(3), P3(8), P4(2) 가운데 실행시간이 가장 짧은 P4를 고릅니다. 순서는 P1, P4, P2, P3이고 대기시간은 0, 3(P4), 7(P2), 9(P3)이므로 합 19, 평균 4.75입니다.

문제 2. 페이지 교체 FIFO와 LRU 페이지 부재 횟수

프레임이 3개이고 처음에는 모두 비어 있다. 참조 순서가 아래와 같을 때 FIFO와 LRU의 페이지 부재 횟수를 각각 구하시오.

7 0 1 2 0 3 0 4 2 3 0 3 2

정답: FIFO 10회, LRU 9회

FIFO는 가장 먼저 들어온 페이지를 내보냅니다. 부재가 나는 참조는 7, 0, 1, 2, 3, 0, 4, 2, 3, 0 순서로 10번입니다. LRU는 가장 오래 사용하지 않은 페이지를 내보내므로 최근에 쓴 0과 3이 남아 부재가 7, 0, 1, 2, 3, 4, 2, 3, 0 순서로 총 9번에 그칩니다. 시험에서는 프레임 상태를 표로 그려야 실수가 없습니다.

문제 3. 이진 탐색 트리의 순회 결과

빈 이진 탐색 트리에 50, 30, 70, 20, 40, 60, 80, 35를 차례로 삽입했다. 전위, 중위, 후위 순회 결과를 쓰시오.

정답

  • 전위(Preorder): 50 30 20 40 35 70 60 80
  • 중위(Inorder): 20 30 35 40 50 60 70 80
  • 후위(Postorder): 20 35 40 30 60 80 70 50

35는 50보다 작고 30보다 크며 40보다 작으므로 40의 왼쪽 자식이 됩니다. 이진 탐색 트리의 중위 순회는 항상 오름차순이 되므로 검산에 쓰기 좋습니다.

문제 4. Python 슬라이싱과 딕셔너리 출력

a = [1,2,3,4,5,6,7,8,9,10]
print(a[2:8:2], a[::-3], [x*x for x in a if x%3==0])
d = {}
for w in "abracadabra":
    d[w] = d.get(w, 0) + 1
print(d)

정답

[3, 5, 7] [10, 7, 4, 1] [9, 36, 81]
{'a': 5, 'b': 2, 'r': 2, 'c': 1, 'd': 1}

a[2:8:2]는 인덱스 2, 4, 6의 값이고, a[::-3]은 끝에서부터 3칸씩 건너뜁니다. 딕셔너리는 처음 등장한 순서(a, b, r, c, d)대로 키가 들어가며 글자 수를 센 결과가 출력됩니다.

문제 5. C 포인터 연산 출력

#include <stdio.h>
int main(void){
    int arr[5] = {10, 20, 30, 40, 50};
    int *p = arr + 1;
    int sum = 0;
    while (p < arr + 5) {
        sum += *p;
        p += 2;
    }
    printf("%d %ld\n", sum, (long)(p - arr));
    return 0;
}

정답: 60 5

p는 arr[1](20)에서 시작해 arr[3](40)까지 두 번 더해 sum이 60이 됩니다. 이후 p가 arr+5가 되면 조건이 거짓이 되어 반복을 끝내고, 포인터 뺄셈은 요소 개수 단위이므로 p – arr은 5입니다.

문제 6. Java 필드 은닉과 메서드 오버라이딩

class Parent {
    String name = "Parent";
    String who() { return "Parent.who"; }
    static String st() { return "Parent.st"; }
}
class Child extends Parent {
    String name = "Child";
    @Override String who() { return "Child.who"; }
    static String st() { return "Child.st"; }
}
public class Main {
    public static void main(String[] args) {
        Parent p = new Child();
        System.out.println(p.name + " " + p.who() + " " + p.st());
    }
}

정답: Parent Child.who Parent.st

필드와 static 메서드는 오버라이딩되지 않고 참조 변수의 선언 타입(Parent)을 따릅니다. 반면 인스턴스 메서드 who()는 실제 객체 타입(Child)에 따라 동적으로 결정됩니다. 업캐스팅과 다형성 문제에서 자주 쓰이는 함정입니다.

문제 7. SQL 그룹 집계와 HAVING

emp 테이블에 (id, dept, sal)이 아래와 같을 때, 다음 쿼리의 결과를 쓰시오. sal이 비어 있는 값은 NULL이다.

(1,A,300) (2,A,500) (3,B,200) (4,B,250)
(5,C,700) (6,C,400) (7,C,NULL) (8,A,NULL)

SELECT dept, COUNT(*), COUNT(sal), AVG(sal)
FROM emp GROUP BY dept
HAVING AVG(sal) >= 400 ORDER BY dept;

정답: (A, 3, 2, 400), (C, 3, 2, 550)

COUNT(*)는 NULL 행을 포함해 세지만 COUNT(sal)과 AVG(sal)은 NULL을 제외합니다. A는 (300+500)/2=400, B는 225로 조건에서 탈락, C는 (700+400)/2=550입니다. HAVING은 그룹을 만든 뒤 걸러낸다는 점을 같이 기억해 두세요.

문제 8. 순환 복잡도 계산

제어 흐름 그래프의 노드가 9개, 간선이 11개일 때 McCabe 순환 복잡도를 구하시오.

정답: 4

순환 복잡도는 간선 수 – 노드 수 + 2로 구하므로 11 – 9 + 2 = 4입니다. 판단문(조건 분기)의 개수에 1을 더한 값과도 같고, 독립적인 경로의 최소 개수를 뜻해서 화이트박스 테스트 케이스 수의 기준이 됩니다.

공부 팁 3가지

  1. 코드 문제는 눈으로만 읽지 말고 변수 값이 바뀌는 과정을 종이에 한 줄씩 적으며 추적하세요.
  2. 스케줄링과 페이지 교체처럼 정해진 표 형식이 있는 계산은 풀이 양식을 하나로 고정해 두면 시험장에서 실수가 줄어듭니다.
  3. 틀린 문제는 정답보다 어떤 규칙을 놓쳤는지(NULL 처리, 동적 바인딩 등)를 한 줄로 남겨 두고 반복해서 보세요.

이 글의 문제는 학습용으로 직접 만든 예상문제이며 실제 시험과 다를 수 있습니다. 최신 출제 범위와 일정은 한국산업인력공단 Q-Net 공식 공지를 반드시 확인하세요.

Leave a Comment