2025년 12월 10일 수요일

기말고사 대비 C언어 모의고사 풀이

문제 1.

다음 프로그램은 10진수 50을 2진수로 변환하여 8비트로 출력하는 코드이다.

빈칸 ㉠, ㉡에 들어갈 코드를 쓰고, 프로그램 실행 결과를 쓰시오.

#include <stdio.h>

int main(void){
    int bin[8];
    int n = 50;

    for(int i = 7; i >= 0; i--){
        bin[i] = n % 2;
        n = n / ㉠;
    }

    for(int i = 0; i < 8; i++)
        printf("%d", ㉡);

    return 0;
}
답:
㉠: 2
㉡: bin[i]
실행 결과: 00110010
풀이:
10진수를 2진수로 변환하는 과정입니다. 10진수를 2로 계속 나누며 나머지(비트)를 배열에 저장합니다.
50 ÷ 2 = 25 나머지 0
25 ÷ 2 = 12 나머지 1
12 ÷ 2 = 6 나머지 0
6 ÷ 2 = 3 나머지 0
3 ÷ 2 = 1 나머지 1
1 ÷ 2 = 0 나머지 1
따라서 50은 2진수로 110010이며, 8비트 형식이므로 앞에 0을 채워 00110010으로 출력합니다.

문제 2.

다음 프로그램을 실행했을 때 화면에 출력되는 두 개의 정수를 위에서부터 차례대로 쓰시오.

#include <stdio.h>

int main(void){
    int a[] = {8, 14, 22, 31, 47, 53};
    int *p = a + 2;
    int *q = a + 4;

    printf("%d\n", *(q - 3) + *p);

    p = a;
    q = p + 4;
    printf("%d\n", *q - *(p + 1));

    return 0;
}
답:
첫 번째 출력: 36
두 번째 출력: 33
풀이:
배열: {8, 14, 22, 31, 47, 53} (인덱스 0~5)

첫 번째 출력:
- p = a + 2 → p는 a[2] (22)를 가리킴
- q = a + 4 → q는 a[4] (47)을 가리킴
- *(q - 3)은 q 위치(인덱스 4)에서 3칸 앞인 a[4-3] = a[1] (14)를 의미
- 따라서 *(q - 3) + *p = 14 + 22 = 36

두 번째 출력:
- p = a → p는 a[0] (8)을 가리킴
- q = p + 4 → q는 a[4] (47)을 가리킴
- *q = 47
- *(p + 1) = a[1] = 14
- 47 - 14 = 33

문제 3.

다음 프로그램은 배열을 선택 정렬로 오름차순 정렬한 후, 값 42를 이진 탐색으로 찾아 위치를 출력하는 코드이다.

(1) ㉠에 들어갈 while문의 조건식을 쓰고,

(2) ㉡에 들어갈 비교 연산자를 쓰고,

(3) 프로그램 실행 결과로 출력되는 정수를 쓰시오.

#include <stdio.h>

int main(void){
    int x[] = {42, 7, 19, 56, 33};
    int n = 5;
    int key = 42;
    int l = 0, r = n - 1, m;

    for(int i = 0; i < n - 1; i++){
        int idx = i;
        for(int j = i + 1; j < n; j++)
            if(x[j] < x[idx])
                idx = j;
        int t = x[i];
        x[i] = x[idx];
        x[idx] = t;
    }

    while(㉠){
        m = (l + r) / 2;

        if(key == x[m]) break;
        else if(key < x[m])
            r = m - 1;
        else
            l = m + 1;
    }

    if(key ㉡ x[m])
        printf("%d\n", m);

    return 0;
}
답:
(1) ㉠: l <= r
(2) ㉡: ==
(3) 실행 결과: 3
풀이:
선택 정렬 과정:
초기 배열: {42, 7, 19, 56, 33}
1회전: {7, 42, 19, 56, 33}
2회전: {7, 19, 42, 56, 33}
3회전: {7, 19, 33, 56, 42}
4회전: {7, 19, 33, 42, 56}

이진 탐색 과정:
정렬된 배열 {7, 19, 33, 42, 56}에서 42를 찾습니다.
- l=0, r=4, m=2 → x[2]=33 < 42 → l=3
- l=3, r=4, m=3 → x[3]=42 (찾음!)
따라서 42는 인덱스 3에 위치합니다.

문제 4.

다음 프로그램은 3×3 정수 배열의 각 행에서 가장 작은 값을 찾아 출력하는 코드이다.

(1) ㉠, ㉡에 들어갈 코드를 쓰고,

(2) 프로그램 실행 결과로 출력되는 세 정수를 순서대로 쓰시오.

#include <stdio.h>

int main(void){
    int d[3][3] = {
        {9, 4, 7},
        {2, 15, 3},
        {6, 8, 1}
    };

    for(int i = 0; i < 3; i++){
        int m = ㉠;
        for(int j = 0; j < 3; j++)
            if(d[i][j] < m)
                m = d[i][j];
        printf("%d ", ㉡);
    }

    return 0;
}
답:
(1) ㉠: d[i][0]
(1) ㉡: m
(2) 실행 결과: 4 2 1
풀이:
각 행의 첫 번째 요소를 초기 최솟값으로 설정하고, 나머지 요소들과 비교합니다.
1행: {9, 4, 7} → 최솟값 4
2행: {2, 15, 3} → 최솟값 2
3행: {6, 8, 1} → 최솟값 1

문제 5.

다음 프로그램은 정수 5개를 입력받아 평균을 구하고, 값의 구간별 개수를 출력하는 코드이다.

사용자가 순서대로 70 55 90 40 50을 입력한다고 할 때,

(1) ㉠, ㉡, ㉢, ㉣에 들어갈 코드를 쓰고,

(2) 프로그램 실행 결과를 모두 쓰시오.

#include <stdio.h>

int main(void){
    int v[5];
    int tot = 0;
    int big = 0, mid = 0, small = 0;

    for(int i = 0; i < 5; i++){
        printf("%d번째 값: ", ㉠);
        scanf("%d", ㉡);
        tot += v[i];

        if(㉢)
            big++;
        else if(v[i] >= 30)
            mid++;
        else
            small++;
    }

    printf("평균: %d\n", ㉣);
    printf("50 이상: %d\n", big);
    printf("30~49: %d\n", mid);
    printf("30 미만: %d\n", small);

    return 0;
}
답:
(1) ㉠: i + 1
(1) ㉡: &v[i]
(1) ㉢: v[i] >= 50
(1) ㉣: tot / 5
(2) 실행 결과:
평균: 61
50 이상: 4
30~49: 1
30 미만: 0
풀이:
입력값: 70, 55, 90, 40, 50
합계: 70 + 55 + 90 + 40 + 50 = 305
평균: 305 / 5 = 61

구간별 분류:
- 50 이상: 70, 55, 90, 50 → 4개
- 30~49: 40 → 1개
- 30 미만: (없음) → 0개

문제 6.

다음 프로그램은 먼저 학생 수를 입력받고, 각 학생의 학번과 점수를 입력받은 뒤, 입력된 점수 중 최저 점수를 출력하는 코드이다.

입력이 다음과 같다고 할 때,

  • 첫 줄: 학생 수 4
  • 이후 입력(학번, 점수 순서로 4명):
    • 101 76
    • 102 88
    • 103 69
    • 104 90

(1) ㉠, ㉡, ㉢에 들어갈 코드를 쓰고,
(2) 프로그램 실행 결과로 출력되는 값을 쓰시오.

#include <stdio.h>
#define MAX 10

int main(void){
    int id[MAX], sc[MAX];
    int n;
    int min = 101;

    scanf("%d", &n);

    for(int i = 0; ㉠; i++){
        scanf("%d", &id[i]);
        scanf("%d", &sc[i]);

        if(㉡)
            min = sc[i];
    }

    printf("%d\n", ㉢);

    return 0;
}
답:
(1) ㉠: i < n
(1) ㉡: sc[i] < min
(1) ㉢: min
(2) 실행 결과: 69
풀이:
1. 조건식(㉠): 0부터 시작하는 인덱스 i가 입력받은 학생 수 n보다 작을 때까지 반복해야 하므로 i < n입니다.
2. 최솟값 갱신(㉡): 현재 입력받은 점수 sc[i]가 기존의 최솟값 min보다 작다면 min을 갱신해야 하므로 sc[i] < min입니다.
3. 출력(㉢): 최종적으로 구해진 최저 점수 변수 min을 출력합니다.

비교 과정 (초기 min = 101):
- 76 < 101 (참) → min = 76
- 88 < 76 (거짓)
- 69 < 76 (참) → min = 69
- 90 < 69 (거짓)
따라서 최저 점수는 69입니다.

문제 7.

다음 프로그램은 입력받은 정수 n의 팩토리얼(n! = 1 × 2 × ... × n)을 구하는 코드이다.
사용자가 정수 4를 입력했다고 할 때,
(1) ㉠, ㉡에 들어갈 코드를 쓰고,
(2) 프로그램 실행 결과를 쓰시오.

#include <stdio.h>

int main(void){
    int n;
    int res = 1;

    printf("정수 입력: ");
    scanf("%d", &n);

    for(int i = 1; i <= n; i++){
        ㉠
    }

    printf("%d", ㉡);

    return 0;
}
답:
(1) ㉠: res = res * i; (또는 res *= i;)
(1) ㉡: res
(2) 실행 결과: 24
풀이:
팩토리얼(n!)은 1부터 n까지의 정수를 모두 곱한 값입니다.

1. 변수 res는 곱셈의 항등원인 1로 초기화되어 있습니다.
2. 반복문이 1부터 n까지 순회하며, 빈칸 ㉠에서 현재의 i 값을 res에 계속 곱해서 누적해야 합니다.
3. 따라서 res = res * i; 또는 복합 대입 연산자를 사용한 res *= i;가 들어갑니다.

계산 과정 (입력 4):
- i=1: res = 1 × 1 = 1
- i=2: res = 1 × 2 = 2
- i=3: res = 2 × 3 = 6
- i=4: res = 6 × 4 = 24

문제 8.

다음 프로그램을 실행했을 때 화면에 출력되는 두 개의 정수를 위에서부터 차례대로 쓰시오.

#include <stdio.h>

int main(void){
    int arr[] = {3, 6, 9, 12, 15};
    int *p = &arr[1]; 
    int *q = arr + 4; 

    printf("%d\n", *q - *p);

    p++; 
    q = q - 2; 
    printf("%d\n", *p + *q);

    return 0;
}
답:
첫 번째 출력: 9
두 번째 출력: 18
풀이:
첫 번째 출력:
- p = &arr[1] → p는 arr[1] (6)을 가리킴
- q = arr + 4 → q는 arr[4] (15)를 가리킴
- *q - *p = 15 - 6 = 9

두 번째 출력:
- p++ → p는 arr[2] (9)를 가리킴
- q = q - 2 → q는 arr[2] (9)를 가리킴
- *p + *q = 9 + 9 = 18

문제 9.

다음 프로그램은 배열에서 가장 큰 값(최댓값)의 인덱스(위치)를 찾아 출력하는 코드이다.

(1) ㉠에 들어갈 비교 연산자를 쓰고,

(2) ㉡에 들어갈 코드를 쓰고,

(3) 프로그램 실행 결과로 출력되는 정수를 쓰시오.

#include <stdio.h>

int main(void){
    int data[] = {12, 45, 7, 23, 56, 9};
    int n = 6;
    int max_idx = 0;

    for(int i = 1; i < n; i++){
        if(data[i] ㉠ data[max_idx]){
            max_idx = ㉡;
        }
    }

    printf("%d\n", max_idx);

    return 0;
}
답:
(1) ㉠: >
(2) ㉡: i
(3) 실행 결과: 4
풀이:
배열: {12, 45, 7, 23, 56, 9}

비교 과정:
- i=1: data[1]=45 > data[0]=12 → max_idx = 1
- i=2: data[2]=7 > data[1]=45 (거짓)
- i=3: data[3]=23 > data[1]=45 (거짓)
- i=4: data[4]=56 > data[1]=45 → max_idx = 4
- i=5: data[5]=9 > data[4]=56 (거짓)

가장 큰 값 56은 인덱스 4에 있습니다.

문제 10.

다음 프로그램은 2행 3열 배열의 모든 요소를 순회하며 10보다 큰 수의 합계를 구하는 코드이다.

(1) ㉠, ㉡에 들어갈 코드를 쓰고,

(2) 프로그램 실행 결과를 쓰시오.

#include <stdio.h>

int main(void){
    int arr[2][3] = {
        {5, 12, 8},
        {15, 3, 20}
    };
    int sum = 0;

    for(int i = 0; i < 2; i++){
        for(int j = 0; j < 3; j++){
            if(arr[i][j] > 10)
                sum += ㉠;
        }
    }

    printf("%d", ㉡);

    return 0;
}
답:
(1) ㉠: arr[i][j]
(1) ㉡: sum
(2) 실행 결과: 47
풀이:
배열 요소 중 10보다 큰 값들을 찾습니다.

10보다 큰 값:
- arr[0][1] = 12
- arr[1][0] = 15
- arr[1][2] = 20

합계: 12 + 15 + 20 = 47

문제 11.

다음 프로그램은 정수 5개가 저장된 배열을 역순(거꾸로)으로 뒤집는 코드이다.

(1) ㉠, ㉡에 들어갈 코드를 쓰고,

(2) 프로그램 실행 결과를 모두 쓰시오.

#include <stdio.h>

int main(void){
    int arr[5] = {1, 2, 3, 4, 5};
    int temp;

    for(int i = 0; i < 2; i++){
        temp = arr[i];
        arr[i] = arr[4 - i];
        arr[4 - i] = ㉠;
    }

    for(int i = 0; i < 5; i++)
        printf("%d ", ㉡);

    return 0;
}
답:
(1) ㉠: temp
(1) ㉡: arr[i]
(2) 실행 결과: 5 4 3 2 1
풀이:
배열의 양 끝 요소를 교환하여 역순으로 만듭니다.

교환 과정:
- i=0: arr[0]과 arr[4] 교환 → {5, 2, 3, 4, 1}
- i=1: arr[1]과 arr[3] 교환 → {5, 4, 3, 2, 1}

※ 중간 요소(arr[2])는 교환 불필요

문제 12.

다음 프로그램은 1부터 입력받은 정수 n까지의 합(누적 합)을 구하여 출력하는 코드이다.
사용자가 정수 5를 입력했다고 할 때,
(1) 빈칸 ㉠, ㉡에 들어갈 코드를 쓰고,
(2) 프로그램 실행 결과를 쓰시오.

#include <stdio.h>

int main(void){
    int n, sum = 0;
    
    printf("정수 입력: ");
    scanf("%d", &n);

    for(int i = 1; ㉠ ; i++){
        ㉡
    }

    printf("%d", sum);

    return 0;
}
답:
(1) ㉠: i <= n
(1) ㉡: sum += i; (또는 sum = sum + i;)
(2) 실행 결과: 15
풀이:
1부터 n까지의 정수를 순차적으로 더하는 과정입니다.

1. 조건식(㉠): 변수 i가 1부터 시작하여 입력받은 수 n까지 반복해야 하므로 i <= n이 됩니다.
2. 실행문(㉡): 반복할 때마다 현재의 i 값을 sum에 더해서 저장해야 하므로 sum += i;가 됩니다.

계산 과정 (입력 5):
- i=1: sum = 0 + 1 = 1
- i=2: sum = 1 + 2 = 3
- i=3: sum = 3 + 3 = 6
- i=4: sum = 6 + 4 = 10
- i=5: sum = 10 + 5 = 15

문제 13.

다음 프로그램을 실행했을 때 화면에 출력되는 두 개의 정수를 위에서부터 차례대로 쓰시오.

#include <stdio.h>

int main(void){
    int arr[] = {10, 20, 30, 40, 50};
    int *p = arr;      
    int *q = arr + 3;  

    printf("%d\n", *(p + 1) + *q);

    p++;
    q--;
    printf("%d\n", *q - *p);

    return 0;
}
답:
첫 번째 출력: 60
두 번째 출력: 10
풀이:
첫 번째 출력:
- p = arr → p는 arr[0] (10)을 가리킴
- q = arr + 3 → q는 arr[3] (40)을 가리킴
- *(p + 1) = arr[1] = 20
- *q = 40
- 20 + 40 = 60

두 번째 출력:
- p++ → p는 arr[1] (20)을 가리킴
- q-- → q는 arr[2] (30)을 가리킴
- *q - *p = 30 - 20 = 10

문제 14.

다음 프로그램은 정수 배열을 버블 정렬(Bubble Sort)을 이용하여 오름차순으로 정렬하는 코드이다.

(1) ㉠에 들어갈 비교 연산자를 쓰고,

(2) ㉡에 들어갈 변수명을 쓰고,

(3) 프로그램 실행 결과로 출력되는 정수를 쓰시오.

#include <stdio.h>

int main(void){
    int a[] = {8, 3, 5, 1, 9};
    int n = 5;
    int temp;

    for(int i = 0; i < n - 1; i++){
        for(int j = 0; j < n - 1 - i; j++){
            if(a[j] ㉠ a[j+1]){
                temp = a[j];
                a[j] = a[j+1];
                a[j+1] = ㉡;
            }
        }
    }

    printf("%d\n", a[2]); 

    return 0;
}
답:
(1) ㉠: >
(2) ㉡: temp
(3) 실행 결과: 5
풀이:
버블 정렬을 통해 오름차순으로 정렬합니다.

정렬 과정:
초기: {8, 3, 5, 1, 9}
1회전: {3, 5, 1, 8, 9}
2회전: {3, 1, 5, 8, 9}
3회전: {1, 3, 5, 8, 9}
4회전: {1, 3, 5, 8, 9}

정렬 후 a[2] = 5

문제 15.

다음 프로그램은 3×3 정수 배열의 대각선 요소(왼쪽 위에서 오른쪽 아래로)의 합계를 구하는 코드이다.

(1) ㉠, ㉡에 들어갈 코드를 쓰고,

(2) 프로그램 실행 결과를 쓰시오.

#include <stdio.h>

int main(void){
    int m[3][3] = {
        {10, 2, 3},
        {4, 20, 6},
        {7, 8, 30}
    };
    int sum = 0;

    for(int i = 0; i < 3; i++){
        sum += ㉠;
    }

    printf("%d", ㉡);

    return 0;
}
답:
(1) ㉠: m[i][i]
(1) ㉡: sum
(2) 실행 결과: 60
풀이:
주 대각선 요소는 행과 열의 인덱스가 같은 요소입니다.

대각선 요소:
- m[0][0] = 10
- m[1][1] = 20
- m[2][2] = 30

합계: 10 + 20 + 30 = 60

문제 16.

다음 프로그램은 정수 5개를 입력받아 그중 짝수의 개수와 홀수의 합을 출력하는 코드이다.

사용자가 순서대로 2 5 8 11 14를 입력한다고 할 때,

(1) ㉠, ㉡, ㉢에 들어갈 코드를 쓰고,

(2) 프로그램 실행 결과를 모두 쓰시오.

#include <stdio.h>

int main(void){
    int num[5];
    int even_cnt = 0;
    int odd_sum = 0;

    for(int i = 0; i < 5; i++){
        scanf("%d", &num[i]);

        if(num[i] % 2 ㉠ 0)
            even_cnt++;
        else
            odd_sum ㉡ num[i];
    }

    printf("짝수 개수: %d\n", ㉢);
    printf("홀수 합: %d\n", odd_sum);

    return 0;
}
답:
(1) ㉠: ==
(1) ㉡: +=
(1) ㉢: even_cnt
(2) 실행 결과:
짝수 개수: 3
홀수 합: 16
풀이:
입력값: 2, 5, 8, 11, 14

짝수: 2, 8, 14 → 3개
홀수: 5, 11 → 합: 5 + 11 = 16

문제 17.

다음 프로그램은 10진수 37을 2진수로 변환하여 8비트로 출력하는 코드이다.
빈칸 ㉠, ㉡에 들어갈 코드를 쓰고, 프로그램 실행 결과를 쓰시오.

#include <stdio.h>

int main(void){
    int bin[8];
    ㉠;

    for(int i = 7; i >= 0; i--){
        bin[i] = n % 2;
        ㉡;
    }

    for(int i = 0; i < 8; i++)
        printf("%d", bin[i]);

    return 0;
}
답:
㉠: int n = 37
㉡: n = n / 2 (또는 n /= 2)
실행 결과: 00100101
풀이:
10진수 37을 2진수로 변환하는 과정입니다.

1. 변수 선언(㉠): 코드에서 n이라는 변수를 사용하고 있으나 선언되지 않았습니다. 문제에서 10진수 37을 변환한다고 했으므로, int n = 37로 변수 선언과 동시에 값을 대입해야 합니다.
2. 값 갱신(㉡): 2진수 변환을 위해 현재의 n을 2로 나눈 몫을 다시 n에 저장해야 다음 자릿수를 계산할 수 있습니다. 따라서 n = n / 2;가 됩니다.

변환 과정:
- 37 ÷ 2 = 18 ... 나머지 1 (bin[7])
- 18 ÷ 2 = 9 ... 나머지 0 (bin[6])
- 9 ÷ 2 = 4 ... 나머지 1 (bin[5])
- 4 ÷ 2 = 2 ... 나머지 0 (bin[4])
- 2 ÷ 2 = 1 ... 나머지 0 (bin[3])
- 1 ÷ 2 = 0 ... 나머지 1 (bin[2])
- 이후 0은 계속 0 ... (bin[1], bin[0])

출력(0부터 7까지): 앞쪽 빈칸은 0으로 채워져 00100101이 출력됩니다.

문제 18.

다음 프로그램을 실행했을 때 화면에 출력되는 두 개의 정수를 위에서부터 차례대로 쓰시오.

#include <stdio.h>

int main(void){
    int a[] = {3, 5, 9, 12, 20, 25};
    int *p = a + 1;
    int *q = a + 4;

    printf("%d\n", *q - *(p - 1));

    p = a + 2;
    q = a + 3;
    printf("%d\n", *q + *(p + 1));

    return 0;
}
답:
첫 번째 출력: 17
두 번째 출력: 24
풀이:
첫 번째 출력:
- p = a + 1 → p는 a[1] (5)를 가리킴
- q = a + 4 → q는 a[4] (20)을 가리킴
- *(p - 1) = a[0] = 3
- *q = 20
- 20 - 3 = 17

두 번째 출력:
- p = a + 2 → p는 a[2] (9)를 가리킴
- q = a + 3 → q는 a[3] (12)를 가리킴
- *(p + 1) = a[3] = 12
- *q = 12
- 12 + 12 = 24

문제 19.

다음 프로그램은 정수 배열을 선택 정렬로 오름차순 정렬한 후, 값 25를 선형 탐색으로 찾아 위치를 출력하는 코드이다.

(1) ㉠에 들어갈 while문의 조건식을 쓰고,

(2) ㉡에 들어갈 if문의 조건식을 쓰고,

(3) 프로그램 실행 결과로 출력되는 정수를 쓰시오.

#include <stdio.h>

int main(void){
    int x[] = {30, 12, 7, 25, 18};
    int n = 5;
    int key = 25;
    int pos = -1;

    for(int i = 0; i < n - 1; i++){
        int idx = i;
        for(int j = i + 1; j < n; j++)
            if(x[j] < x[idx])
                idx = j;
        int t = x[i];
        x[i] = x[idx];
        x[idx] = t;
    }

    int i = 0;
    while(㉠){
        if(x[i] == key){
            pos = i;
            break;
        }
        i++;
    }

    if(㉡)
        printf("%d\n", pos);

    return 0;
}
답:
(1) ㉠: i < n
(2) ㉡: pos != -1
(3) 실행 결과: 3
풀이:
선택 정렬 과정:
초기 배열: {30, 12, 7, 25, 18}
정렬 결과: {7, 12, 18, 25, 30}

선형 탐색:
25를 찾습니다. 정렬된 배열에서 25는 인덱스 3에 위치합니다.

문제 20.

다음 프로그램은 3×3 정수 배열의 각 열에서 가장 큰 값을 찾아 출력하는 코드이다.

(1) ㉠, ㉡에 들어갈 코드를 쓰고,

(2) 프로그램 실행 결과로 출력되는 세 정수를 순서대로 쓰시오.

#include <stdio.h>

int main(void){
    int d[3][3] = {
        {5, 9, 2},
        {11, 4, 7},
        {6, 8, 10}
    };

    for(int j = 0; j < 3; j++){
        int m = ㉠;
        for(int i = 0; i < 3; i++)
            if(d[i][j] > m)
                m = d[i][j];
        printf("%d ", ㉡);
    }

    return 0;
}
답:
(1) ㉠: d[0][j]
(1) ㉡: m
(2) 실행 결과: 11 9 10
풀이:
각 열(세로)의 최댓값을 구합니다.

1열(j=0): {5, 11, 6} → 최댓값 11
2열(j=1): {9, 4, 8} → 최댓값 9
3열(j=2): {2, 7, 10} → 최댓값 10

문제 21.

다음 프로그램은 정수 5개를 입력받아 평균을 구하고, 값의 구간별 개수를 출력하는 코드이다.

사용자가 순서대로 80 35 70 55 20을 입력한다고 할 때,

(1) ㉠, ㉡, ㉢, ㉣에 들어갈 코드를 쓰고,

(2) 프로그램 실행 결과를 모두 쓰시오.

#include <stdio.h>

int main(void){
    int v[5];
    int tot = 0;
    int high = 0, mid = 0, low = 0;

    for(int i = 0; i < 5; i++){
        printf("%d번째 값: ", ㉠);
        scanf("%d", ㉡);
        tot += v[i];

        if(㉢)
            high++;
        else if(v[i] >= 40)
            mid++;
        else
            low++;
    }

    printf("평균: %d\n", ㉣);
    printf("70 이상: %d\n", high);
    printf("40~69: %d\n", mid);
    printf("40 미만: %d\n", low);

    return 0;
}
답:
(1) ㉠: i + 1
(1) ㉡: &v[i]
(1) ㉢: v[i] >= 70
(1) ㉣: tot / 5
(2) 실행 결과:
평균: 52
70 이상: 2
40~69: 1
40 미만: 2
풀이:
입력값: 80, 35, 70, 55, 20
합계: 80 + 35 + 70 + 55 + 20 = 260
평균: 260 / 5 = 52

구간별 분류:
- 70 이상: 80, 70 → 2개
- 40~69: 55 → 1개
- 40 미만: 35, 20 → 2개

문제 22.

다음 프로그램은 먼저 학생 수를 입력받고, 각 학생의 학번과 점수를 입력받은 뒤, 입력된 점수 중 최고 점수를 받은 학생의 학번을 출력하는 코드이다.

입력이 다음과 같다고 할 때,

  • 첫 줄: 학생 수 4
  • 이후 입력(학번, 점수 순서로 4명):
    • 101 76
    • 102 88
    • 103 69
    • 104 90

(1) ㉠, ㉡, ㉢에 들어갈 코드를 쓰고,

(2) 프로그램 실행 결과로 출력되는 값을 쓰시오.

#include <stdio.h>
#define MAX 10

int main(void){
    int id[MAX], sc[MAX];
    int n;
    int max = -1;
    int max_id = 0;

    scanf("%d", &n);

    for(int i = 0; i < ㉠; i++){
        scanf("%d", &id[i]);
        scanf("%d", &sc[i]);

        if(㉡){
            max = sc[i];
            max_id = id[i];
        }
    }

    printf("%d\n", ㉢);

    return 0;
}
답:
(1) ㉠: n
(1) ㉡: sc[i] > max
(1) ㉢: max_id
(2) 실행 결과: 104
풀이:
입력: 101 76, 102 88, 103 69, 104 90

비교 과정:
- sc[0] = 76 > -1 → max = 76, max_id = 101
- sc[1] = 88 > 76 → max = 88, max_id = 102
- sc[2] = 69 > 88 (거짓)
- sc[3] = 90 > 88 → max = 90, max_id = 104

최고 점수 90점을 받은 학생의 학번은 104입니다.

문제 23.

다음 프로그램은 크기가 5인 정수 배열의 모든 요소를 왼쪽으로 한 칸씩 이동(회전)시키고, 맨 앞에 있던 값은 맨 뒤로 이동시키는 코드이다.
(1) ㉠, ㉡에 들어갈 코드를 쓰고,
(2) 프로그램 실행 결과를 모두 쓰시오.

#include <stdio.h>

int main(void){
    int a[5] = {10, 20, 30, 40, 50};
    int temp = a[0];

    for(int i = 0; i < 4; i++){
        a[i] = ㉠;
    }
    a[4] = ㉡;

    for(int i = 0; i < 5; i++)
        printf("%d ", a[i]);

    return 0;
}
답:
(1) ㉠: a[i + 1]
(1) ㉡: temp
(2) 실행 결과: 20 30 40 50 10
풀이:
배열의 요소를 왼쪽으로 한 칸씩 당기는(Shift) 알고리즘입니다.

1. 초기 저장: temp = a[0]을 통해 맨 앞의 값(10)을 임시 변수에 보관합니다. (덮어쓰기 방지)
2. 이동(㉠): 반복문을 통해 뒤에 있는 요소 a[i+1]을 앞의 요소 a[i]로 덮어씁니다.
- a[0] = a[1] (20)
- a[1] = a[2] (30)
- a[2] = a[3] (40)
- a[3] = a[4] (50)
3. 마무리(㉡): 반복문이 끝나면 맨 마지막 자리(a[4])가 비게 되므로(엄밀히 말하면 복사된 값), 보관해두었던 첫 번째 값 temp(10)를 대입합니다.

따라서 {10, 20, 30, 40, 50} → {20, 30, 40, 50, 10}이 됩니다.

문제 24.

다음 프로그램에서 포인터 연산을 이용하여 배열의 값을 계산하는 코드이다. 프로그램 실행 결과로 출력되는 두 개의 정수를 위에서부터 차례대로 쓰시오.

#include <stdio.h>

int main(void){
    int a[] = {5, 12, 20, 27, 35, 42};
    int *p = a + 1;
    int *q = a + 4;

    printf("%d\n", *(q - 2) + 5);

    p = a;
    printf("%d\n", *(p + 3));

    return 0;
}
답:
첫 번째 출력: 25
두 번째 출력: 27
풀이:
첫 번째 출력:
- q = a + 4 → q는 a[4] (35)를 가리킴
- *(q - 2) = a[2] = 20
- 20 + 5 = 25

두 번째 출력:
- p = a → p는 a[0]을 가리킴
- *(p + 3) = a[3] = 27

문제 25.

다음 프로그램은 배열을 버블 정렬로 오름차순 정렬한 뒤, 값 25의 위치(인덱스)를 출력하는 코드이다.
(1) ㉠, ㉡에 들어갈 for문의 조건식을 쓰고,
(2) 프로그램 실행 결과로 출력되는 정수를 쓰시오.

#include <stdio.h>

int main(void){
    int x[] = {25, 9, 31, 17, 40};
    int n = 5;
    int key = 25;
    int idx = -1;

    for(int i = 0; ㉠; i++){
        for(int j = 0; ㉡; j++){
            if(x[j] > x[j + 1]){
                int t = x[j];
                x[j] = x[j + 1];
                x[j + 1] = t;
            }
        }
    }

    for(int i = 0; i < n; i++){
        if(x[i] == key){
            idx = i;
            break;
        }
    }

    if(idx != -1)
        printf("%d\n", idx);

    return 0;
}
답:
(1) ㉠: i < n - 1
(1) ㉡: j < n - 1 - i
(2) 실행 결과: 2
풀이:
버블 정렬(Bubble Sort)을 수행하여 오름차순으로 정렬하는 과정입니다.

1. 바깥쪽 반복문(㉠): 배열의 요소가 n개일 때, 정렬을 완료하기 위해 총 n-1회의 회전(pass)이 필요합니다. 따라서 조건식은 i < n - 1이 됩니다.
2. 안쪽 반복문(㉡): 각 회전마다 가장 큰 수가 맨 뒤로 이동하여 고정되므로, 비교해야 할 요소의 개수는 하나씩 줄어듭니다. 따라서 전체 길이에서 현재 회전수(i)와 1을 뺀 범위까지 반복해야 하므로 j < n - 1 - i가 됩니다.

정렬 과정:
- 초기 배열: {25, 9, 31, 17, 40}
- 정렬 완료: {9, 17, 25, 31, 40}

정렬된 배열에서 값 25는 인덱스 2에 위치합니다.

문제 26.

다음 프로그램은 3×3 정수 배열에서 각 행의 합을 구하여 출력하는 코드이다.
(1) ㉠, ㉡에 들어갈 코드를 쓰고,
(2) 프로그램 실행 결과로 출력되는 세 정수를 순서대로 쓰시오.

#include <stdio.h>

int main(void){
    int d[3][3] = {
        {2, 5, 7},
        {4, 1, 9},
        {6, 3, 8}
    };

    for(int i = 0; i < 3; i++){
        int s = 0;
        for(int j = 0; j < 3; j++)
            ㉠
        printf("%d ", ㉡);
    }

    return 0;
}
답:
(1) ㉠: s += d[i][j];
(1) ㉡: s
(2) 실행 결과: 14 14 17
풀이:
이중 반복문을 사용하여 2차원 배열의 각 행(row)의 합계를 구하는 과정입니다.

1. 바깥쪽 반복문(i)이 각 행을 순회할 때마다 합계 변수 s를 0으로 초기화합니다.
2. 안쪽 반복문(j)에서는 해당 행(i)의 모든 열(0~2)을 순회합니다.
3. 따라서 빈칸 ㉠에는 현재 행(i)과 열(j)의 값 d[i][j]를 s에 계속 더해주는 누적 연산 코드 s += d[i][j];가 들어가야 합니다.

1행(i=0): 2 + 5 + 7 = 14
2행(i=1): 4 + 1 + 9 = 14
3행(i=2): 6 + 3 + 8 = 17

문제 27.

다음 프로그램은 정수 4개를 입력받아 평균을 구하고, 점수 구간별로 개수를 세어 출력하는 코드이다.

사용자가 순서대로 85 60 45 90을 입력한다고 할 때,

(1) ㉠, ㉡, ㉢에 들어갈 코드를 쓰고,

(2) 프로그램 실행 결과를 모두 쓰시오.

#include <stdio.h>

int main(void){
    int v[4];
    int tot = 0;
    int high = 0, mid = 0, low = 0;

    for(int i = 0; i < 4; i++){
        scanf("%d", &v[i]);
        tot += ㉠;

        if(v[i] >= 80)
            high++;
        else if(㉡)
            mid++;
        else
            low++;
    }

    printf("평균: %d\n", tot / ㉢);
    printf("80 이상: %d\n", high);
    printf("60~79: %d\n", mid);
    printf("60 미만: %d\n", low);

    return 0;
}
답:
(1) ㉠: v[i]
(1) ㉡: v[i] >= 60
(1) ㉢: 4
(2) 실행 결과:
평균: 70
80 이상: 2
60~79: 1
60 미만: 1
풀이:
입력값: 85, 60, 45, 90
합계: 85 + 60 + 45 + 90 = 280
평균: 280 / 4 = 70

구간별 분류:
- 80 이상: 85, 90 → 2개
- 60~79: 60 → 1개
- 60 미만: 45 → 1개

문제 28.

다음 프로그램은 먼저 학생 수를 입력받고, 각 학생의 학번과 점수를 입력받은 뒤, 최댓값을 가진 학생의 학번을 출력하는 코드이다.

입력이 다음과 같다고 할 때,

  • 첫 줄: 학생 수 4
  • 이후 입력(학번, 점수 순서로 4명):
    • 201 70
    • 202 95
    • 203 88
    • 204 95

(1) ㉠, ㉡, ㉢에 들어갈 코드를 쓰고,

(2) 프로그램 실행 결과로 출력되는 값을 쓰시오.

#include <stdio.h>
#define MAX 10

int main(void){
    int id[MAX], sc[MAX];
    int n;
    int max = -1;
    int max_id = 0;

    scanf("%d", &n);

    for(int i = 0; i < n; i++){
        scanf("%d", &id[i]);
        scanf("%d", &sc[i]);

        if(㉠){
            max = sc[i];
            ㉡ = id[i];
        }
    }

    printf("%d\n", ㉢);

    return 0;
}
답:
(1) ㉠: sc[i] > max
(1) ㉡: max_id
(1) ㉢: max_id
(2) 실행 결과: 202
풀이:
입력: 201 70, 202 95, 203 88, 204 95

비교 과정:
- sc[0] = 70 > -1 → max = 70, max_id = 201
- sc[1] = 95 > 70 → max = 95, max_id = 202
- sc[2] = 88 > 95 (거짓)
- sc[3] = 95 > 95 (거짓)

※ 비교 연산자가 >이므로 같은 점수일 때는 첫 번째로 나타난 학생의 학번이 유지됩니다.
따라서 95점을 받은 학생 중 먼저 입력된 202번이 출력됩니다.

2025년 12월 9일 화요일

기말고사 대비 C언어 모의고사 문제

기말고사 대비 C언어 모의고사

문제 1.

다음 프로그램은 10진수 50을 2진수로 변환하여 8비트로 출력하는 코드이다.

빈칸 ㉠, ㉡에 들어갈 코드를 쓰고, 프로그램 실행 결과를 쓰시오.

#include <stdio.h>

int main(void){
    int bin[8];
    int n = 50;

    for(int i = 7; i >= 0; i--){
        bin[i] = n % 2;
        n = n / ㉠;
    }

    for(int i = 0; i < 8; i++)
        printf("%d", ㉡);

    return 0;
}

문제 2.

다음 프로그램을 실행했을 때 화면에 출력되는 두 개의 정수를 위에서부터 차례대로 쓰시오.

#include <stdio.h>

int main(void){
    int a[] = {8, 14, 22, 31, 47, 53};
    int *p = a + 2;
    int *q = a + 5;

    printf("%d\n", *(q - 3) + *p);

    p = a;
    q = p + 4;
    printf("%d\n", *q - *(p + 1));

    return 0;
}

문제 3.

다음 프로그램은 배열을 선택 정렬로 오름차순 정렬한 후, 값 42를 이진 탐색으로 찾아 위치를 출력하는 코드이다.

(1) ㉠에 들어갈 while문의 조건식을 쓰고,

(2) ㉡에 들어갈 비교 연산자를 쓰고,

(3) 프로그램 실행 결과로 출력되는 정수를 쓰시오.

#include <stdio.h>

int main(void){
    int x[] = {42, 7, 19, 56, 33};
    int n = 5;
    int key = 42;
    int l = 0, r = n - 1, m;

    for(int i = 0; i < n - 1; i++){
        int idx = i;
        for(int j = i + 1; j < n; j++)
            if(x[j] < x[idx])
                idx = j;
        int t = x[i];
        x[i] = x[idx];
        x[idx] = t;
    }

    while(㉠){
        m = (l + r) / 2;

        if(key == x[m]) break;
        else if(key < x[m])
            r = m - 1;
        else
            l = m + 1;
    }

    if(key ㉡ x[m])
        printf("%d\n", m);

    return 0;
}

문제 4.

다음 프로그램은 3×3 정수 배열의 각 행에서 가장 작은 값을 찾아 출력하는 코드이다.

(1) ㉠, ㉡에 들어갈 코드를 쓰고,

(2) 프로그램 실행 결과로 출력되는 세 정수를 순서대로 쓰시오.

#include <stdio.h>

int main(void){
    int d[3][3] = {
        {9, 4, 7},
        {2, 15, 3},
        {6, 8, 1}
    };

    for(int i = 0; i < 3; i++){
        int m = ㉠;
        for(int j = 0; j < 3; j++)
            if(d[i][j] < m)
                m = d[i][j];
        printf("%d ", ㉡);
    }

    return 0;
}

문제 5.

다음 프로그램은 정수 5개를 입력받아 평균을 구하고, 값의 구간별 개수를 출력하는 코드이다.

사용자가 순서대로 70 55 90 40 50을 입력한다고 할 때,

(1) ㉠, ㉡, ㉢, ㉣에 들어갈 코드를 쓰고,

(2) 프로그램 실행 결과를 모두 쓰시오.

#include <stdio.h>

int main(void){
    int v[5];
    int tot = 0;
    int big = 0, mid = 0, small = 0;

    for(int i = 0; i < 5; i++){
        printf("%d번째 값: ", ㉠);
        scanf("%d", ㉡);
        tot += v[i];

        if(㉢)
            big++;
        else if(v[i] >= 30)
            mid++;
        else
            small++;
    }

    printf("평균: %d\n", ㉣);
    printf("50 이상: %d\n", big);
    printf("30~49: %d\n", mid);
    printf("30 미만: %d\n", small);

    return 0;
}

문제 6.

다음 프로그램은 먼저 학생 수를 입력받고, 각 학생의 학번과 점수를 입력받은 뒤, 입력된 점수 중 최저 점수를 출력하는 코드이다.

입력이 다음과 같다고 할 때,

  • 첫 줄: 학생 수 4
  • 이후 입력(학번, 점수 순서로 4명):
    • 101 76
    • 102 88
    • 103 69
    • 104 90

(1) ㉠, ㉡, ㉢에 들어갈 코드를 쓰고,
(2) 프로그램 실행 결과로 출력되는 값을 쓰시오.

#include <stdio.h>
#define MAX 10

int main(void){
    int id[MAX], sc[MAX];
    int n;
    int min = 101;

    scanf("%d", &n);

    for(int i = 0; ㉠; i++){
        scanf("%d", &id[i]);
        scanf("%d", &sc[i]);

        if(㉡)
            min = sc[i];
    }

    printf("%d\n", ㉢);

    return 0;
}

문제 7.

다음 프로그램은 입력받은 정수 n의 팩토리얼(n! = 1 × 2 × ... × n)을 구하는 코드이다.

사용자가 정수 4를 입력했다고 할 때,

(1) ㉠, ㉡에 들어갈 코드를 쓰고,

(2) 프로그램 실행 결과를 쓰시오.

#include <stdio.h>

int main(void){
    int n;
    int res = 1;

    printf("정수 입력: ");
    scanf("%d", &n);

    for(int i = 1; i <= n; i++){
        ㉠ 
    }

    printf("%d", ㉡);

    return 0;
}

문제 8.

다음 프로그램을 실행했을 때 화면에 출력되는 두 개의 정수를 위에서부터 차례대로 쓰시오.

#include <stdio.h>

int main(void){
    int arr[] = {3, 6, 9, 12, 15};
    int *p = &arr[1]; 
    int *q = arr + 4; 

    printf("%d\n", *q - *p);

    p++; 
    q = q - 2; 
    printf("%d\n", *p + *q);

    return 0;
}

문제 9.

다음 프로그램은 배열에서 가장 큰 값(최댓값)의 인덱스(위치)를 찾아 출력하는 코드이다.

(1) ㉠에 들어갈 비교 연산자를 쓰고,

(2) ㉡에 들어갈 코드를 쓰고,

(3) 프로그램 실행 결과로 출력되는 정수를 쓰시오.

#include <stdio.h>

int main(void){
    int data[] = {12, 45, 7, 23, 56, 9};
    int n = 6;
    int max_idx = 0;

    for(int i = 1; i < n; i++){
        if(data[i] ㉠ data[max_idx]){
            max_idx = ㉡;
        }
    }

    printf("%d\n", max_idx);

    return 0;
}

문제 10.

다음 프로그램은 2행 3열 배열의 모든 요소를 순회하며 10보다 큰 수의 합계를 구하는 코드이다.

(1) ㉠, ㉡에 들어갈 코드를 쓰고,

(2) 프로그램 실행 결과를 쓰시오.

#include <stdio.h>

int main(void){
    int arr[2][3] = {
        {5, 12, 8},
        {15, 3, 20}
    };
    int sum = 0;

    for(int i = 0; i < 2; i++){
        for(int j = 0; j < 3; j++){
            if(arr[i][j] > 10)
                sum += ㉠;
        }
    }

    printf("%d", ㉡);

    return 0;
}

문제 11.

다음 프로그램은 정수 5개가 저장된 배열을 역순(거꾸로)으로 뒤집는 코드이다.

(1) ㉠, ㉡에 들어갈 코드를 쓰고,

(2) 프로그램 실행 결과를 모두 쓰시오.

#include <stdio.h>

int main(void){
    int arr[5] = {1, 2, 3, 4, 5};
    int temp;

    for(int i = 0; i < 2; i++){
        temp = arr[i];
        arr[i] = arr[4 - i];
        arr[4 - i] = ㉠;
    }

    for(int i = 0; i < 5; i++)
        printf("%d ", ㉡);

    return 0;
}

문제 12.

다음 프로그램은 1부터 입력받은 정수 n까지의 합(누적 합)을 구하여 출력하는 코드이다.

사용자가 정수 5를 입력했다고 할 때,

(1) 빈칸 ㉠, ㉡에 들어갈 코드를 쓰고,

(2) 프로그램 실행 결과를 쓰시오.

#include <stdio.h>

int main(void){
    int n, sum = 0;
    
    printf("정수 입력: ");
    scanf("%d", &n);

    for(int i = 1;  ㉠ ; i++){
         ㉡ 
    }

    printf("%d", sum);

    return 0;
}

문제 13.

다음 프로그램을 실행했을 때 화면에 출력되는 두 개의 정수를 위에서부터 차례대로 쓰시오.

#include <stdio.h>

int main(void){
    int arr[] = {10, 20, 30, 40, 50};
    int *p = arr;      
    int *q = arr + 3;  

    printf("%d\n", *(p + 1) + *q);

    p++;
    q--;
    printf("%d\n", *q - *p);

    return 0;
}

문제 14.

다음 프로그램은 정수 배열을 버블 정렬(Bubble Sort)을 이용하여 오름차순으로 정렬하는 코드이다.

(1) ㉠에 들어갈 비교 연산자를 쓰고,

(2) ㉡에 들어갈 변수명을 쓰고,

(3) 프로그램 실행 결과로 출력되는 정수를 쓰시오.

#include <stdio.h>

int main(void){
    int a[] = {8, 3, 5, 1, 9};
    int n = 5;
    int temp;

    for(int i = 0; i < n - 1; i++){
        for(int j = 0; j < n - 1 - i; j++){
            if(a[j] ㉠ a[j+1]){
                temp = a[j];
                a[j] = a[j+1];
                a[j+1] = ㉡;
            }
        }
    }

    printf("%d\n", a[2]); 

    return 0;
}

문제 15.

다음 프로그램은 3×3 정수 배열의 대각선 요소(왼쪽 위에서 오른쪽 아래로)의 합계를 구하는 코드이다.

(1) ㉠, ㉡에 들어갈 코드를 쓰고,

(2) 프로그램 실행 결과를 쓰시오.

#include <stdio.h>

int main(void){
    int m[3][3] = {
        {10, 2, 3},
        {4, 20, 6},
        {7, 8, 30}
    };
    int sum = 0;

    for(int i = 0; i < 3; i++){
        sum += ㉠;
    }

    printf("%d", ㉡);

    return 0;
}

문제 16.

다음 프로그램은 정수 5개를 입력받아 그중 짝수의 개수와 홀수의 합을 출력하는 코드이다.

사용자가 순서대로 2 5 8 11 14를 입력한다고 할 때,

(1) ㉠, ㉡, ㉢에 들어갈 코드를 쓰고,

(2) 프로그램 실행 결과를 모두 쓰시오.

#include <stdio.h>

int main(void){
    int num[5];
    int even_cnt = 0;
    int odd_sum = 0;

    for(int i = 0; i < 5; i++){
        scanf("%d", &num[i]);

        if(num[i] % 2 ㉠ 0)
            even_cnt++;
        else
            odd_sum ㉡ num[i];
    }

    printf("짝수 개수: %d\n", ㉢);
    printf("홀수 합: %d\n", odd_sum);

    return 0;
}

문제 17.

다음 프로그램은 10진수 37을 2진수로 변환하여 8비트로 출력하는 코드이다.

빈칸 ㉠, ㉡에 들어갈 코드를 쓰고, 프로그램 실행 결과를 쓰시오.

#include <stdio.h>

int main(void){
    int bin[8];
    ㉠;

    for(int i = 7; i >= 0; i--){
        bin[i] = n % 2;
        ㉡;
    }

    for(int i = 0; i < 8; i++)
        printf("%d", bin[i]);

    return 0;
}

문제 18.

다음 프로그램을 실행했을 때 화면에 출력되는 두 개의 정수를 위에서부터 차례대로 쓰시오.

#include <stdio.h>

int main(void){
    int a[] = {3, 5, 9, 12, 20, 25};
    int *p = a + 1;
    int *q = a + 4;

    printf("%d\n", *q - *(p - 1));

    p = a + 2;
    q = a + 3;
    printf("%d\n", *q + *(p + 1));

    return 0;
}

문제 19.

다음 프로그램은 정수 배열을 선택 정렬로 오름차순 정렬한 후, 값 25를 선형 탐색으로 찾아 위치를 출력하는 코드이다.

(1) ㉠에 들어갈 while문의 조건식을 쓰고,

(2) ㉡에 들어갈 if문의 조건식을 쓰고,

(3) 프로그램 실행 결과로 출력되는 정수를 쓰시오.

#include <stdio.h>

int main(void){
    int x[] = {30, 12, 7, 25, 18};
    int n = 5;
    int key = 25;
    int pos = -1;

    for(int i = 0; i < n - 1; i++){
        int idx = i;
        for(int j = i + 1; j < n; j++)
            if(x[j] < x[idx])
                idx = j;
        int t = x[i];
        x[i] = x[idx];
        x[idx] = t;
    }

    int i = 0;
    while(㉠){
        if(x[i] == key){
            pos = i;
            break;
        }
        i++;
    }

    if(㉡)
        printf("%d\n", pos);

    return 0;
}

문제 20.

다음 프로그램은 3×3 정수 배열의 각 열에서 가장 큰 값을 찾아 출력하는 코드이다.

(1) ㉠, ㉡에 들어갈 코드를 쓰고,

(2) 프로그램 실행 결과로 출력되는 세 정수를 순서대로 쓰시오.

#include <stdio.h>

int main(void){
    int d[3][3] = {
        {5, 9, 2},
        {11, 4, 7},
        {6, 8, 10}
    };

    for(int j = 0; j < 3; j++){
        int m = ㉠;
        for(int i = 0; i < 3; i++)
            if(d[i][j] > m)
                m = d[i][j];
        printf("%d ", ㉡);
    }

    return 0;
}

문제 21.

다음 프로그램은 정수 5개를 입력받아 평균을 구하고, 값의 구간별 개수를 출력하는 코드이다.

사용자가 순서대로 80 35 70 55 20을 입력한다고 할 때,

(1) ㉠, ㉡, ㉢, ㉣에 들어갈 코드를 쓰고,

(2) 프로그램 실행 결과를 모두 쓰시오.

#include <stdio.h>

int main(void){
    int v[5];
    int tot = 0;
    int high = 0, mid = 0, low = 0;

    for(int i = 0; i < 5; i++){
        printf("%d번째 값: ", ㉠);
        scanf("%d", ㉡);
        tot += v[i];

        if(㉢)
            high++;
        else if(v[i] >= 40)
            mid++;
        else
            low++;
    }

    printf("평균: %d\n", ㉣);
    printf("70 이상: %d\n", high);
    printf("40~69: %d\n", mid);
    printf("40 미만: %d\n", low);

    return 0;
}

문제 22.

다음 프로그램은 먼저 학생 수를 입력받고, 각 학생의 학번과 점수를 입력받은 뒤, 입력된 점수 중 최고 점수를 받은 학생의 학번을 출력하는 코드이다.

입력이 다음과 같다고 할 때,

  • 첫 줄: 학생 수 4
  • 이후 입력(학번, 점수 순서로 4명):
    • 101 76
    • 102 88
    • 103 69
    • 104 90

(1) ㉠, ㉡, ㉢에 들어갈 코드를 쓰고,

(2) 프로그램 실행 결과로 출력되는 값을 쓰시오.

#include <stdio.h>
#define MAX 10

int main(void){
    int id[MAX], sc[MAX];
    int n;
    int max = -1;
    int max_id = 0;

    scanf("%d", &n);

    for(int i = 0; i < ㉠; i++){
        scanf("%d", &id[i]);
        scanf("%d", &sc[i]);

        if(㉡){
            max = sc[i];
            max_id = id[i];
        }
    }

    printf("%d\n", ㉢);

    return 0;
}

문제 23.

다음 프로그램은 크기가 5인 정수 배열의 모든 요소를 왼쪽으로 한 칸씩 이동(회전)시키고, 맨 앞에 있던 값은 맨 뒤로 이동시키는 코드이다.
(1) ㉠, ㉡에 들어갈 코드를 쓰고,
(2) 프로그램 실행 결과를 모두 쓰시오.

#include <stdio.h>

int main(void){
    int a[5] = {10, 20, 30, 40, 50};
    int temp = a[0];

    for(int i = 0; i < 4; i++){
        a[i] = ㉠;
    }
    a[4] = ㉡;

    for(int i = 0; i < 5; i++)
        printf("%d ", a[i]);

    return 0;
}

문제 24.

다음 프로그램에서 포인터 연산을 이용하여 배열의 값을 계산하는 코드이다. 프로그램 실행 결과로 출력되는 두 개의 정수를 위에서부터 차례대로 쓰시오.

#include <stdio.h>

int main(void){
    int a[] = {5, 12, 20, 27, 35, 42};
    int *p = a + 1;
    int *q = a + 4;

    printf("%d\n", *(q - 2) + 5);

    p = a;
    printf("%d\n", *(p + 3));

    return 0;
}

문제 25.

다음 프로그램은 배열을 버블 정렬로 오름차순 정렬한 뒤, 값 25의 위치(인덱스)를 출력하는 코드이다.

(1) ㉠, ㉡에 들어갈 for문의 조건식을 쓰고,

(2) 프로그램 실행 결과로 출력되는 정수를 쓰시오.

#include <stdio.h>

int main(void){
    int x[] = {25, 9, 31, 17, 40};
    int n = 5;
    int key = 25;
    int idx = -1;

    for(int i = 0; ㉠; i++){
        for(int j = 0;  ㉡; j++){
            if(x[j] > x[j + 1]){
                int t = x[j];
                x[j] = x[j + 1];
                x[j + 1] = t;
            }
        }
    }

    for(int i = 0; i < n; i++){
        if(x[i] == key){
            idx = i;
            break;
        }
    }

    if(idx != -1)
        printf("%d\n", idx);

    return 0;
}

문제 26.

다음 프로그램은 3×3 정수 배열에서 각 행의 합을 구하여 출력하는 코드이다.

(1) ㉠, ㉡에 들어갈 코드를 쓰고,

(2) 프로그램 실행 결과로 출력되는 세 정수를 순서대로 쓰시오.

#include <stdio.h>

int main(void){
    int d[3][3] = {
        {2, 5, 7},
        {4, 1, 9},
        {6, 3, 8}
    };

    for(int i = 0; i < 3; i++){
        int s = 0;
        for(int j = 0; j < 3; j++)
            ㉠
        printf("%d ", ㉡);
    }

    return 0;
}

문제 27.

다음 프로그램은 정수 4개를 입력받아 평균을 구하고, 점수 구간별로 개수를 세어 출력하는 코드이다.

사용자가 순서대로 85 60 45 90을 입력한다고 할 때,

(1) ㉠, ㉡, ㉢에 들어갈 코드를 쓰고,

(2) 프로그램 실행 결과를 모두 쓰시오.

#include <stdio.h>

int main(void){
    int v[4];
    int tot = 0;
    int high = 0, mid = 0, low = 0;

    for(int i = 0; i < 4; i++){
        scanf("%d", &v[i]);
        tot += ㉠;

        if(v[i] >= 80)
            high++;
        else if(㉡)
            mid++;
        else
            low++;
    }

    printf("평균: %d\n", tot / ㉢);
    printf("80 이상: %d\n", high);
    printf("60~79: %d\n", mid);
    printf("60 미만: %d\n", low);

    return 0;
}

문제 28.

다음 프로그램은 먼저 학생 수를 입력받고, 각 학생의 학번과 점수를 입력받은 뒤, 최댓값을 가진 학생의 학번을 출력하는 코드이다.

입력이 다음과 같다고 할 때,

  • 첫 줄: 학생 수 4
  • 이후 입력(학번, 점수 순서로 4명):
    • 201 70
    • 202 95
    • 203 88
    • 204 95

(1) ㉠, ㉡, ㉢에 들어갈 코드를 쓰고,

(2) 프로그램 실행 결과로 출력되는 값을 쓰시오.

#include <stdio.h>
#define MAX 10

int main(void){
    int id[MAX], sc[MAX];
    int n;
    int max = -1;
    int max_id = 0;

    scanf("%d", &n);

    for(int i = 0; i < n; i++){
        scanf("%d", &id[i]);
        scanf("%d", &sc[i]);

        if(㉠){
            max = sc[i];
            ㉡ = id[i];
        }
    }

    printf("%d\n", ㉢);

    return 0;
}