C 언어로 데이터 집합의 중앙값 계산

CBeginner
지금 연습하기

소개

이 실습에서는 C 프로그래밍으로 데이터 집합의 중앙값 (median) 을 계산하는 방법을 배웁니다. 이 실습은 다음 단계를 다룹니다: 숫자 배열을 읽고 정렬하고, 중간 요소 또는 두 중간 요소의 평균을 찾고, 중앙값을 출력하는 단계입니다. 단계별 지침은 C 프로그래밍을 사용하여 이러한 작업을 구현하는 과정 (배열 읽기, 정렬 및 출력 함수 포함) 을 안내합니다. 이 실습은 C 에서 통계 분석 기법을 이해하고 적용하는 실질적인 방법을 제공합니다.

배열 읽기 및 정렬

이 단계에서는 중앙값을 계산하기 위한 준비로 숫자 배열을 읽고 정렬하는 방법을 배웁니다. 이 작업을 수행하기 위해 C 프로그래밍을 사용할 것입니다.

먼저 배열 읽기 및 정렬을 구현할 C 파일을 생성해 봅시다.

cd ~/project
nano median_calculator.c

이제 다음 코드를 파일에 추가합니다.

#include <stdio.h>

#define MAX_SIZE 100

// 배열 요소를 읽는 함수
void readArray(int arr[], int *n) {
    printf("요소 개수를 입력하세요 (최대 %d): ", MAX_SIZE);
    scanf("%d", n);

    printf("%d개의 요소를 입력하세요:\n", *n);
    for (int i = 0; i < *n; i++) {
        scanf("%d", &arr[i]);
    }
}

// 버블 정렬 알고리즘을 사용하여 배열을 정렬하는 함수
void sortArray(int arr[], int n) {
    for (int i = 0; i < n - 1; i++) {
        for (int j = 0; j < n - i - 1; j++) {
            if (arr[j] > arr[j + 1]) {
                // 요소 교환
                int temp = arr[j];
                arr[j] = arr[j + 1];
                arr[j + 1] = temp;
            }
        }
    }
}

// 배열을 출력하는 함수
void printArray(int arr[], int n) {
    printf("정렬된 배열: ");
    for (int i = 0; i < n; i++) {
        printf("%d ", arr[i]);
    }
    printf("\n");
}

int main() {
    int arr[MAX_SIZE];
    int n;

    readArray(arr, &n);
    sortArray(arr, n);
    printArray(arr, n);

    return 0;
}

프로그램을 컴파일하고 실행합니다.

gcc median_calculator.c -o median_calculator
./median_calculator

예시 출력:

요소 개수를 입력하세요 (최대 100): 5
5개의 요소를 입력하세요:
42
15
7
23
11
정렬된 배열: 7 11 15 23 42

코드를 살펴보겠습니다.

  1. readArray() 함수는 사용자로부터 배열 요소를 입력받습니다.
  2. sortArray() 함수는 버블 정렬 알고리즘을 사용하여 오름차순으로 요소를 정렬합니다.
  3. printArray() 함수는 정렬된 배열을 출력합니다.
  4. main() 함수는 이러한 함수들을 연결합니다.

버블 정렬 알고리즘의 시간 복잡도는 O(n²) 입니다. 이 알고리즘은 이해하기 쉽지만 대규모 데이터 집합에는 효율적이지 않습니다.

중앙값 (Median) 계산

이 단계에서는 이전 프로그램을 확장하여 정렬된 배열에서 중앙값을 계산합니다. 중앙값은 중앙에 있는 요소 하나 또는 두 개의 중앙 요소의 평균입니다.

기존 파일을 열고 코드를 수정합니다.

cd ~/project
nano median_calculator.c

중앙값을 계산하는 새로운 함수를 추가하여 코드를 업데이트합니다.

#include <stdio.h>

#define MAX_SIZE 100

// 이전 함수 (readArray, sortArray, printArray) 는 동일하게 유지

// 중앙값을 계산하는 새로운 함수
float calculateMedian(int arr[], int n) {
    // 요소 개수가 홀수이면 중앙 요소를 반환
    if (n % 2 != 0) {
        return arr[n / 2];
    }

    // 요소 개수가 짝수이면 두 중앙 요소의 평균을 반환
    int mid1 = arr[(n / 2) - 1];
    int mid2 = arr[n / 2];
    return (mid1 + mid2) / 2.0;
}

int main() {
    int arr[MAX_SIZE];
    int n;

    readArray(arr, &n);
    sortArray(arr, n);
    printArray(arr, n);

    // 중앙값을 계산하고 출력
    float median = calculateMedian(arr, n);
    printf("중앙값: %.2f\n", median);

    return 0;
}

업데이트된 프로그램을 컴파일하고 실행합니다.

gcc median_calculator.c -o median_calculator
./median_calculator

홀수 개의 요소에 대한 예시 출력:

요소 개수를 입력하세요 (최대 100): 5
5개의 요소를 입력하세요:
42
15
7
23
11
정렬된 배열: 7 11 15 23 42
중앙값: 15.00

짝수 개의 요소에 대한 예시 출력:

요소 개수를 입력하세요 (최대 100): 6
6개의 요소를 입력하세요:
42
15
7
23
11
8
정렬된 배열: 7 8 11 15 23 42
중앙값: 13.00

중앙값 계산에 대한 주요 사항:

  1. 요소 개수가 홀수이면 중앙값은 중앙에 있는 요소입니다.
  2. 요소 개수가 짝수이면 중앙값은 두 중앙 요소의 평균입니다.
  3. 중앙값을 계산하기 전에 배열을 정렬해야 합니다.

calculateMedian() 함수는 두 경우 모두 처리합니다.

  • 정수 나눗셈을 사용하여 중앙 인덱스를 찾습니다.
  • 요소 개수가 홀수인지 짝수인지 확인합니다.
  • 적절한 중앙값 값을 반환합니다.

중앙값 출력

이 마지막 단계에서는 중앙값 계산 프로그램을 개선하여 더 자세한 출력을 제공하고 중앙값을 표현하는 다양한 방법을 보여줍니다.

기존 파일을 열어 최종 수정을 합니다.

cd ~/project
nano median_calculator.c

개선된 출력 형식으로 코드를 업데이트합니다.

#include <stdio.h>
#include <stdlib.h>

#define MAX_SIZE 100

// 이전 함수 (readArray, sortArray, printArray, calculateMedian) 는 동일하게 유지

void printDetailedMedianInfo(int arr[], int n, float median) {
    printf("\n--- 중앙값 계산 세부 정보 ---\n");
    printf("요소 총 개수: %d\n", n);
    printf("배열 요소: ");
    for (int i = 0; i < n; i++) {
        printf("%d ", arr[i]);
    }
    printf("\n\n중앙값 계산:\n");

    if (n % 2 != 0) {
        printf("요소 개수가 홀수\n");
        printf("중앙 인덱스: %d\n", n / 2);
        printf("중앙 요소: %d\n", arr[n / 2]);
    } else {
        printf("요소 개수가 짝수\n");
        printf("두 중앙 인덱스: %d 및 %d\n", (n / 2) - 1, n / 2);
        printf("중앙 요소: %d 및 %d\n", arr[(n / 2) - 1], arr[n / 2]);
    }

    printf("\n최종 중앙값: %.2f\n", median);
}

int main() {
    int arr[MAX_SIZE];
    int n;

    readArray(arr, &n);
    sortArray(arr, n);

    float median = calculateMedian(arr, n);

    // 정렬된 배열 출력
    printArray(arr, n);

    // 자세한 중앙값 정보 출력
    printDetailedMedianInfo(arr, n, median);

    return 0;
}

업데이트된 프로그램을 컴파일하고 실행합니다.

gcc median_calculator.c -o median_calculator
./median_calculator

홀수 개의 요소에 대한 예시 출력:

요소 개수를 입력하세요 (최대 100): 5
5개의 요소를 입력하세요:
42
15
7
23
11
정렬된 배열: 7 11 15 23 42

--- 중앙값 계산 세부 정보 ---
요소 총 개수: 5
배열 요소: 7 11 15 23 42

중앙값 계산:
요소 개수가 홀수
중앙 인덱스: 2
중앙 요소: 15

최종 중앙값: 15.00

짝수 개의 요소에 대한 예시 출력:

요소 개수를 입력하세요 (최대 100): 6
6개의 요소를 입력하세요:
42
15
7
23
11
8
정렬된 배열: 7 8 11 15 23 42

--- 중앙값 계산 세부 정보 ---
요소 총 개수: 6
배열 요소: 7 8 11 15 23 42

중앙값 계산:
요소 개수가 짝수
두 중앙 인덱스: 2 및 3
중앙 요소: 11 및 15

최종 중앙값: 13.00

이 단계의 주요 개선 사항:

  1. 새로운 함수 printDetailedMedianInfo() 추가
  2. 중앙값 계산에 대한 포괄적인 정보 제공
  3. 홀수 및 짝수 요소 수에 대한 다양한 시나리오 표시
  4. 사용자의 중앙값 계산 이해도 향상

요약

이 실험에서는 숫자 배열을 읽고 버블 정렬 알고리즘을 사용하여 정렬하고 중앙값 계산을 위한 데이터를 준비하는 방법을 배웠습니다. 정렬된 배열은 콘솔에 출력되어 첫 번째 단계의 성공적인 완료를 보여줍니다. 버블 정렬 알고리즘은 이해하기 쉽지만, 대규모 데이터 세트에 대해서는 가장 효율적인 방법이 아닌 O(n²) 의 시간 복잡도를 가지고 있습니다. 다음 단계에서는 정렬된 배열의 중앙값을 찾는 데 집중할 것입니다.

다음 단계는 배열의 크기에 따라 중앙 요소 또는 두 중앙 요소의 평균을 식별하는 것입니다. 이 단계는 중앙값이 정확하게 계산되고 사용자에게 제시되도록 합니다.