2026년 3월 5일 목요일

제조기술 자리 배치

자리배치
칠판
1
박소미
2
이한결
3
김유은
4
김태우
5
박소이
6
백지수
7
안세찬
8
오예석
9
유준영
10
이서현
11
이해찬
12
정명기
13
하명은
14
한정서
15
홍수민
16
유정민
17
이하경
18
김지훈
19
이진호
20
이호진
21
김도현
22
안명진
23
김제경
24
박효원

정보통신 자리 배치

자리배치
칠판
1
김한선
2
성시원
3
박소미
4
김예린
5
김용하
6
노지현
7
박민서
8
백보람
9
손우림
10
신서현
11
이동훈
12
이현우
13
조언훈
14
채민성
15
허수연
16
황우성
17
황진혁
18
안정우
19
정지우
20
김지훈
21
최서영
22
이기준
23
이진호
24
안명진
25
신형택
26
양소연
27
김요한
28
김나우
29
박효원

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;
}