[C언어] 백준 2108번 - 통계학

매미·2024년 7월 4일

백준

목록 보기
12/15
post-thumbnail

https://www.acmicpc.net/problem/2108

문제

발상

최빈값만 빼면 브론즈일 정도로 쉬움. 최빈값 구하기가 빡셈.
기본적으로 입력값 배열을 오름차순으로 정렬해야함 -> quick sort 이용.
먼저 수가 등장하는 빈도를 받고, 최빈값을 탐색한 다음, 반복문을 돌려 최빈값이 하나가 아니라 더 있을 때는 break하고 두번째 최빈값을 출력. 하나밖에 없으면 유일한 최빈값을 출력.

Clang

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


int compare(const void* a, const void* b) {
    int A = *(int*)a;
    int B = *(int*)b;

    if (A>B)
        return 1;
    return 0;
}

void input(int* arr, int n) {
    for (int i=0; i<n; i++)
        scanf("%d", &arr[i]);
    qsort(arr,n,sizeof(int),compare);
}

void average(int* arr, int n) {
    int sum=0;
    for (int i=0; i<n; i++)
        sum+=*(arr+i);
    printf("%d\n", (int)round((float)sum/n));
}

void median (int* arr, int n) {
    printf("%d\n", arr[n/2]);
}

void mode (int* arr, int n) {
    int freq[n];
    freq[0]=1;
    for (int i=1; i<n; i++)
        freq[i]=0; //빈도수 배열 초기화
    int k=0;
    for (int i=1; i<n; i++) { //빈도수 체크
        if (arr[i]==arr[i-1])
            freq[k]++;
        else {
            k=i;
            freq[k]++;
        }
    }

    int mode = arr[0];
    int mode_freq = freq[0];
    for (int i=1; i<n; i++) { 
        if (mode_freq < freq[i]) { //최빈값과 최빈값의 빈도수
            mode = arr[i];
            mode_freq = freq[i];
        }
    }
    int cnt = 0;
    for (int i = 0; i<n; i++) {
        if (freq[i] == mode_freq)
            cnt++;
        if (cnt == 2) {
            printf("%d\n", arr[i]);
            break;
        }
    }
    if (cnt<=1)
        printf("%d\n", mode);
}

void range (int* arr, int n) {
    printf("%d\n", arr[n-1]-arr[0]);
}
int main() {
    int n;
    scanf("%d", &n);
    int arr[n];
    
    input(arr,n);
    average(arr,n);
    median(arr,n);
    mode(arr,n);
    range(arr,n);
    return 0;
}
profile
Kwangwoon Univ. Computer Information and Engineering 24

0개의 댓글