본문 바로가기

Algorithm/Implementation

(C++) - 백준(BOJ) 2108번 : 통계학

반응형

www.acmicpc.net/problem/2108

 

2108번: 통계학

첫째 줄에 수의 개수 N(1 ≤ N ≤ 500,000)이 주어진다. 그 다음 N개의 줄에는 정수들이 주어진다. 입력되는 정수의 절댓값은 4,000을 넘지 않는다.

www.acmicpc.net

구현 문제였습니다. -가 포함되어 있어 꼼꼼한 처리가 필요합니다.

 

풀이방법

구해야 할 값이 총 4가지입니다. 각각은 함수로 구현했습니다.

 

1. 산술평균 : (모든 값의 합 / n) 을 소수 첫째자리에서 반올림한 후 반환합니다.

 

2. 중앙값 : 저의 경우 값을 입력받는 배열의 인덱스가 1부터 시작하므로 배열의 n/2+1번째 값을 반환해줍니다.

 

3. 가장 빈도 수가 많은 값 또는 두 번째로 작은 값(빈도수가 같을 경우) :

  3-1.<int,int>형의 map변수를 선언해 첫 번째에는 입력받은 배열의 값, 두 번째에는 그 값이 나온 빈도 수를 저장합니다.

  3-2. 가장 큰 빈도 수를 구한 뒤 저장합니다.

  3-3. <int>형의 vector 변수를 선언해 가장 큰 빈도 수와 같은 빈도를 가진 배열의 값들을 저장합니다. 그 후 오름차순으로 정렬해 줍니다.

  3-4. 해당 vector변수의 size가 1이면 겹치는 빈도 수의 값이 없으므로 첫번째 값을 반환합니다. 아닌 경우엔 두 번쨰 값을 반환해줍니다.

 

4. 범위 : 가장 큰 값, 작은 값을 구한뒤 차이를 반환해줍니다. 

Code

#include <bits/stdc++.h>
using namespace std;
int num[500001];
int n;

double getAvg(){
    double sum = 0;
    for(int i = 1; i <= n; i++) sum += num[i];
    return round(sum / (double)n);
}

int getMiddleValue(){
    sort(num+1, num+n+1);
    return num[n/2+1];
}

int getSecondFrequencyValue(){
    map <int,int> m;
    for(int i = 1; i <= n; i ++){
        if(m[num[i]]) m[num[i]]++;
        else m[num[i]] = 1;
    }
    int maxFrequency = 0;

    vector <int> f;
    for(auto p:m){
        if(maxFrequency < p.second){
            maxFrequency = p.second; //가장 자주 나오는 빈도수
        }
    }

    for(auto p : m){
        if(maxFrequency==p.second){
            f.push_back(p.first);
        }
    }

    sort(f.begin(),f.end());
    if(f.size()==1) return f[0];
    return f[1];
}

int getMinMaxGap(){
    int minVal = 0x7f7f7f7f;
    int minIdx = 0;
    int maxVal = -0x7f7f7f7f;
    int maxIdx = 0;
    for(int i = 1; i<=n; i++){
        if(maxVal < num[i]){
            maxVal = num[i];
            maxIdx = i;
        }
        if(minVal > num[i]){
            minVal = num[i];
            minIdx = i;
        }
    }
    return maxVal - minVal;
}

int main(){
    cin >> n;
    for(int i = 1; i <= n; i++) cin >> num[i];
    cout << getAvg() <<'\n';
    cout << getMiddleValue() <<'\n';
    cout << getSecondFrequencyValue() <<'\n';
    cout << getMinMaxGap() <<'\n';
}