https://www.acmicpc.net/problem/2108

백준 2108번 - 통계학(실버 3)

 

풀이

다른건 크게 어려울 것이 없는데 최빈값을 어떻게 처리할지 잘 생각해야 한다

unordered_map 에 <입력받은수, 등장횟수> 로 저장해서 최빈값을 찾는 식으로 구현했다.

그리고 밑에 조건에 평균에 -0 이 나오면 안된다고 되어 있다. 이 부분도 고려해서 출력해야 한다.

전체코드

#include <iostream>
#include <string>
#include <algorithm>
#include <cmath>
#include <cstring>
#include <unordered_map>
using namespace std;

int main() 
{
    ios::sync_with_stdio(false);
    cin.tie(nullptr);

    int n;
    cin >> n;

    vector<int> num(n,-4001);
    vector<int> numcnt(n);

    // 등장횟수
    unordered_map<int, int> mapcnt;


    int intsum = 0;
    int intmin = 4000;
    int intmax = -4000;
    for (int i = 0; i < n; i++)
    {
        int k;
        cin >> k;
        // 숫자 저장
        // 위의 인덱스별로 나온 개수 저장
        mapcnt[k]++;

        num[i] = k;
        intsum+= num[i];
        if (intmin > num[i])
        {
            intmin = num[i];
        }
        if (intmax < num[i])
        {
            intmax = num[i];
        }
       
    }

    // n은 홀수
    int midindex = (n +1) / 2;

    vector<int> sortnum(n);
    sortnum  = num;
    sort(sortnum.begin(), sortnum.end());

    // 최빈값 구하기
    // 카운트 중에 최대 구하기
    vector<int> sortcnt(n);
    sortcnt = numcnt;
    sort(sortcnt.begin(), sortcnt.end(), greater<int>());
    int maxcntidx = sortcnt[0];
    // 최대 등장 횟수
    int freqnum = 0;
    // 최빈 값
    int intmostfreq;

    vector<int> freqno;
    for (auto it:mapcnt)
    {
        // num , 등장횟수
        if (freqnum < it.second)
        {
            freqnum = it.second;
        }
    }
   

    for (auto it : mapcnt)
    {
        if (freqnum == it.second)
        {
            freqno.push_back(it.first);
        }
    }

    if (freqno.size() > 1)
    {
        sort(freqno.begin(), freqno.end());
        intmostfreq = freqno[1];
    }
    else
    {
        intmostfreq = freqno[0];
    }

    // 평균
    if (round(static_cast<float>(intsum) / static_cast<float>(n)) == 0)
    {
        cout << 0 << "\n";
    }
    else
    {
        cout << round(static_cast<float>(intsum) / static_cast<float>(n)) << "\n";
    }

    // 중앙값
    cout << sortnum[midindex-1] << "\n";

    // 최빈값
    cout << intmostfreq << "\n";
    
    // 범위
    cout << intmax - intmin;
}

+ Recent posts