2023년-정보처리기사실기-2회차
정보처리기사 실기 기출문제

2023년 정보처리기사실기 2회차

총 20문항 · 주관식 · A4 약 1장

1 / 1
A4정답 포함
정보처리기사 실기 기출문제모두CBT · moducbt.com

2023년 정보처리기사실기 2회차

총 20문항 · 주관식 · 정답·해설 포함
문제 1

23-2

다음 Java 프로그램을 실행했을 때의 출력 결과를 적으시오.

public class Main {
    public static void main(String[] args) {
        String p = "kiwi";
        String q = new String("kiwi");
        String r = "kiwi";
        String s = q;

        System.out.println(p == q);
        System.out.println(q == s);
        System.out.println(r.equals(q));
        System.out.println(p == r);
    }
}
정답 및 해설

false
true
true
true


[해설]

==는 두 변수가 같은 객체를 가리키는지(참조)를, equals()는 문자열 내용이 같은지를 비교한다.

  • p == q: p는 문자열 상수 풀의 "kiwi", q는 new로 만든 별도 객체 → false
  • q == s: s = q로 같은 객체를 받았으므로 → true
  • r.equals(q): 내용이 둘 다 "kiwi" → true
  • p == r: 같은 리터럴은 상수 풀의 한 객체를 공유 → true

따라서 출력은 차례로 false, true, true, true이다.

문제 2

23-2

다음 C 프로그램의 출력 결과를 적으시오.

#include <stdio.h>
#include <string.h>

char slot[20];

char *keep(const char *s) {
    strcpy(slot, s);
    return slot;
}

int main(void) {
    char *a = keep("LIME");
    char *b = keep("PLUM");
    printf("%s\n", a);
    char *c = keep("FIG");
    printf("%s\n", b);
    printf("%s\n", c);
    return 0;
}
정답 및 해설

PLUM
FIG
FIG


[해설]

keep()은 매번 같은 전역 배열 slot의 주소를 돌려준다. 그래서 a, b, c는 모두 한 곳을 가리키고, 출력되는 값은 그 시점에 slot에 마지막으로 복사된 문자열이다.

  • keep("LIME"), keep("PLUM") 후 slot = "PLUM" → printf(a) → PLUM
  • keep("FIG") 후 slot = "FIG" → printf(b), printf(c) → FIG, FIG

a에 LIME이 남아 있을 것이라 착각하기 쉽지만, 포인터는 값이 아니라 위치를 저장한다. 호출마다 따로 보관하려면 동적 할당이나 호출자 쪽 버퍼가 필요하다.

문제 3

23-2

결정문 전체의 참·거짓 결과는 따지지 않고, 결정문을 이루는 각각의 개별 조건식이 최소 한 번씩 참과 거짓을 모두 갖도록 테스트 케이스를 만드는 커버리지를 [보기]에서 골라 적으시오.

[보기] 결정 커버리지, 구문 커버리지, 기본 경로 커버리지, 다중 조건 커버리지, 데이터 흐름 테스트, 루프 테스트, 변경 조건/결정 커버리지, 제어 흐름 테스트, 조건 커버리지, 조건/결정 커버리지

정답 및 해설

조건 커버리지(Condition Coverage)


[해설]

개별 조건식 단위로 참·거짓을 한 번씩 확인하는 것은 조건 커버리지다. 결정문 전체 결과가 참·거짓을 모두 거치는지는 보장하지 않는다.

  • 구문 커버리지: 모든 문장을 한 번 이상 실행
  • 결정 커버리지: 결정문 전체가 참·거짓을 한 번씩 가짐
  • 조건/결정 커버리지: 개별 조건과 결정문 전체를 모두 만족
  • 변경 조건/결정 커버리지(MC/DC): 각 조건이 다른 조건과 무관하게 결과를 바꿀 수 있음을 확인
  • 다중 조건 커버리지: 조건의 모든 참·거짓 조합을 수행

예를 들어 if (A && B)에서 (A참, B거짓)과 (A거짓, B참) 두 케이스는 조건 커버리지를 채우지만 결정은 두 번 다 거짓이라 결정 커버리지는 채우지 못한다.

문제 4

23-2

다음은 금액 m을 5000원권·1000원권·100원 동전·10원 동전으로 거슬러 줄 때 각각의 개수를 구하는 C 프로그램이다. a~d는 차례로 5000원·1000원·100원·10원의 개수이다. 아래 실행 결과가 나오도록 빈칸 ①~④에 들어갈 식을 [보기]의 문자·숫자·기호로 작성하시오.

[보기] m / % ( ) 0~9

#include <stdio.h>

int main(void) {
    int m = 8760;
    int a, b, c, d;
    a = ___①___;
    b = ___②___;
    c = ___③___;
    d = ___④___;
    printf("5000원 %d장\n", a);
    printf("1000원 %d장\n", b);
    printf("100원 %d개\n", c);
    printf("10원 %d개\n", d);
    return 0;
}

[실행 결과]

5000원 1장
1000원 3장
100원 7개
10원 6개
정답 및 해설

① m/5000

② m%5000/1000

③ m%1000/100

④ m%100/10


[해설]

큰 단위부터 몫으로 개수를 구하고, 나머지(%)로 이미 거슬러 준 몫을 떼어 낸 뒤 다음 단위로 나눈다.

  • ① 8760/5000 = 1
  • ② 8760%5000 = 3760 → 3760/1000 = 3
  • ③ 8760%1000 = 760 → 760/100 = 7
  • ④ 8760%100 = 60 → 60/10 = 6

%와 /는 우선순위가 같아 왼쪽부터 계산되므로 괄호를 넣은 (m%5000)/1000도 같은 값이다. m/1000%5, m/100%10, m/10%10처럼 몫을 먼저 구하고 나머지를 취하는 식도 결과가 같아 정답으로 인정된다.

문제 5

23-2

해시에 관한 물음에 답하시오.

(1) 빈칸에 들어갈 용어를 적으시오.

  • ( )은/는 길이가 제각각인 입력 데이터를 받아 언제나 일정한 길이의 값으로 바꿔 주는 함수다.
  • 아무리 긴 입력을 넣어도 출력의 크기는 정해져 있으며, 출력값에서 원래 입력을 되찾을 수 없는 일방향 성질을 가진다.

(2) 레코드의 저장 위치(홈 주소)를 계산하는 해싱 기법에 관한 설명이다. ㉠~㉢에 해당하는 기법의 명칭을 적으시오.

  • ( ㉠ ): 키 값을 제곱한 뒤, 그 결과의 가운데 자리 일부를 떼어 주소로 삼는다.
  • ( ㉡ ): 키를 이루는 각 자릿수의 분포를 조사해, 값이 고르게 퍼진 자리들만 골라 주소로 삼는다.
  • ( ㉢ ): 키 값을 다른 진법의 수로 바꾼 다음, 주소 범위를 넘는 높은 자리를 잘라 주소로 삼는다.
정답 및 해설

(1) 해시 함수(Hash Function)

(2) ㉠ 제곱법(Mid-Square)

(2) ㉡ 숫자 분석법(Digit Analysis)

(2) ㉢ 기수 변환법(Radix Conversion)


[해설]

길이가 제각각인 입력을 언제나 고정 길이 값으로 바꾸는 일방향 함수는 해시 함수(Hash Function)다. 출력값(해시값)으로 원래 입력을 되찾을 수 없어서 무결성 검증과 비밀번호 저장에 쓰인다.

  • 제곱법(Mid-Square)은 키를 제곱한 값의 가운데 자리를 홈 주소로 쓴다.
  • 숫자 분석법(Digit Analysis)은 키의 자릿수 가운데 값이 고르게 퍼진 자리만 골라 주소로 쓴다.
  • 기수 변환법(Radix Conversion)은 키를 다른 진법으로 바꾼 뒤, 주소 범위를 넘는 높은 자리를 잘라 주소로 쓴다.

외우는 요령: 제곱은 가운데 자리, 분석은 고른 자리, 진법은 기수 변환으로 짝지어 둔다. 이 밖의 해싱 기법으로 제산법·폴딩법·무작위법이 있다.

문제 6

23-2

다음 Python 프로그램의 출력 결과를 적으시오.

t = "software quality assurance"
x = t[:4]
y = t[9:12]
z = t[-5:]
print(x + y + z)
정답 및 해설

softquarance


[해설]

슬라이스 t[a:b]는 인덱스 a부터 b-1까지 잘라 낸다. 인덱스는 0부터 센다.

  • t[:4] → 0~3 → "soft"
  • t[9:12] → 9~11 → "qua" (8번은 공백)
  • t[-5:] → 끝에서 5글자 → "rance"

셋을 이어 붙이면 softquarance가 출력된다. 음수 인덱스 -5는 len(t)-5 = 21과 같다.

문제 7

23-2

테스트 수행에 쓰이는 구성 요소에 관한 설명이다. 빈칸 ①~④에 들어갈 용어를 적으시오.

  • ( ① ): 하향식 통합 테스트에서, 아직 완성되지 않은 하위 모듈을 대신한다. 호출을 받으면 정해진 값만 돌려주는 등 최소한의 기능만 흉내 낸다.
  • ( ② ): 상향식 통합 테스트에서, 아직 없는 상위 모듈을 대신한다. 테스트 대상 모듈을 호출하고 입력을 넘기며 결과를 받아 확인한다.
  • ( ③ ): 특정 요구사항을 검증하기 위해 입력값, 실행 조건, 기대 결과를 묶어 정의한 명세다.
  • ( ④ ): 테스트 대상 컴포넌트나 모듈별로 여러 개의 ( ③ )을/를 모아 놓은 집합이다.
정답 및 해설

① 스텁(Stub)

② 드라이버(Driver)

③ 테스트 케이스(Test Case)

④ 테스트 슈트(Test Suite)


[해설]

통합 테스트에서 아직 완성되지 않은 모듈을 대신하는 임시 코드가 스텁과 드라이버다.

  • 스텁(Stub)은 하향식 통합에서 빠진 하위 모듈 대신 호출을 받아 정해진 값만 돌려준다.
  • 드라이버(Driver)는 상향식 통합에서 빠진 상위 모듈 대신 대상 모듈을 호출하고 결과를 확인한다.
  • 테스트 케이스(Test Case)는 입력값·실행 조건·기대 결과를 하나로 묶은 명세다.
  • 테스트 슈트(Test Suite)는 컴포넌트나 모듈별로 테스트 케이스를 모은 집합이다.

혼동 주의: 스텁은 불려지는 쪽(하위)이고 드라이버는 부르는 쪽(상위)이다.

문제 8

23-2

다음 C 프로그램을 실행했을 때 출력되는 내용을 적으시오.

#include <stdio.h>

int main(void) {
    int s[4] = {68, 91, 77, 84};
    int j, total = 0;

    for (j = 0; j < 4; j++)
        total += s[j];

    switch (total / 40) {
    case 10:
    case 9:
        printf("P");
    case 8:
    case 7:
        printf("Q");
    case 6:
        printf("R");
        break;
    default:
        printf("S");
    }
    return 0;
}
정답 및 해설

QR


[해설]

네 점수의 합은 68+91+77+84=320이고, 320/40=8이므로 case 8부터 실행이 시작된다.

case 8에는 문장이 없어 아래 case 7로 그대로 내려가 "Q"를 찍는다. break가 없으니 case 6의 "R"까지 이어서 실행한 뒤 break에서 멈춘다.

따라서 출력은 QR이다. break를 만날 때까지 다음 case로 계속 흘러가는 폴스루(fall-through)가 이 문제의 핵심이다.

문제 9

23-2

데이터 전송 시의 오류 제어에 관한 설명이다. 빈칸 ①~⑤에 알맞은 용어를 [보기]에서 골라 적으시오.

  • 오류 제어는 수신 측이 스스로 고치는 ( ① ) 방식과, 송신 측에 다시 보내 달라고 요청하는 ( ② ) 방식으로 나뉜다.
  • ( ① ) 방식은 재전송 없이 수신 측에서 오류를 검출하고 정정한다. 대표적인 ( ③ ) 코드는 잘못된 비트의 위치를 찾아내 1비트 오류를 바로잡는다.
  • ( ② ) 방식은 오류가 검출되면 재전송을 요구한다. 오류 검출에는 ( ④ ) 검사, ( ⑤ ) 등이 쓰인다.
  • ( ④ ) 검사는 7~8비트 단위의 문자에 검사용 비트 1개를 붙여 1의 개수가 짝수(또는 홀수)인지 확인한다.
  • ( ⑤ )은/는 생성 다항식으로 나눈 나머지를 이용해 오류를 찾으며, 연속된 비트가 깨지는 집단 오류 검출에 알맞다.

[보기] BCD, BEC, CRC, FEC, Hamming, MD5, NAK, Parity

정답 및 해설

① FEC

② BEC

③ Hamming

④ Parity

⑤ CRC


[해설]

수신 측이 직접 정정하는 것은 FEC(Forward Error Correction, 전진 오류 수정), 재전송을 요청하는 것은 BEC(Backward Error Correction, 후진 오류 수정)이다.

FEC의 대표는 해밍(Hamming) 코드로, 여러 개의 패리티 비트를 조합해 1비트 오류의 위치를 알아내 고친다.

BEC에서 오류 검출에 쓰는 것이 패리티(Parity) 검사와 CRC(Cyclic Redundancy Check, 순환 중복 검사)다. 패리티는 짝수 개 비트 오류를 놓치지만 CRC는 집단 오류에도 강하다.

  • NAK: 재전송 요청에 쓰이는 부정 응답 신호
  • MD5: 해시 함수
  • BCD: 10진수 표현 코드
문제 10

23-2

아래 C 프로그램의 실행 결과가 49286이 되도록 빈칸에 들어갈 식을 [보기]의 문자·숫자·기호만 조합해 적으시오.

[보기] d k + % 3 5 [ ] ( )

#include <stdio.h>

int main(void) {
    int d[5] = {2, 8, 6, 4, 9};
    int k;
    for (k = 0; k < 5; k++) {
        printf("%d", __________);
    }
    return 0;
}
정답 및 해설

d[(k+3)%5]


[해설]

배열 d는 {2, 8, 6, 4, 9}이고, 목표 출력은 인덱스 3·4·0·1·2의 값을 차례로 찍은 것이다. 시작점을 3칸 옮긴 뒤 끝에 닿으면 앞으로 돌아가야 하므로 (k+3)%5를 인덱스로 쓴다.

  • k=0 → 3 → d[3]=4
  • k=1 → 4 → d[4]=9
  • k=2 → 5%5=0 → d[0]=2
  • k=3 → 1 → d[1]=8, k=4 → 2 → d[2]=6

나머지 연산 %5가 인덱스를 0~4 범위로 되감는 것이 핵심이다. 순서만 바꾼 d[(3+k)%5]도 같은 결과를 낸다.

문제 11

23-2

다음 조건을 만족하도록 SQL 문의 빈칸에 들어갈 옵션을 적으시오.

  • 뷰 v_sales를 삭제한다.
  • v_sales를 참조하여 만들어진 다른 뷰 등 의존 객체도 함께 연쇄 삭제한다.
DROP VIEW v_sales ________;
정답 및 해설

CASCADE


[해설]

삭제 대상을 참조하는 객체까지 함께 지우는 옵션은 CASCADE다.

반대 옵션인 RESTRICT는 참조하는 객체가 하나라도 있으면 삭제를 거부한다. DROP TABLE, DROP VIEW 등 DDL의 DROP 문에 공통으로 쓰인다.

문제 12

23-2

디자인 패턴에 관한 설명이다. 빈칸 ①~③에 들어갈 패턴을 [보기]에서 골라 적으시오.

  • ( ① ): 어떤 클래스의 인스턴스가 오직 하나만 만들어지도록 제한하고, 그 인스턴스에 프로그램 어디서나 접근할 수 있는 창구를 제공한다. 전역 변수를 쓰지 않고도 공유 객체를 둘 수 있다.
  • ( ② ): 객체 구조를 이루는 각 클래스에서 처리 로직을 떼어 내 별도의 클래스로 모은다. 이 클래스의 객체가 구조의 원소들을 차례로 방문하면서 작업을 수행한다.
  • ( ② ): 원소 클래스들을 고치지 않고도 새로운 연산을 덧붙이고 싶을 때 쓴다.
  • ( ③ ): 생성자에 넘길 인수가 많은 복잡한 객체를, 부품을 하나씩 지정하는 단계적 과정으로 조립해 만든다. 같은 조립 절차로 서로 다른 표현의 객체를 얻을 수 있다.

[보기] Adapter, Bridge, Builder, Command, Decorator, Facade, Factory Method, Flyweight, Iterator, Mediator, Memento, Observer, Proxy, Singleton, State, Strategy, Template Method, Visitor

정답 및 해설

① Singleton

② Visitor

③ Builder


[해설]

세 설명은 GoF 디자인 패턴의 정의로, 생성 패턴 둘과 행위 패턴 하나다.

  • Singleton — 생성자를 private으로 막고 정적 메서드로 유일한 인스턴스를 돌려준다.
  • Visitor — 원소는 accept(visitor)만 두고, 새 연산은 방문자 클래스를 추가해 붙인다.
  • Builder — 생성 과정과 표현을 분리해 같은 절차로 다른 객체를 조립한다.

혼동 주의: Iterator는 원소를 차례로 꺼내는 방법만 줄 뿐 연산을 분리하지 않고, Factory Method는 객체를 한 번에 만들어 주므로 단계적 조립인 Builder와 다르다.

문제 13

23-2

다음은 배열을 내림차순으로 정렬하는 C 프로그램이다. 아래 실행 결과가 나오도록 빈칸에 들어갈 연산자를 적으시오.

#include <stdio.h>

int main(void) {
    int v[] = {37, 5, 81, 14, 60};
    int n = sizeof(v) / sizeof(v[0]);
    int p = 0, q, t;
    do {
        q = p + 1;
        do {
            if (v[p] ____ v[q]) {
                t = v[p];
                v[p] = v[q];
                v[q] = t;
            }
            q++;
        } while (q < n);
        p++;
    } while (p < n - 1);
    for (p = 0; p < n; p++)
        printf("%d ", v[p]);
    return 0;
}

[실행 결과] 81 60 37 14 5

정답 및 해설

<


[해설]

바깥 반복이 자리 p를 고정하고, 안쪽 반복이 그 뒤의 원소 v[q]와 하나씩 비교해 필요하면 맞바꾼다. 선택 정렬처럼 한 바퀴가 끝나면 p 자리에 남은 원소 중 극값이 들어간다.

내림차순이므로 p 자리에는 가장 큰 값이 와야 한다. 앞의 값이 뒤의 값보다 작을 때(v[p] < v[q]) 교환해야 큰 값이 앞으로 모인다.

빈칸에 >를 넣으면 오름차순(5 14 37 60 81)이 된다. 따라서 정답은 <이다.

문제 14

23-2

HDLC(High-level Data Link Control)는 비트 단위로 프레임을 구성하는 데이터 링크 프로토콜로, 프레임은 플래그·주소·제어·정보·FCS 필드로 이루어진다. 다음 설명의 빈칸 ①~⑤에 들어갈 용어를 [보기]에서 골라 적으시오.

  • 제어 필드의 앞쪽 비트로 프레임의 종류를 가린다.
  • ( ① ) 프레임: 제어 필드가 0으로 시작하며, 사용자 데이터를 실어 나른다.
  • ( ② ) 프레임: 제어 필드가 10으로 시작하며, 흐름 제어와 오류 제어에 쓰인다.
  • ( ③ ) 프레임: 제어 필드가 11로 시작하며, 링크 설정·해제와 동작 모드 지정 같은 링크 관리를 맡는다.
  • ( ④ ): 포인트 투 포인트 균형 링크에서 쓰는 전송 모드로, 양쪽 혼합국이 상대의 허락 없이 언제든 송신할 수 있다.
  • ( ⑤ ): 전이중 포인트 투 포인트 불균형 링크에서 쓰는 전송 모드로, 종국이 주국의 허락 없이 송신할 수 있으나 링크 설정·오류 복구 같은 제어는 주국만 한다.

[보기] 감독, 동기 균형 모드, 동기 응답 모드, 릴레이, 비동기 균형 모드, 비동기 응답 모드, 비번호, 양방향 응답 모드, 익명, 정보, 표준 응답 모드

정답 및 해설

① 정보

② 감독

③ 비번호

④ 비동기 균형 모드

⑤ 비동기 응답 모드


[해설]

HDLC는 제어 필드의 앞쪽 비트로 프레임 종류를 가리고, 링크가 균형형인지와 종국의 송신 허가 필요 여부로 전송 모드를 가린다.

  • 정보(I) 프레임 — 0으로 시작하며 사용자 데이터를 나른다.
  • 감독(S) 프레임 — 10으로 시작하며 흐름 제어·오류 제어(RR, RNR, REJ 등)를 맡는다.
  • 비번호(U) 프레임 — 11로 시작하며 순서 번호 없이 링크 설정·해제 같은 관리를 맡는다.
  • 비동기 균형 모드(ABM) — 균형 링크에서 혼합국끼리 허가 없이 송신한다.
  • 비동기 응답 모드(ARM) — 불균형 링크에서 종국이 허가 없이 송신하되 제어는 주국이 한다.

혼동 주의: 표준(정규) 응답 모드(NRM)는 종국이 주국의 허가를 받아야만 송신할 수 있다.

문제 15

23-2

아래 스키마를 가진 [사원] 테이블에 새 행을 추가하는 SQL 문을 작성하시오.

[사원] 테이블 스키마

속성명데이터 타입제약
사번INTPRIMARY KEY
성명VARCHAR(20)
부서VARCHAR(20)
직급VARCHAR(10)
입사연도INT
내선VARCHAR(20)

[처리 조건]

  • 추가할 값: 사번 2310457, 성명 '윤서진', 부서 '품질관리팀', 직급 '주임', 입사연도 2021, 내선 '070-5521-3048'
  • 문자열 값은 작은따옴표(')로 감싼다.
  • 문장 끝의 세미콜론(;)은 써도 되고 생략해도 된다.
정답 및 해설

INSERT INTO 사원 VALUES (2310457, '윤서진', '품질관리팀', '주임', 2021, '070-5521-3048');


[해설]

행을 추가하는 DML은 INSERT INTO 테이블명 VALUES (값, …) 형식이다. 스키마에 정의된 6개 속성에 순서대로 모두 값을 넣으므로 속성 목록을 생략할 수 있다.

속성명을 적어 INSERT INTO 사원(사번, 성명, 부서, 직급, 입사연도, 내선) VALUES (…)로 써도 정답이다. 이때는 괄호 안 속성 순서와 값 순서만 맞으면 된다.

INT 속성인 사번·입사연도는 따옴표 없이, VARCHAR 속성은 작은따옴표로 감싼다. 내선 번호는 하이픈이 섞인 문자열이므로 반드시 따옴표가 필요하다.

문제 16

23-2

데이터베이스 구축 절차에 관한 물음에 답하시오.

(1) 데이터베이스를 구축하는 절차를 먼저 수행하는 단계부터 차례로 기호를 나열하시오.

ⓐ 개념적 설계 ⓑ 구현 ⓒ 논리적 설계 ⓓ 물리적 설계 ⓔ 요구 조건 분석

( ) → ( ) → ( ) → ( ) → ( )

(2) 애플리케이션 개발과 데이터베이스 구축을 나란히 놓으면 다음과 같이 대응한다. 빈칸 ㉠, ㉡에 들어갈 데이터 모델링의 명칭을 적으시오.

애플리케이션 측데이터베이스 측
비즈니스 요구사항비즈니스 요구사항
개념 모델링개념 데이터 모델링
분석 모델링( ㉠ )
설계 모델링( ㉡ )
애플리케이션 개발데이터베이스 구축
정답 및 해설

(1) ⓔ → ⓐ → ⓒ → ⓓ → ⓑ

(2) ㉠ 논리 데이터 모델링

(2) ㉡ 물리 데이터 모델링


[해설]

데이터베이스 설계는 요구 조건 분석 → 개념적 설계 → 논리적 설계 → 물리적 설계 → 구현 순으로, 추상적인 것에서 구체적인 것으로 내려간다.

  • 요구 조건 분석 — 사용자가 필요로 하는 데이터와 처리를 파악해 명세서를 쓴다.
  • 개념적 설계 — DBMS와 무관하게 E-R 다이어그램 등으로 개념 스키마를 만든다.
  • 논리적 설계 — 관계형 등 특정 데이터 모델에 맞게 변환하고 정규화한다.
  • 물리적 설계 — 저장 구조·인덱스·접근 경로를 정한다.
  • 구현 — DDL로 스키마를 생성하고 데이터를 적재한다.

애플리케이션의 분석 모델링에는 특정 데이터 모델 구조를 정하는 논리 데이터 모델링이, 설계 모델링에는 DBMS 저장 구조를 정하는 물리 데이터 모델링이 대응한다.

문제 17

23-2

다음 C 프로그램의 실행 결과를 적으시오.

#include <stdio.h>

int main(void) {
    int k, cnt = 0;
    for (k = 10; k <= 2023; k++) {
        if (k % 7 == 0)
            cnt++;
    }
    printf("%d", cnt);
    return 0;
}
정답 및 해설

288


[해설]

k를 10부터 2023까지 늘리며 7의 배수일 때만 cnt를 1 올린다.

1~2023 사이 7의 배수는 2023/7 = 289개(2023 = 7×289)다. 반복이 10부터 시작하므로 그 전에 있는 7 하나가 빠진다.

따라서 289 − 1 = 288이 출력된다. 끝값 2023이 7의 배수라 포함되는지(<=)도 함께 확인해야 한다.

문제 18

23-2

암호화 방식에 관한 설명이다. ①, ②에 해당하는 알고리즘을 [보기]에서 모두 골라 적으시오.

  • ( ① ): 암호화할 때와 복호화할 때 동일한 키를 사용한다. 처리 속도가 빠르지만, 통신 상대와 비밀키를 안전하게 나눠 갖는 절차가 필요하다.
  • ( ② ): 누구에게나 공개하는 키와 소유자만 간직하는 개인키를 한 쌍으로 사용한다.

[보기] AES, ARIA, DES, DSA, ECC, RC4, RSA, SEED

정답 및 해설

① AES, ARIA, DES, RC4, SEED

② DSA, ECC, RSA


[해설]

같은 키로 암·복호화하면 대칭키(비밀키) 암호, 공개키와 개인키를 쌍으로 쓰면 비대칭키(공개키) 암호다.

  • AES·DES — 미국 표준 블록 암호다(DES는 AES로 대체됨).
  • ARIA·SEED — 국내에서 개발한 블록 암호다.
  • RC4 — 대칭키 스트림 암호다.
  • RSA — 큰 수의 소인수분해가 어렵다는 점에 기반한 공개키 암호다.
  • ECC — 타원 곡선 이산대수 문제에 기반해 짧은 키로 RSA와 비슷한 강도를 낸다.
  • DSA — 이산대수 문제에 기반한 전자서명용 공개키 알고리즘이다.

외우는 요령: 보기 중 공개키 방식은 RSA·ECC·DSA 셋뿐이고 나머지는 모두 대칭키다.

문제 19

23-2

다음은 배열로 구현한 스택을 사용하는 C 프로그램이다. 실행 결과를 적으시오.

#include <stdio.h>
#define CAP 8

int box[CAP];
int top = -1;

int empty(void) {
    return top == -1;
}

void put(int v) {
    if (top == CAP - 1) {
        printf("Over");
        return;
    }
    box[++top] = v;
}

int get(void) {
    return box[top--];
}

int main(void) {
    put(7);
    put(3);
    put(8);
    printf("%d", get());
    while (!empty()) {
        put(1);
        printf("%d", get());
        printf("%d", get());
        put(9);
        put(4);
        printf("%d", get());
        printf("%d", get());
        printf("%d", get());
    }
    return 0;
}
정답 및 해설

813497


[해설]

스택은 마지막에 넣은 값이 먼저 나오는 후입선출(LIFO) 구조다. get()은 top 위치의 값을 돌려주고 top을 1 줄인다.

  • put 7, 3, 8 → [7, 3, 8], get → 8
  • 반복 진입(스택 [7, 3]): put 1 → get 1, get 3 → [7]
  • put 9, 4 → [7, 9, 4] → get 4, 9, 7 → 스택이 빔

반복 한 번 만에 스택이 비어 while이 끝나므로, 찍힌 값을 이으면 813497이다. 용량 8을 넘는 일이 없어 "Over"는 출력되지 않는다.

문제 20

23-2

다음 설명에 해당하는 보안 기술의 명칭을 적으시오.

  • 배포된 소프트웨어나 시스템이 제3자에 의해 몰래 변조되는 것을 막는 기술이다.
  • 코드나 데이터가 위조·변경된 흔적을 탐지하면, 프로그램이 정상 동작하지 않도록 만들어 불법 이용을 어렵게 한다.
  • 해시 값 검증, 핑거프린트·워터마크 삽입, 원본과의 비교, 프로그램 체킹, 실행 코드 난독화 등의 기법으로 구현한다.
정답 및 해설

탬퍼 프루핑(Tamper Proofing)


[해설]

변조(tamper)를 막는다(proof)는 뜻 그대로, 위·변조를 탐지해 오작동을 유도하는 기술은 탬퍼 프루핑(Tamper Proofing)이다.

해시로 무결성을 검사하고, 난독화로 분석 자체를 어렵게 만들어 크래킹·불법 복제를 억제한다. 표기는 템퍼 프루핑으로 적어도 같은 답이다.

코드를 읽기 어렵게 바꾸는 난독화(Obfuscation)는 탬퍼 프루핑의 구성 기법 중 하나이지 전체 명칭이 아니다.

정보처리기사 실기 기출문제모두CBT · moducbt.com
2023년 정보처리기사실기 2회차
총 20문항 · 주관식 · 정답·해설 포함
문제 1

23-2

다음 Java 프로그램을 실행했을 때의 출력 결과를 적으시오.

public class Main {
    public static void main(String[] args) {
        String p = "kiwi";
        String q = new String("kiwi");
        String r = "kiwi";
        String s = q;

        System.out.println(p == q);
        System.out.println(q == s);
        System.out.println(r.equals(q));
        System.out.println(p == r);
    }
}
정답 및 해설

false
true
true
true


[해설]

==는 두 변수가 같은 객체를 가리키는지(참조)를, equals()는 문자열 내용이 같은지를 비교한다.

  • p == q: p는 문자열 상수 풀의 "kiwi", q는 new로 만든 별도 객체 → false
  • q == s: s = q로 같은 객체를 받았으므로 → true
  • r.equals(q): 내용이 둘 다 "kiwi" → true
  • p == r: 같은 리터럴은 상수 풀의 한 객체를 공유 → true

따라서 출력은 차례로 false, true, true, true이다.

문제 2

23-2

다음 C 프로그램의 출력 결과를 적으시오.

#include <stdio.h>
#include <string.h>

char slot[20];

char *keep(const char *s) {
    strcpy(slot, s);
    return slot;
}

int main(void) {
    char *a = keep("LIME");
    char *b = keep("PLUM");
    printf("%s\n", a);
    char *c = keep("FIG");
    printf("%s\n", b);
    printf("%s\n", c);
    return 0;
}
정답 및 해설

PLUM
FIG
FIG


[해설]

keep()은 매번 같은 전역 배열 slot의 주소를 돌려준다. 그래서 a, b, c는 모두 한 곳을 가리키고, 출력되는 값은 그 시점에 slot에 마지막으로 복사된 문자열이다.

  • keep("LIME"), keep("PLUM") 후 slot = "PLUM" → printf(a) → PLUM
  • keep("FIG") 후 slot = "FIG" → printf(b), printf(c) → FIG, FIG

a에 LIME이 남아 있을 것이라 착각하기 쉽지만, 포인터는 값이 아니라 위치를 저장한다. 호출마다 따로 보관하려면 동적 할당이나 호출자 쪽 버퍼가 필요하다.

문제 3

23-2

결정문 전체의 참·거짓 결과는 따지지 않고, 결정문을 이루는 각각의 개별 조건식이 최소 한 번씩 참과 거짓을 모두 갖도록 테스트 케이스를 만드는 커버리지를 [보기]에서 골라 적으시오.

[보기] 결정 커버리지, 구문 커버리지, 기본 경로 커버리지, 다중 조건 커버리지, 데이터 흐름 테스트, 루프 테스트, 변경 조건/결정 커버리지, 제어 흐름 테스트, 조건 커버리지, 조건/결정 커버리지

정답 및 해설

조건 커버리지(Condition Coverage)


[해설]

개별 조건식 단위로 참·거짓을 한 번씩 확인하는 것은 조건 커버리지다. 결정문 전체 결과가 참·거짓을 모두 거치는지는 보장하지 않는다.

  • 구문 커버리지: 모든 문장을 한 번 이상 실행
  • 결정 커버리지: 결정문 전체가 참·거짓을 한 번씩 가짐
  • 조건/결정 커버리지: 개별 조건과 결정문 전체를 모두 만족
  • 변경 조건/결정 커버리지(MC/DC): 각 조건이 다른 조건과 무관하게 결과를 바꿀 수 있음을 확인
  • 다중 조건 커버리지: 조건의 모든 참·거짓 조합을 수행

예를 들어 if (A && B)에서 (A참, B거짓)과 (A거짓, B참) 두 케이스는 조건 커버리지를 채우지만 결정은 두 번 다 거짓이라 결정 커버리지는 채우지 못한다.

문제 4

23-2

다음은 금액 m을 5000원권·1000원권·100원 동전·10원 동전으로 거슬러 줄 때 각각의 개수를 구하는 C 프로그램이다. a~d는 차례로 5000원·1000원·100원·10원의 개수이다. 아래 실행 결과가 나오도록 빈칸 ①~④에 들어갈 식을 [보기]의 문자·숫자·기호로 작성하시오.

[보기] m / % ( ) 0~9

#include <stdio.h>

int main(void) {
    int m = 8760;
    int a, b, c, d;
    a = ___①___;
    b = ___②___;
    c = ___③___;
    d = ___④___;
    printf("5000원 %d장\n", a);
    printf("1000원 %d장\n", b);
    printf("100원 %d개\n", c);
    printf("10원 %d개\n", d);
    return 0;
}

[실행 결과]

5000원 1장
1000원 3장
100원 7개
10원 6개
정답 및 해설

① m/5000

② m%5000/1000

③ m%1000/100

④ m%100/10


[해설]

큰 단위부터 몫으로 개수를 구하고, 나머지(%)로 이미 거슬러 준 몫을 떼어 낸 뒤 다음 단위로 나눈다.

  • ① 8760/5000 = 1
  • ② 8760%5000 = 3760 → 3760/1000 = 3
  • ③ 8760%1000 = 760 → 760/100 = 7
  • ④ 8760%100 = 60 → 60/10 = 6

%와 /는 우선순위가 같아 왼쪽부터 계산되므로 괄호를 넣은 (m%5000)/1000도 같은 값이다. m/1000%5, m/100%10, m/10%10처럼 몫을 먼저 구하고 나머지를 취하는 식도 결과가 같아 정답으로 인정된다.

문제 5

23-2

해시에 관한 물음에 답하시오.

(1) 빈칸에 들어갈 용어를 적으시오.

  • ( )은/는 길이가 제각각인 입력 데이터를 받아 언제나 일정한 길이의 값으로 바꿔 주는 함수다.
  • 아무리 긴 입력을 넣어도 출력의 크기는 정해져 있으며, 출력값에서 원래 입력을 되찾을 수 없는 일방향 성질을 가진다.

(2) 레코드의 저장 위치(홈 주소)를 계산하는 해싱 기법에 관한 설명이다. ㉠~㉢에 해당하는 기법의 명칭을 적으시오.

  • ( ㉠ ): 키 값을 제곱한 뒤, 그 결과의 가운데 자리 일부를 떼어 주소로 삼는다.
  • ( ㉡ ): 키를 이루는 각 자릿수의 분포를 조사해, 값이 고르게 퍼진 자리들만 골라 주소로 삼는다.
  • ( ㉢ ): 키 값을 다른 진법의 수로 바꾼 다음, 주소 범위를 넘는 높은 자리를 잘라 주소로 삼는다.
정답 및 해설

(1) 해시 함수(Hash Function)

(2) ㉠ 제곱법(Mid-Square)

(2) ㉡ 숫자 분석법(Digit Analysis)

(2) ㉢ 기수 변환법(Radix Conversion)


[해설]

길이가 제각각인 입력을 언제나 고정 길이 값으로 바꾸는 일방향 함수는 해시 함수(Hash Function)다. 출력값(해시값)으로 원래 입력을 되찾을 수 없어서 무결성 검증과 비밀번호 저장에 쓰인다.

  • 제곱법(Mid-Square)은 키를 제곱한 값의 가운데 자리를 홈 주소로 쓴다.
  • 숫자 분석법(Digit Analysis)은 키의 자릿수 가운데 값이 고르게 퍼진 자리만 골라 주소로 쓴다.
  • 기수 변환법(Radix Conversion)은 키를 다른 진법으로 바꾼 뒤, 주소 범위를 넘는 높은 자리를 잘라 주소로 쓴다.

외우는 요령: 제곱은 가운데 자리, 분석은 고른 자리, 진법은 기수 변환으로 짝지어 둔다. 이 밖의 해싱 기법으로 제산법·폴딩법·무작위법이 있다.

문제 6

23-2

다음 Python 프로그램의 출력 결과를 적으시오.

t = "software quality assurance"
x = t[:4]
y = t[9:12]
z = t[-5:]
print(x + y + z)
정답 및 해설

softquarance


[해설]

슬라이스 t[a:b]는 인덱스 a부터 b-1까지 잘라 낸다. 인덱스는 0부터 센다.

  • t[:4] → 0~3 → "soft"
  • t[9:12] → 9~11 → "qua" (8번은 공백)
  • t[-5:] → 끝에서 5글자 → "rance"

셋을 이어 붙이면 softquarance가 출력된다. 음수 인덱스 -5는 len(t)-5 = 21과 같다.

문제 7

23-2

테스트 수행에 쓰이는 구성 요소에 관한 설명이다. 빈칸 ①~④에 들어갈 용어를 적으시오.

  • ( ① ): 하향식 통합 테스트에서, 아직 완성되지 않은 하위 모듈을 대신한다. 호출을 받으면 정해진 값만 돌려주는 등 최소한의 기능만 흉내 낸다.
  • ( ② ): 상향식 통합 테스트에서, 아직 없는 상위 모듈을 대신한다. 테스트 대상 모듈을 호출하고 입력을 넘기며 결과를 받아 확인한다.
  • ( ③ ): 특정 요구사항을 검증하기 위해 입력값, 실행 조건, 기대 결과를 묶어 정의한 명세다.
  • ( ④ ): 테스트 대상 컴포넌트나 모듈별로 여러 개의 ( ③ )을/를 모아 놓은 집합이다.
정답 및 해설

① 스텁(Stub)

② 드라이버(Driver)

③ 테스트 케이스(Test Case)

④ 테스트 슈트(Test Suite)


[해설]

통합 테스트에서 아직 완성되지 않은 모듈을 대신하는 임시 코드가 스텁과 드라이버다.

  • 스텁(Stub)은 하향식 통합에서 빠진 하위 모듈 대신 호출을 받아 정해진 값만 돌려준다.
  • 드라이버(Driver)는 상향식 통합에서 빠진 상위 모듈 대신 대상 모듈을 호출하고 결과를 확인한다.
  • 테스트 케이스(Test Case)는 입력값·실행 조건·기대 결과를 하나로 묶은 명세다.
  • 테스트 슈트(Test Suite)는 컴포넌트나 모듈별로 테스트 케이스를 모은 집합이다.

혼동 주의: 스텁은 불려지는 쪽(하위)이고 드라이버는 부르는 쪽(상위)이다.

문제 8

23-2

다음 C 프로그램을 실행했을 때 출력되는 내용을 적으시오.

#include <stdio.h>

int main(void) {
    int s[4] = {68, 91, 77, 84};
    int j, total = 0;

    for (j = 0; j < 4; j++)
        total += s[j];

    switch (total / 40) {
    case 10:
    case 9:
        printf("P");
    case 8:
    case 7:
        printf("Q");
    case 6:
        printf("R");
        break;
    default:
        printf("S");
    }
    return 0;
}
정답 및 해설

QR


[해설]

네 점수의 합은 68+91+77+84=320이고, 320/40=8이므로 case 8부터 실행이 시작된다.

case 8에는 문장이 없어 아래 case 7로 그대로 내려가 "Q"를 찍는다. break가 없으니 case 6의 "R"까지 이어서 실행한 뒤 break에서 멈춘다.

따라서 출력은 QR이다. break를 만날 때까지 다음 case로 계속 흘러가는 폴스루(fall-through)가 이 문제의 핵심이다.

문제 9

23-2

데이터 전송 시의 오류 제어에 관한 설명이다. 빈칸 ①~⑤에 알맞은 용어를 [보기]에서 골라 적으시오.

  • 오류 제어는 수신 측이 스스로 고치는 ( ① ) 방식과, 송신 측에 다시 보내 달라고 요청하는 ( ② ) 방식으로 나뉜다.
  • ( ① ) 방식은 재전송 없이 수신 측에서 오류를 검출하고 정정한다. 대표적인 ( ③ ) 코드는 잘못된 비트의 위치를 찾아내 1비트 오류를 바로잡는다.
  • ( ② ) 방식은 오류가 검출되면 재전송을 요구한다. 오류 검출에는 ( ④ ) 검사, ( ⑤ ) 등이 쓰인다.
  • ( ④ ) 검사는 7~8비트 단위의 문자에 검사용 비트 1개를 붙여 1의 개수가 짝수(또는 홀수)인지 확인한다.
  • ( ⑤ )은/는 생성 다항식으로 나눈 나머지를 이용해 오류를 찾으며, 연속된 비트가 깨지는 집단 오류 검출에 알맞다.

[보기] BCD, BEC, CRC, FEC, Hamming, MD5, NAK, Parity

정답 및 해설

① FEC

② BEC

③ Hamming

④ Parity

⑤ CRC


[해설]

수신 측이 직접 정정하는 것은 FEC(Forward Error Correction, 전진 오류 수정), 재전송을 요청하는 것은 BEC(Backward Error Correction, 후진 오류 수정)이다.

FEC의 대표는 해밍(Hamming) 코드로, 여러 개의 패리티 비트를 조합해 1비트 오류의 위치를 알아내 고친다.

BEC에서 오류 검출에 쓰는 것이 패리티(Parity) 검사와 CRC(Cyclic Redundancy Check, 순환 중복 검사)다. 패리티는 짝수 개 비트 오류를 놓치지만 CRC는 집단 오류에도 강하다.

  • NAK: 재전송 요청에 쓰이는 부정 응답 신호
  • MD5: 해시 함수
  • BCD: 10진수 표현 코드
문제 10

23-2

아래 C 프로그램의 실행 결과가 49286이 되도록 빈칸에 들어갈 식을 [보기]의 문자·숫자·기호만 조합해 적으시오.

[보기] d k + % 3 5 [ ] ( )

#include <stdio.h>

int main(void) {
    int d[5] = {2, 8, 6, 4, 9};
    int k;
    for (k = 0; k < 5; k++) {
        printf("%d", __________);
    }
    return 0;
}
정답 및 해설

d[(k+3)%5]


[해설]

배열 d는 {2, 8, 6, 4, 9}이고, 목표 출력은 인덱스 3·4·0·1·2의 값을 차례로 찍은 것이다. 시작점을 3칸 옮긴 뒤 끝에 닿으면 앞으로 돌아가야 하므로 (k+3)%5를 인덱스로 쓴다.

  • k=0 → 3 → d[3]=4
  • k=1 → 4 → d[4]=9
  • k=2 → 5%5=0 → d[0]=2
  • k=3 → 1 → d[1]=8, k=4 → 2 → d[2]=6

나머지 연산 %5가 인덱스를 0~4 범위로 되감는 것이 핵심이다. 순서만 바꾼 d[(3+k)%5]도 같은 결과를 낸다.

문제 11

23-2

다음 조건을 만족하도록 SQL 문의 빈칸에 들어갈 옵션을 적으시오.

  • 뷰 v_sales를 삭제한다.
  • v_sales를 참조하여 만들어진 다른 뷰 등 의존 객체도 함께 연쇄 삭제한다.
DROP VIEW v_sales ________;
정답 및 해설

CASCADE


[해설]

삭제 대상을 참조하는 객체까지 함께 지우는 옵션은 CASCADE다.

반대 옵션인 RESTRICT는 참조하는 객체가 하나라도 있으면 삭제를 거부한다. DROP TABLE, DROP VIEW 등 DDL의 DROP 문에 공통으로 쓰인다.

문제 12

23-2

디자인 패턴에 관한 설명이다. 빈칸 ①~③에 들어갈 패턴을 [보기]에서 골라 적으시오.

  • ( ① ): 어떤 클래스의 인스턴스가 오직 하나만 만들어지도록 제한하고, 그 인스턴스에 프로그램 어디서나 접근할 수 있는 창구를 제공한다. 전역 변수를 쓰지 않고도 공유 객체를 둘 수 있다.
  • ( ② ): 객체 구조를 이루는 각 클래스에서 처리 로직을 떼어 내 별도의 클래스로 모은다. 이 클래스의 객체가 구조의 원소들을 차례로 방문하면서 작업을 수행한다.
  • ( ② ): 원소 클래스들을 고치지 않고도 새로운 연산을 덧붙이고 싶을 때 쓴다.
  • ( ③ ): 생성자에 넘길 인수가 많은 복잡한 객체를, 부품을 하나씩 지정하는 단계적 과정으로 조립해 만든다. 같은 조립 절차로 서로 다른 표현의 객체를 얻을 수 있다.

[보기] Adapter, Bridge, Builder, Command, Decorator, Facade, Factory Method, Flyweight, Iterator, Mediator, Memento, Observer, Proxy, Singleton, State, Strategy, Template Method, Visitor

정답 및 해설

① Singleton

② Visitor

③ Builder


[해설]

세 설명은 GoF 디자인 패턴의 정의로, 생성 패턴 둘과 행위 패턴 하나다.

  • Singleton — 생성자를 private으로 막고 정적 메서드로 유일한 인스턴스를 돌려준다.
  • Visitor — 원소는 accept(visitor)만 두고, 새 연산은 방문자 클래스를 추가해 붙인다.
  • Builder — 생성 과정과 표현을 분리해 같은 절차로 다른 객체를 조립한다.

혼동 주의: Iterator는 원소를 차례로 꺼내는 방법만 줄 뿐 연산을 분리하지 않고, Factory Method는 객체를 한 번에 만들어 주므로 단계적 조립인 Builder와 다르다.

문제 13

23-2

다음은 배열을 내림차순으로 정렬하는 C 프로그램이다. 아래 실행 결과가 나오도록 빈칸에 들어갈 연산자를 적으시오.

#include <stdio.h>

int main(void) {
    int v[] = {37, 5, 81, 14, 60};
    int n = sizeof(v) / sizeof(v[0]);
    int p = 0, q, t;
    do {
        q = p + 1;
        do {
            if (v[p] ____ v[q]) {
                t = v[p];
                v[p] = v[q];
                v[q] = t;
            }
            q++;
        } while (q < n);
        p++;
    } while (p < n - 1);
    for (p = 0; p < n; p++)
        printf("%d ", v[p]);
    return 0;
}

[실행 결과] 81 60 37 14 5

정답 및 해설

<


[해설]

바깥 반복이 자리 p를 고정하고, 안쪽 반복이 그 뒤의 원소 v[q]와 하나씩 비교해 필요하면 맞바꾼다. 선택 정렬처럼 한 바퀴가 끝나면 p 자리에 남은 원소 중 극값이 들어간다.

내림차순이므로 p 자리에는 가장 큰 값이 와야 한다. 앞의 값이 뒤의 값보다 작을 때(v[p] < v[q]) 교환해야 큰 값이 앞으로 모인다.

빈칸에 >를 넣으면 오름차순(5 14 37 60 81)이 된다. 따라서 정답은 <이다.

문제 14

23-2

HDLC(High-level Data Link Control)는 비트 단위로 프레임을 구성하는 데이터 링크 프로토콜로, 프레임은 플래그·주소·제어·정보·FCS 필드로 이루어진다. 다음 설명의 빈칸 ①~⑤에 들어갈 용어를 [보기]에서 골라 적으시오.

  • 제어 필드의 앞쪽 비트로 프레임의 종류를 가린다.
  • ( ① ) 프레임: 제어 필드가 0으로 시작하며, 사용자 데이터를 실어 나른다.
  • ( ② ) 프레임: 제어 필드가 10으로 시작하며, 흐름 제어와 오류 제어에 쓰인다.
  • ( ③ ) 프레임: 제어 필드가 11로 시작하며, 링크 설정·해제와 동작 모드 지정 같은 링크 관리를 맡는다.
  • ( ④ ): 포인트 투 포인트 균형 링크에서 쓰는 전송 모드로, 양쪽 혼합국이 상대의 허락 없이 언제든 송신할 수 있다.
  • ( ⑤ ): 전이중 포인트 투 포인트 불균형 링크에서 쓰는 전송 모드로, 종국이 주국의 허락 없이 송신할 수 있으나 링크 설정·오류 복구 같은 제어는 주국만 한다.

[보기] 감독, 동기 균형 모드, 동기 응답 모드, 릴레이, 비동기 균형 모드, 비동기 응답 모드, 비번호, 양방향 응답 모드, 익명, 정보, 표준 응답 모드

정답 및 해설

① 정보

② 감독

③ 비번호

④ 비동기 균형 모드

⑤ 비동기 응답 모드


[해설]

HDLC는 제어 필드의 앞쪽 비트로 프레임 종류를 가리고, 링크가 균형형인지와 종국의 송신 허가 필요 여부로 전송 모드를 가린다.

  • 정보(I) 프레임 — 0으로 시작하며 사용자 데이터를 나른다.
  • 감독(S) 프레임 — 10으로 시작하며 흐름 제어·오류 제어(RR, RNR, REJ 등)를 맡는다.
  • 비번호(U) 프레임 — 11로 시작하며 순서 번호 없이 링크 설정·해제 같은 관리를 맡는다.
  • 비동기 균형 모드(ABM) — 균형 링크에서 혼합국끼리 허가 없이 송신한다.
  • 비동기 응답 모드(ARM) — 불균형 링크에서 종국이 허가 없이 송신하되 제어는 주국이 한다.

혼동 주의: 표준(정규) 응답 모드(NRM)는 종국이 주국의 허가를 받아야만 송신할 수 있다.

문제 15

23-2

아래 스키마를 가진 [사원] 테이블에 새 행을 추가하는 SQL 문을 작성하시오.

[사원] 테이블 스키마

속성명데이터 타입제약
사번INTPRIMARY KEY
성명VARCHAR(20)
부서VARCHAR(20)
직급VARCHAR(10)
입사연도INT
내선VARCHAR(20)

[처리 조건]

  • 추가할 값: 사번 2310457, 성명 '윤서진', 부서 '품질관리팀', 직급 '주임', 입사연도 2021, 내선 '070-5521-3048'
  • 문자열 값은 작은따옴표(')로 감싼다.
  • 문장 끝의 세미콜론(;)은 써도 되고 생략해도 된다.
정답 및 해설

INSERT INTO 사원 VALUES (2310457, '윤서진', '품질관리팀', '주임', 2021, '070-5521-3048');


[해설]

행을 추가하는 DML은 INSERT INTO 테이블명 VALUES (값, …) 형식이다. 스키마에 정의된 6개 속성에 순서대로 모두 값을 넣으므로 속성 목록을 생략할 수 있다.

속성명을 적어 INSERT INTO 사원(사번, 성명, 부서, 직급, 입사연도, 내선) VALUES (…)로 써도 정답이다. 이때는 괄호 안 속성 순서와 값 순서만 맞으면 된다.

INT 속성인 사번·입사연도는 따옴표 없이, VARCHAR 속성은 작은따옴표로 감싼다. 내선 번호는 하이픈이 섞인 문자열이므로 반드시 따옴표가 필요하다.

문제 16

23-2

데이터베이스 구축 절차에 관한 물음에 답하시오.

(1) 데이터베이스를 구축하는 절차를 먼저 수행하는 단계부터 차례로 기호를 나열하시오.

ⓐ 개념적 설계 ⓑ 구현 ⓒ 논리적 설계 ⓓ 물리적 설계 ⓔ 요구 조건 분석

( ) → ( ) → ( ) → ( ) → ( )

(2) 애플리케이션 개발과 데이터베이스 구축을 나란히 놓으면 다음과 같이 대응한다. 빈칸 ㉠, ㉡에 들어갈 데이터 모델링의 명칭을 적으시오.

애플리케이션 측데이터베이스 측
비즈니스 요구사항비즈니스 요구사항
개념 모델링개념 데이터 모델링
분석 모델링( ㉠ )
설계 모델링( ㉡ )
애플리케이션 개발데이터베이스 구축
정답 및 해설

(1) ⓔ → ⓐ → ⓒ → ⓓ → ⓑ

(2) ㉠ 논리 데이터 모델링

(2) ㉡ 물리 데이터 모델링


[해설]

데이터베이스 설계는 요구 조건 분석 → 개념적 설계 → 논리적 설계 → 물리적 설계 → 구현 순으로, 추상적인 것에서 구체적인 것으로 내려간다.

  • 요구 조건 분석 — 사용자가 필요로 하는 데이터와 처리를 파악해 명세서를 쓴다.
  • 개념적 설계 — DBMS와 무관하게 E-R 다이어그램 등으로 개념 스키마를 만든다.
  • 논리적 설계 — 관계형 등 특정 데이터 모델에 맞게 변환하고 정규화한다.
  • 물리적 설계 — 저장 구조·인덱스·접근 경로를 정한다.
  • 구현 — DDL로 스키마를 생성하고 데이터를 적재한다.

애플리케이션의 분석 모델링에는 특정 데이터 모델 구조를 정하는 논리 데이터 모델링이, 설계 모델링에는 DBMS 저장 구조를 정하는 물리 데이터 모델링이 대응한다.

문제 17

23-2

다음 C 프로그램의 실행 결과를 적으시오.

#include <stdio.h>

int main(void) {
    int k, cnt = 0;
    for (k = 10; k <= 2023; k++) {
        if (k % 7 == 0)
            cnt++;
    }
    printf("%d", cnt);
    return 0;
}
정답 및 해설

288


[해설]

k를 10부터 2023까지 늘리며 7의 배수일 때만 cnt를 1 올린다.

1~2023 사이 7의 배수는 2023/7 = 289개(2023 = 7×289)다. 반복이 10부터 시작하므로 그 전에 있는 7 하나가 빠진다.

따라서 289 − 1 = 288이 출력된다. 끝값 2023이 7의 배수라 포함되는지(<=)도 함께 확인해야 한다.

문제 18

23-2

암호화 방식에 관한 설명이다. ①, ②에 해당하는 알고리즘을 [보기]에서 모두 골라 적으시오.

  • ( ① ): 암호화할 때와 복호화할 때 동일한 키를 사용한다. 처리 속도가 빠르지만, 통신 상대와 비밀키를 안전하게 나눠 갖는 절차가 필요하다.
  • ( ② ): 누구에게나 공개하는 키와 소유자만 간직하는 개인키를 한 쌍으로 사용한다.

[보기] AES, ARIA, DES, DSA, ECC, RC4, RSA, SEED

정답 및 해설

① AES, ARIA, DES, RC4, SEED

② DSA, ECC, RSA


[해설]

같은 키로 암·복호화하면 대칭키(비밀키) 암호, 공개키와 개인키를 쌍으로 쓰면 비대칭키(공개키) 암호다.

  • AES·DES — 미국 표준 블록 암호다(DES는 AES로 대체됨).
  • ARIA·SEED — 국내에서 개발한 블록 암호다.
  • RC4 — 대칭키 스트림 암호다.
  • RSA — 큰 수의 소인수분해가 어렵다는 점에 기반한 공개키 암호다.
  • ECC — 타원 곡선 이산대수 문제에 기반해 짧은 키로 RSA와 비슷한 강도를 낸다.
  • DSA — 이산대수 문제에 기반한 전자서명용 공개키 알고리즘이다.

외우는 요령: 보기 중 공개키 방식은 RSA·ECC·DSA 셋뿐이고 나머지는 모두 대칭키다.

문제 19

23-2

다음은 배열로 구현한 스택을 사용하는 C 프로그램이다. 실행 결과를 적으시오.

#include <stdio.h>
#define CAP 8

int box[CAP];
int top = -1;

int empty(void) {
    return top == -1;
}

void put(int v) {
    if (top == CAP - 1) {
        printf("Over");
        return;
    }
    box[++top] = v;
}

int get(void) {
    return box[top--];
}

int main(void) {
    put(7);
    put(3);
    put(8);
    printf("%d", get());
    while (!empty()) {
        put(1);
        printf("%d", get());
        printf("%d", get());
        put(9);
        put(4);
        printf("%d", get());
        printf("%d", get());
        printf("%d", get());
    }
    return 0;
}
정답 및 해설

813497


[해설]

스택은 마지막에 넣은 값이 먼저 나오는 후입선출(LIFO) 구조다. get()은 top 위치의 값을 돌려주고 top을 1 줄인다.

  • put 7, 3, 8 → [7, 3, 8], get → 8
  • 반복 진입(스택 [7, 3]): put 1 → get 1, get 3 → [7]
  • put 9, 4 → [7, 9, 4] → get 4, 9, 7 → 스택이 빔

반복 한 번 만에 스택이 비어 while이 끝나므로, 찍힌 값을 이으면 813497이다. 용량 8을 넘는 일이 없어 "Over"는 출력되지 않는다.

문제 20

23-2

다음 설명에 해당하는 보안 기술의 명칭을 적으시오.

  • 배포된 소프트웨어나 시스템이 제3자에 의해 몰래 변조되는 것을 막는 기술이다.
  • 코드나 데이터가 위조·변경된 흔적을 탐지하면, 프로그램이 정상 동작하지 않도록 만들어 불법 이용을 어렵게 한다.
  • 해시 값 검증, 핑거프린트·워터마크 삽입, 원본과의 비교, 프로그램 체킹, 실행 코드 난독화 등의 기법으로 구현한다.
정답 및 해설

탬퍼 프루핑(Tamper Proofing)


[해설]

변조(tamper)를 막는다(proof)는 뜻 그대로, 위·변조를 탐지해 오작동을 유도하는 기술은 탬퍼 프루핑(Tamper Proofing)이다.

해시로 무결성을 검사하고, 난독화로 분석 자체를 어렵게 만들어 크래킹·불법 복제를 억제한다. 표기는 템퍼 프루핑으로 적어도 같은 답이다.

코드를 읽기 어렵게 바꾸는 난독화(Obfuscation)는 탬퍼 프루핑의 구성 기법 중 하나이지 전체 명칭이 아니다.