문제 링크: https://www.acmicpc.net/problem/2108
평균값 : 모든 값들을 더한 값을 개수로 나눈 값
중앙값 : 수를 정렬했을 때 가운데의 있는 값. 짝수면, 개수를 나눈 값. 홀수면, 개수를 나눈 값 더하기 1.
최빈값 : 가장 많이 나오는 값. 여러 개의 경우 두번 째로 작은 값.
범위 : 가장 큰수와 작은 수의 차이.
평균값은 입력값을 받을 때, 모두 더하고 개수로 나눠주면 된다.
중앙값은 모든 값을 입력받으며 vector에 저장한 후 값들을 정렬한 후, 개수를 2를 나눈 값을 인덱스로 사용하여, 값을 가져오면 된다.
범위는 정렬한 값에서 처음 값과 마지막 값의 차이를 구하면 된다.
최빈값은 입력을 받을 때, 8001개의 array를 만들어서 4000이상의 값이 들어왔을 때는 4000에서 해당값을 빼서 array에 index로 사용해서 해당 값을 1올려준다. 그리고 가장 많이 나온 값을 찾고, 만약 동일한 값들이 나온다면, 동일한 값을 vector에 저장하고 출력 전에 sort해서 2번째의 있는 값을 출력해준다.
#include <iostream>
#include <vector>
#include <algorithm>
#include <cmath>
using namespace std;
int fre_num[8001] = {0,};
int main(){
ios_base::sync_with_stdio(false);
cin.tie(NULL); cout.tie(NULL);
int num;
cin >> num;
int temp;
double sum = 0;
vector<int> nums;
for(int i = 0 ; i < num ; i++){
cin >> temp;
sum += temp;
nums.push_back(temp);
if(temp < 0){
int minus_temp = 4000 - temp;
fre_num[minus_temp]++;
}
else{
fre_num[temp]++;
}
}
double mean = (double)sum/num;
sort(nums.begin(),nums.end());
int mid = nums.at((num/2));
int range = nums.back() - nums.front();
int max = 0;
int max_num;
vector<int> fre_v;
for(int i = 0 ; i < 8001 ; i++){
if(max <= fre_num[i]){
if (i > 4000) max_num = 4000 - i;
else max_num = i;
if(max == fre_num[i]){
fre_v.push_back(max_num);
continue;
}
max = fre_num[i];
fre_v.clear();
fre_v.push_back(max_num);
}
}
sort(fre_v.begin(),fre_v.end());
cout << round(mean) << "\n";
cout << mid << "\n";
if(fre_v.size() > 1){
cout << fre_v.at(1) << "\n";
}
else{
cout << fre_v.at(0) << "\n";
}
cout << range << "\n";
}
평균값, 중앙값, 범위를 구하는 것은 상당히 쉬웠고, 최빈값을 구하는 것에 대해 조금 생각이 필요한 문제였다.