2108 - 통계학
2108 문제 링크
접근법
- 산술평균은 전체 값을 더한 sum을 N으로 나눠주면 된다.
- 중앙값은 N이 홀수가 보장되어있으므로 수를 증가하는 순으로 나열한 후 N/2 의 정수값에 해당하는 번째에 있는 수를 가져오면 된다.
- 최빈값은 N개의 수 중 가장 많이 나타나는 값을 찾아내면 되는데 입력되는 정수값의 절대값이 4000을 넘지않으므로 8000까지 저장할 수 있는 배열을 만들고 -4000~4000까지의 수를 배열 0~8000번째 에 1:1대응 시킨후 해당 숫자가 나타날 때마다 count해준후 가장 count가 많은 수를 가져오면 된다.
- 범위는 최대값과 최소값의 차이이므로 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] 으로 생각해서 시간이 오래걸렸다. 부디 이 글을 보는 사람은 나와 같은 실수를 하지 않기를 바란다.