서두르지 말고 쉬지 말자

백준 2108번 통계학(C++) 본문

코딩 공부/Baekjoon Problem Solving

백준 2108번 통계학(C++)

philos 2025. 2. 8. 21:56

문제 해결 방안 :  문제가 요구하는 각 부분을 순서대로 구현했다. 기존에 알던 이론은 계수 정렬이 사용되었고 반올림 관련해서는 구글링을 해서 해결했다.

문제 해결 소감 : 추가로 알게된 중요한 방법이나 깨달음은 없었다. 그래도 이제 이 정도 규모의 문제를 혼자 힘으로 해결 가능하게 된 것이 뿌듯하다.

#include <iostream>
#include <vector>
#include <algorithm>
#include <cmath>
int N;
int num;
double total = 0;
int arr[8001] = {};
int main(void)
{
    std::cin >> N;
    std::vector<int> v(N);
    for (auto &c : v)
    {
        std::cin >> num;
        c = num;
    }
    // 산술평균
    for (auto c : v)
    {
        total += c;
    }
    double dec = total / N;
    int plus = 0;
    if (dec - std::trunc(dec) >= 0.5 || dec - std::trunc(dec) <= (-0.5))
    {
        if (dec >= 0)
            plus += 1;
        else
            plus -= 1;
    }
    std::cout << trunc(dec) + plus << '\n';

    // 중앙값
    std::sort(v.begin(), v.end());
    std::cout << v[N / 2] << '\n'; // 맞음

    // 최빈값
    for (auto c : v)
    {
        arr[c + 4000] += 1;
    }
    int maxVal = *(std::max_element(arr, arr + 8001));
    std::vector<int> cand;
    for (int i = 0; i < 8001; ++i)
    {
        if (arr[i] == maxVal)
        {
            cand.push_back(i - 4000);
        }
    }
    std::sort(cand.begin(), cand.end());
    if (cand.size() < 2)
    {
        std::cout << cand[0] << '\n';
    }
    else
    {
        std::cout << cand[1] << '\n';
    }

    // 범위
    auto max = std::max_element(v.begin(), v.end());
    auto min = std::min_element(v.begin(), v.end());
    std::cout << *max - *min; // 맞음
}
반응형