백준 2108 통계학 / C++

이유참치·2025년 12월 15일

백준

목록 보기
61/249

문제 : 2108

풀이 point

최빈값이 같을 때 두 번째로 작은 값을 출력하는 조건이 조금 까다로울 수 있다.

입력을 받을 때부터 map을 활용하여 빈도수를 저장했다.
그 빈도수 중에 같은 값이 있는지 찾고 같은 값을 가진 key들을 모아서 정렬한 후
작은 값을 찾았다.

풀이 방법

최빈값을 굉장히 복잡하게 구했기 때문에 다른 사람들의 코드도 참고 필수
그 외 산술평균, 중앙값, 범위는 쉽게 구할 수 있다.

코드

//통계학
#include <iostream>
#include <unordered_map>
#include <algorithm>
#include <cmath>
#include <vector>

int arr[500'000];
std::unordered_map<int, int> freq;
int N;

int mostFreq(){
    int max{0};
    std::vector<int> keys;
    for(const auto& [key, value] : freq){
        max = std::max(max, value);
    }

    for(const auto& [key, value] : freq){
        if(value == max) keys.push_back(key);
    }

    std::sort(keys.begin(), keys.end());
    return keys.size() == 1 ? keys[0] : keys[1];
}


int main(){

    std::cin >> N;
    double sum{0};
    for(int i{0}; i<N; ++i){
        std::cin >> arr[i];
        sum += arr[i];
        if(freq.find(arr[i]) != freq.end()) ++freq[arr[i]];
        else freq[arr[i]] = 1;
    }

    std::cout << round(sum / N) + 0.0 << '\n';
    std::sort(arr, arr+N);
    std::cout << arr[N/2] << '\n';
    std::cout << mostFreq() << '\n';
    std::cout << arr[N-1] - arr[0];

    return 0;
}
profile
임아리 - 대학생

0개의 댓글