2108 - 통계학

2108 문제 링크

접근법

  1. 산술평균은 전체 값을 더한 sum을 N으로 나눠주면 된다.
  2. 중앙값은 N이 홀수가 보장되어있으므로 수를 증가하는 순으로 나열한 후 N/2 의 정수값에 해당하는 번째에 있는 수를 가져오면 된다.
  3. 최빈값은 N개의 수 중 가장 많이 나타나는 값을 찾아내면 되는데 입력되는 정수값의 절대값이 4000을 넘지않으므로 8000까지 저장할 수 있는 배열을 만들고 -4000~4000까지의 수를 배열 0~8000번째 에 1:1대응 시킨후 해당 숫자가 나타날 때마다 count해준후 가장 count가 많은 수를 가져오면 된다.
  4. 범위는 최대값과 최소값의 차이이므로 2번에서 증가하는 순으로 나열한 값에서 첫번째와 마지막 수를 가져와 차를 구하면 된다.
#include <iostream>
#include <vector>
#include <algorithm>

using namespace std;

int main(int argc, char *argv[])
{

    int N,tmp;
    double sum =0;
    int array[8001] = {0,};
    vector<int> mode;
    vector <int> V;


    scanf("%d", &N);

    for(int i= 0; i < N; i++)
    {
        scanf("%d", &tmp);
        sum += tmp;
        V.push_back(tmp);
        array[tmp+4000] += 1;
    }

    sort(V.begin(), V.end());


    tmp = 1;

    for(int i=0; i < 8001; i++ )
    {
        if(array[i] > tmp )
        {
            tmp = array[i];
            mode.clear();
            mode.push_back(i);
        }else if(array[i] == tmp )
        {
            mode.push_back(i);
        }
    }

    sort(mode.begin(),mode.end());

    printf("%.0f\n",(double)sum/(double)N);
    printf("%d\n",V[(int)N/2]);





    if(N == 1)
    {
        printf("%d\n", V[0]);
        printf("%d", 0);

    }else
    {
        if(mode.size() > 1)
        {
            printf("%d\n", mode[1]-4000);

        }else
        {
            printf("%d\n", mode[0]-4000);

        }
        printf("%d", (V.back() - V.front()));

    }

}

결론

생각보다 어려운 문제는 아니였지만 array의 갯수를 생각하지 못했다. 당연하게 array[8001]이 되는게 맞지만 array[8000] 으로 생각해서 시간이 오래걸렸다. 부디 이 글을 보는 사람은 나와 같은 실수를 하지 않기를 바란다.

업데이트: