개발/C++

[BOJ] 2108 - 통계학

차파랑 2022. 2. 3. 23:28
#include <iostream>
#include <algorithm>
#include <vector>
#include <cmath>

using namespace std;

int mean(int* nums, int n);
int median(int* nums, int n);
int mode(int* nums, int n);
int range(int* nums, int n);

struct NumCount {
    int number;
    int count;
};

int main(){
    int n;
    cin >> n;
    int* nums = new int[n];
    for(int i = 0; i < n; i++) cin >> nums[i];
    sort(nums, nums+n);

    cout << mean(nums, n) << "\n";
    cout << median(nums, n) << "\n";
    cout << mode(nums, n) << "\n";
    cout << range(nums, n) << "\n";
}

int mean(int* nums, int n){
    int sum = 0;
    for(int i = 0; i < n; i++) sum += nums[i];
    return round(sum / (double)n);
}

int median(int* nums, int n){
    int index = n / 2;
    return nums[index];
}

bool compare(NumCount a, NumCount b){
    return a.count > b.count;
}

int mode(int* nums, int n){
    vector<NumCount> counts;
    NumCount tmp = NumCount();
    tmp.number = nums[0];
    tmp.count = 1;
    counts.push_back(tmp);
    for(int i = 1; i < n; i++){
        if(nums[i] == counts.back().number){
            counts.back().count++;
        } else {
            NumCount tmp = NumCount();
            tmp.number = nums[i];
            tmp.count = 1;
            counts.push_back(tmp);
        }
    }
    stable_sort(counts.begin(), counts.end(), compare);
    if(counts.size() > 2 && (counts.at(0).count == counts.at(1).count)){
        return counts.at(1).number;
    } else {
        return counts.at(0).number;
    }
}

int range(int* nums, int n){
    return nums[n-1] - nums[0];
}