본문 바로가기
Programming/BOJ

[C/C++] 백준 #2108 통계학(수학)

by 작은별하나 2023. 3. 31.
반응형

이번 문제는 통계학에서 자주 사용되는 평균, 중위값, 최빈값, 범위를 구하는 것입니다.

 

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

 

2108번: 통계학

첫째 줄에 수의 개수 N(1 ≤ N ≤ 500,000)이 주어진다. 단, N은 홀수이다. 그 다음 N개의 줄에는 정수들이 주어진다. 입력되는 정수의 절댓값은 4,000을 넘지 않는다.

www.acmicpc.net

 

여기에서는 히스토그램을 구하면, 위의 4가지를 다 구할 수가 있습니다.

histogram

예를 들어서 3이 4번 나타났고 5가 7번 나타났고, 10이 2번 나타났다면,

평균은 (3*4+5*7+10*2)/13 이 됩니다.  중위값은, 13+1을 2로나눈 값인 7이 위치한 히스토그램 값을 찾으면 됩니다.  그러면 중위값은 5가 되겠죠.  최빈값은 히스토그램이 가장 큰 값이므로 5가 될테고요.  범위는 히스토그램의 가장 작은값하고 가장 큰 값의 차이를 구하면 됩니다.

 

제가 작성한 소스입니다.

//-----------------------------------------------------
//    baekjoon #2108
//        - by Aubrey Choi
//        - created at 2019-10-26
//-----------------------------------------------------
#include <stdio.h>

int main()
{
    int n, s, sum=0, maxh, med, min=8000, max=0;
    static int h[8001];
    scanf("%d",&n);
    for(int i=0;i<n;i++) { scanf("%d",&s); h[s+4000]++; }
    for(int i=0,maxv=0,k=n/2,f=1;i<8001;i++)
    {
        if(!h[i]) continue;
        sum+=(i-4000)*h[i];
        if(h[i]>maxv) maxv=h[i],maxh=i-4000,f=1;
        else if(h[i]==maxv&&f) maxh=i-4000,f=0;
        if(k<h[i]) med=i-4000, k=10000000;
        k-=h[i];
        if(min>i) min=i; if(max<i) max=i;
    }
    printf("%d\n%d\n%d\n%d\n", (sum+(sum<0?-n/2:n/2))/n,med,maxh,max-min);
}
728x90

댓글