본문으로 건너뛰기

단원 모의 문제

정보처리기사 목차언어의 특성과 라이브러리문제 11개

22단원 '언어의 특성과 라이브러리'의 세 레슨에서 6문제, 앞 단원(20·21)에서 2문제를 섞었고, 끝에 실기 꼴 3문제가 있습니다. 앞 단원 문제가 어느 레슨인지는 정답을 펼치면 보입니다. 코드의 출력은 C는 clang, Java는 OpenJDK 25, Python은 3.15로 돌린 결과이고, Java의 main 머리는 폰 화면에 맞추려고 두 줄로 썼습니다. 출력을 쓰는 문제는 줄바꿈까지 그대로 씁니다. 실기 꼴은 종이에 답을 끝까지 쓴 뒤 펼치세요. 띄어쓰기만 다르면 같은 답입니다.

문제 1

언어와 갈래를 짝지은 것으로 옳지 않은 것을 고르세요.

  • ① Java — 객체지향
  • ② LISP — 함수형
  • ③ PHP — 스크립트(서버 쪽)
  • ④ C++ — 절차적
정답

④ — C++는 C에 클래스와 객체를 더한 객체지향 언어입니다. 이름에 C가 들어 있어 절차적으로 고르기 쉽습니다.

  • ① 맞습니다. 이름이 닮은 JavaScript처럼 스크립트 언어로 보면 고르게 됩니다. Java는 데이터와 처리를 클래스로 묶는 객체지향 언어입니다.
  • ② 맞습니다. PROLOG와 섞어 논리형으로 보면 고르게 됩니다. LISP는 함수에 값을 넣어 답을 얻는 함수형 언어입니다.
  • ③ 맞습니다. 웹 페이지를 만드는 언어라 브라우저에서 돈다고 보면 고르게 됩니다. PHP는 웹 서버에서 돌아, 만든 HTML만 브라우저로 보냅니다.

다시 볼 레슨: 프로그래밍 언어의 종류

문제 2

개발자가 Python으로 짠 프로그램의 한 줄을 고친 뒤 곧바로 다시 돌려 봅니다. 같은 일을 하는 C 프로그램과 견준 Python 쪽의 (가) 돌리기 전에 할 일과 (나) 같은 일을 할 때의 빠르기로 알맞은 것을 고르세요.

  • ① (가) 고친 소스를 그대로 다시 돌린다 · (나) 대체로 느리다
  • ② (가) 고친 소스를 그대로 다시 돌린다 · (나) 대체로 빠르다
  • ③ (가) 실행 파일부터 다시 만든다 · (나) 대체로 느리다
  • ④ (가) 실행 파일부터 다시 만든다 · (나) 대체로 빠르다
정답

① — 스크립트 언어는 실행 파일을 따로 만들지 않고, 인터프리터가 소스를 읽으며 바로 돌립니다. 그래서 고친 뒤 곧바로 돌려 볼 수 있지만, 돌릴 때마다 읽어 해석하느라 미리 번역해 둔 C보다 대체로 느립니다.

  • ② 고친 뒤 바로 돌릴 수 있으니 도는 것도 빠르다고 봤습니다. 고쳐 보는 빠르기와 같은 일을 하는 빠르기는 다릅니다.
  • ③ 스크립트 언어도 먼저 실행 파일을 만든다고 봤습니다. 실행 파일을 미리 만드는 것은 C 같은 컴파일 언어입니다.
  • ④ C의 모습을 골랐습니다. 소스를 미리 번역해 둔 실행 파일을 돌려 빠른 것은 C 쪽입니다.

다시 볼 레슨: 프로그래밍 언어의 종류

문제 3

같은 선택 정렬을 C와 Python으로 짜서 값 1만 개를 정렬했더니, Python 쪽이 30배쯤 오래 걸렸습니다. (가) C 프로그램과 (나) Python 프로그램의 시간 복잡도로 알맞은 것을 고르세요.

  • ① (가) O(n log n) · (나) O(n²)
  • ② (가) O(n log n) · (나) O(30n²)
  • ③ (가) O(n²) · (나) O(n²)
  • ④ (가) O(n²) · (나) O(30n²)
정답

③ — 시간 복잡도는 걸린 초가 아니라, n이 커질 때 단계 수가 자라는 꼴입니다. 같은 선택 정렬이면 어느 언어로 짜도 두 겹 반복으로 견주는 횟수가 같아 둘 다 O(n²)입니다. 30배는 한 단계에 드는 시간의 차이라, 빅오로 적을 때 버리는 계수에 해당합니다.

  • ① 컴파일하는 C로 짜면 꼴이 낮아진다고 봤습니다. 언어가 바뀌어도 견주는 횟수는 그대로라 꼴도 그대로입니다.
  • ② 두 오해가 겹쳤습니다. C는 꼴이 낮아진다고 봤고, Python에는 30배를 계수로 붙였습니다.
  • ④ 30배 느린 만큼 계수를 붙였습니다. 빅오는 계수와 작은 항을 버리고 가장 빨리 자라는 꼴만 적습니다.

다시 볼 레슨: 알고리즘과 시간 복잡도 · 프로그래밍 언어의 종류

문제 4

다음 C 코드가 컴파일되려면 … 자리에 넣어야 하는 헤더를 모두 고른 것을 고르세요.

…
int main(void) {
    char s[8];
    strcpy(s, "75");
    int n = atoi(s);
    printf("%d\n", n + 5);
    return 0;
}
  • ① stdio.h · string.h
  • ② stdio.h · stdlib.h
  • ③ string.h · stdlib.h
  • ④ stdio.h · string.h · stdlib.h
정답

④ — strcpy는 문자열을 다루는 string.h, atoi는 문자열을 수로 바꾸는 stdlib.h, printf는 표준 입출력인 stdio.h에 들어 있습니다. 하나라도 빠지면 그 함수를 모른다는 컴파일 오류가 납니다. 다 넣은 코드와 실행 결과는 이렇습니다.

#include <stdio.h>
#include <string.h>
#include <stdlib.h>
int main(void) {
    char s[8];
    strcpy(s, "75");
    int n = atoi(s);
    printf("%d\n", n + 5);
    return 0;
}
실행 결과
80
  • ① atoi도 문자열을 다루니 string.h에 있다고 봤습니다. 문자열을 수로 바꾸는 atoi는 stdlib.h에 있습니다.
  • ② 문자열을 옮겨 적는 strcpy를 stdio.h나 stdlib.h의 함수로 봤습니다. 문자열을 다루는 함수는 string.h에 있습니다.
  • ③ printf는 헤더 없이도 쓴다고 봤습니다. Java의 java.lang과 달리 C는 printf를 쓸 때도 stdio.h를 넣어야 합니다.

다시 볼 레슨: 라이브러리와 서식 출력

문제 5

다음 C 코드가 찍는 (가) 첫 줄과 (나) 둘째 줄로 알맞은 것을 고르세요.

#include <stdio.h>
int main(void) {
    double x = 2.71828;
    double y = 9.96;
    printf("[%07.3f]\n", x);
    printf("[%.1f]\n", y);
    return 0;
}
  • ① (가) [002.718] · (나) [9.9]
  • ② (가) [002.718] · (나) [10.0]
  • ③ (가) [0002.718] · (나) [9.9]
  • ④ (가) [0002.718] · (나) [10.0]
정답

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

실행 결과
[002.718]
[10.0]

%07.3f는 소수점 아래 셋째 자리까지 2.718을 만들고, 소수점까지 다섯 칸이라 일곱 칸을 채우려고 앞에 0을 둘 붙입니다. %.1f는 9.96을 소수점 아래 첫째 자리까지 반올림해 10.0을 찍습니다.

  • ① 정밀도가 자리를 잘라 낸다고 봤습니다. 정밀도는 그 자리까지 반올림하므로 9.96은 10.0이 됩니다.
  • ③ 두 오해가 겹쳤습니다. 소수점을 너비에서 뺐고, 정밀도가 자리를 자른다고 봤습니다.
  • ④ 소수점을 너비에서 뺐습니다. 너비 7에는 소수점도 한 칸으로 들어가, 다섯 칸인 2.718 앞에 0이 둘만 붙습니다.

다시 볼 레슨: 라이브러리와 서식 출력

문제 6

Java에서 (가)·(나)를 실행할 때 던져지는 예외로 알맞은 것을 고르세요.

  • (가) int[] a = new int[3]; 다음 줄에서 a[3] = 7;

  • (나) Integer.parseInt("3,000");

  • ① (가) ArrayIndexOutOfBoundsException · (나) NumberFormatException

  • ② (가) ArrayIndexOutOfBoundsException · (나) ArithmeticException

  • ③ (가) NullPointerException · (나) NumberFormatException

  • ④ (가) NullPointerException · (나) ArithmeticException

정답

① — (가)의 배열은 0~2번 칸뿐이라, 3번 칸에 넣으면 배열 번호가 범위 밖이어서 ArrayIndexOutOfBoundsException이 납니다. (나)의 "3,000"은 쉼표가 있어 정수로 바꿀 수 없으므로 NumberFormatException이 납니다.

  • ② (나)를 숫자 계산에서 난 오류로 봤습니다. ArithmeticException은 정수를 0으로 나눌 때 나고, 글자를 수로 바꾸지 못할 때는 NumberFormatException입니다.
  • ③ (가)를 범위 밖 칸이 비어 null이라서 난 오류로 봤습니다. NullPointerException은 null인 참조로 메서드·필드를 쓸 때 납니다. a는 길이 3인 배열을 가리키고 있고, 칸 번호가 범위를 넘었습니다.
  • ④ 두 오해가 겹쳤습니다. 범위 밖 칸을 null로, 글자 바꾸기 실패를 계산 오류로 봤습니다.

다시 볼 레슨: 예외 처리

문제 7

칸 넷짜리 원형 큐입니다. front는 맨 앞 값의 바로 앞 칸, rear는 맨 뒤 값의 칸을 가리키고, 전역 변수라 처음에는 둘 다 0입니다. 다음 C 코드가 찍는 값을 고르세요.

#include <stdio.h>
int q[4], front, rear;
void put(int x) {
    if ((rear + 1) % 4 == front)
        return;
    rear = (rear + 1) % 4;
    q[rear] = x;
}
int main(void) {
    put(1); put(2);
    put(3); put(4);
    front++; put(5);
    printf("%d %d\n", rear,
        q[rear]);
}
  • ① 0 4
  • ② 0 5
  • ③ 3 3
  • ④ 4 5
정답

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

실행 결과
0 5

put은 넣기 전에 (rear + 1) % 4 == front⁠로 가득 찼는지 봅니다. 1·2·3을 넣으면 rear가 3이 되고, put(4)에서는 (3 + 1) % 4가 0이라 front와 같아 넣지 않고 돌아갑니다. 칸 넷에 셋만 든 채 가득 찬 것입니다. 12번 줄의 front++가 맨 앞 값 하나를 꺼낸 것처럼 front를 1로 옮겨 한 칸을 비우고, put(5)는 rear를 0으로 돌려 0번 칸에 5를 넣습니다.

  • ① 칸 넷에 넷을 다 넣는다고 봤습니다. 칸 하나를 늘 비워 두므로 put(4)는 넣지 않고 돌아갑니다. 4가 들어갔다고 보면 put(5)가 거절되어 0 4가 됩니다.
  • ③ front를 옮겨도 여전히 가득 찼다고 봤습니다. front가 1이 되면 (3 + 1) % 4인 0이 front와 달라 5가 들어갑니다.
  • ④ 3번 칸 다음을 4번 칸으로 봤습니다. 배열은 0~3번 칸뿐이라 4번은 범위 밖이고, % 4가 rear를 0번 칸으로 돌려보냅니다. Java였다면 바로 앞 문제의 ArrayIndexOutOfBoundsException이 났을 자리입니다.

다시 볼 레슨: 스택과 큐 · 예외 처리

문제 8

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

public class Main {
  public static void main(
      String[] args) {
    int k = 1, d = 2;
    try {
      k = 6 / (d - 2);
      k = k + 5;
    } catch (Exception e) {
      k = k + 10;
    } finally {
      k = k * 2;
    }
    System.out.println(k);
  }
}
  • ① 11
  • ② 20
  • ③ 22
  • ④ 32
정답

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

실행 결과
22

6번 줄에서 6을 0으로 나누는 순간 ArithmeticException이 던져져 대입까지 가지 못하므로, k는 1 그대로입니다. try의 남은 7번 줄은 건너뛰고, catch가 k를 11로, finally가 22로 만듭니다.

  • ① 예외를 처리했으면 finally는 건너뛴다고 봤습니다. finally는 예외가 났든 안 났든 마지막에 실행됩니다.
  • ② 0으로 나눈 줄에서 k가 0이 된다고 봤습니다. 예외가 던져지면 그 줄의 계산이 끝나지 않아 k에 아무것도 담기지 않습니다.
  • ④ 예외가 난 뒤에도 try의 남은 줄을 마저 실행한다고 봤습니다. 예외가 나면 try의 아래 줄은 건너뛰고 catch로 갑니다.

다시 볼 레슨: 예외 처리

문제 9 (실기)

(가)·(나)에 맞는 언어 갈래의 이름을 영문으로 쓰세요. 답을 끝까지 쓴 뒤 정답을 펼치세요.

  • (가) 게임에서 몬스터의 체력 값과 공격하는 동작을 한 덩어리로 묶어 설계해 두고, 그 설계로 찍어 낸 몬스터 셋이 저마다 제 체력 값을 가지고 공격합니다.
  • (나) 역과 역이 이어져 있다는 사실 여러 개와, '이어진 역으로 갈 수 있고, 갈 수 있는 역에서 이어진 역으로도 갈 수 있다'는 규칙을 적어 둡니다. 그다음 '서울역에서 갈 수 있는 역은?' 하고 물으면 규칙에 맞는 답을 찾아 줍니다.
정답

받는 답: (가) Object-Oriented Programming Language · (나) Logic Language

(가)의 실마리는 '값과 동작을 한 덩어리로 묶은 설계로 저마다 찍어 낸다', (나)는 '사실과 규칙을 적어 두고 질문으로 답을 찾는다'입니다.

  • 같은 이름의 다른 꼴: (가) 객체지향 프로그래밍 언어 · (나) 논리형 언어 — 한글 이름입니다. 문제가 영문으로 물었습니다.
  • 틀리는 꼴 Procedural Programming Language — (가)에: 처리할 차례를 적고 함수로 묶되, 데이터는 따로 둡니다. (가)는 값과 동작을 한 덩어리로 묶습니다.
  • 틀리는 꼴 Functional Language — (나)에: 값을 받아 값을 돌려주는 함수를 겹쳐 답을 만듭니다. (나)는 사실과 규칙에 질문을 던져 답을 찾습니다.
  • 틀리는 꼴 Declarative Language — (나)에: 함수형과 논리형을 함께 품는 큰 갈래의 이름입니다. 질문으로 답을 찾는 갈래 하나의 이름을 물었습니다.

다시 볼 레슨: 프로그래밍 언어의 종류

문제 10 (실기)

트리를 도는 차례로 보아, (가)·(나)에 맞는 순회의 이름을 한글로 쓰세요. 답을 끝까지 쓴 뒤 정답을 펼치세요.

  • (가) 폴더를 통째로 복사할 때, 바깥 폴더를 먼저 만들고 그 안의 하위 폴더들을 하나씩 같은 방법으로 복사합니다.
  • (나) 수식 트리의 값을 구할 때, 노드마다 두 자식의 값을 먼저 구한 뒤에야 그 노드의 연산자로 계산합니다.
정답

받는 답: (가) 전위 순회 · (나) 후위 순회

(가)의 실마리는 '바깥 폴더를 먼저 만들고 그 아래로', (나)는 '두 자식을 모두 마친 뒤에야 자기'입니다.

  • 같은 이름의 다른 꼴: (가) Preorder Traversal · (나) Postorder Traversal — 영문입니다. 문제가 한글로 물었습니다.
  • 틀리는 꼴 중위 순회 — (나)에: 왼쪽 자식 다음에 자기를 처리하고 오른쪽 자식으로 갑니다. (나)는 두 자식을 모두 마친 뒤에 자기를 계산합니다.
  • 틀리는 꼴 후위 표기 — (나)에: 수식 트리를 후위 순회로 읽어 만든 식 꼴의 이름입니다. 도는 차례의 이름을 물었습니다.
  • 틀리는 꼴 깊이 우선 탐색 — (가)에: 그래프에서 한 갈래를 끝까지 따라가는 탐색의 이름입니다. 묻는 것은 트리에서 자기를 언제 처리하느냐로 가르는 순회의 이름입니다.

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

문제 11 (실기)

다음 코드의 실행 결과를 그대로 쓰세요. 답을 끝까지 쓴 뒤 정답을 펼치세요.

def score(s):
    try:
        n = int(s)
    except ValueError:
        print('E', end='')
        return 0
    else:
        return n * 10
    finally:
        print('.', end='')
a = score('7')
b = score('4.5')
c = score('12')
print()
print(a, b, c, sep='/')
print(f'{a + b + c:07.1f}')
정답

받는 답:

실행 결과
.E..
70/0/120
00190.0

score는 int로 바꿀 수 있으면 else에서 10배를 돌려주고, 바꾸지 못하면 except에서 E를 찍고 0을 돌려줍니다. 어느 쪽이든 함수를 떠나기 전에 finally가 점을 찍습니다. '7'은 점 하나, '4.5'는 int가 소수점이 있는 글자를 바꾸지 못해 ValueError라 E와 점, '12'는 점 하나입니다. end가 빈 글이라 네 글자가 한 줄에 이어 찍히고, print()가 줄을 바꿉니다. 둘째 줄은 sep가 '/'라 70/0/120입니다. 셋째 줄은 합 190을 소수점 아래 한 자리로, 소수점까지 일곱 칸에 맞춰 앞에 0을 둘 채웁니다.

  • 틀리는 꼴 첫 줄 E: return이 있으면 finally를 건너뛴다고 봤습니다. finally는 return으로 함수를 떠날 때도 실행됩니다.
  • 틀리는 꼴 ...·70/40/120·00230.0: int('4.5')가 4가 된다고 봤습니다. int는 정수 꼴의 글자만 바꾸고, 소수점이 있으면 ValueError를 던집니다.
  • 틀리는 꼴 셋째 줄 000190.0: 너비 7에서 소수점을 뺐습니다. 소수점도 한 칸이라 다섯 칸인 190.0 앞에 0이 둘입니다.

다시 볼 레슨: 예외 처리 · 라이브러리와 서식 출력

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

정보처리기사 목차로