본문 바로가기
[백준]

[BaekJoon/백준] 2108번 통계학

by Hevton 2022. 6. 25.
반응형

 

이 문제는 SW 기출 문제는 아니지만,,

내가 예전에 못 풀었던 문제라 기록하려 한다..!

 

중요한 점은

1. 산술평균 시, Double로 연산하되 마지막에 int로 캐스팅해서 -0이 안 나오게끔.

2. 최반값 구할 때, 도수분포표 정렬을 이용해서 커스텀 연산자 비교함수를 만들어서 정의

 

#include <iostream>
#include <vector>
#include <algorithm>
#include <cmath>

using namespace std;


int cmp(pair<int, int> a, pair<int, int> b) {
    
    if(a.first == b.first)
        return a.second < b.second;
    else
        return a.first > b.first;
    
}

int main() {
    
    int N, MOST, tmp;
    
    vector<int> v;
    vector<pair<int, int>> dosu;
    
    
    cin >> N;
    
    
    for(int i = 0; i < 8001; i++) {
        
        dosu.push_back({0, i});
        
    }

    
    
    for(int i = 0; i < N; i++) {
        
        cin >> tmp;
        v.push_back(tmp);
        
    }
    
    sort(v.begin(), v.end());
    
    
    double Total = 0;
    for(int i = 0; i < N; i++) {
        
        Total += v[i];
        
        dosu[v[i] + 4000].first = dosu[v[i] + 4000].first + 1;
    }
    
    sort(dosu.begin(), dosu.end(), cmp);
    
    if(dosu[0].first == dosu[1].first) // 최반값 같은게 두 개가 넘어가
        MOST = dosu[1].second;
    else // 최빈값 가장 큰 게 한 개 뿐.
        MOST = dosu[0].second;
        
    
    cout << (int)round(Total / N) << "\n"; // 마지막에 int로 캐스팅해서, -0이 안나오고 0이 나오게.
    cout << v[N / 2] << "\n";
    cout << MOST - 4000 << "\n";
    cout << v[N - 1] - v[0] << "\n";
}

 

새로 알게 된 점은,,

vector<pair<int, int>> v 가 있을 때,

v[i].first = v[i].first + 1; 이런식으로 값을 곧바로 수정할 수 있다는 점이다.

(안될 줄 알았는데 된다)

 

마음이 좀 편안해졌다.

반응형