본문 바로가기
BaekJoon/C++

2108 : 통계학 (C++)

by GrayChoi 2021. 2. 16.
반응형

 

2108번: 통계학

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

www.acmicpc.net


너무 막 푼듯

#include<iostream>
#include<algorithm>

using namespace std;

int main() {
    int N;
    cin >> N;

    int arr[N];
    int many[8001]; // 최빈값을 찾아내기 위한 배열
    fill(many, many + 8002, 0); // 모든 배열 0으로 초기화
    double ave = 0;

    for(int i = 0; i < N; i++) {
        // 값을 입력과 동시에 최빈값 계산 및 평균값 계산을 한다.
        cin >> arr[i];
        many[arr[i] + 4000]++;
        // 값에는 음수 값도 포함되어 있으므로 4000을 더한 값으로 계산한다.
        ave += arr[i];
    }

    sort(arr, arr + N);
    // 오름차순으로 정렬

    int cnt = 0;
    // 최빈값을 계산하기 위한 변수

    for(int i = 0; i < 8002; i++) {
        cnt = cnt < many[i] ? many[i] : cnt;
    }
    // 가장 많이 입력된 수의 개수가 변수에 입력된다.

    int ret = 0;
    // 최빈값이 중복되는 경우를 위한 변수

    for(int i = 0; i < 8002; i++) {
        if(cnt == many[i]) {
            // 최빈값이 중복 되는 경우 그 수를 카운트한다.
            ret++;
        }
    }

    int temp[ret + 1];
    // 중복되는 최빈값의 개수만큼 배열을 생성한다.

    int j = 0;

    for(int i = 0; i < 8002; i++) {
        if(cnt == many[i]) {
            temp[++j] = i - 4000;
            // 최빈값을 배열의 0부터가 아닌 1부터 채운다.
        }
    }

    printf("%.0f\n", ave / N);
    cout << arr[N/2] << endl;
    if(j > 1) {
        // 최빈값이 2개 이상인 경우
        cout << temp[2] << endl;
    } else {
        // 최빈값이 1개인 경우
        cout << temp[1] << endl;
    }
    cout << arr[N - 1] - arr[0] << endl;
    

    return 0;
}

 

반응형

'BaekJoon > C++' 카테고리의 다른 글

10815 : 숫자 카드 (C++)  (0) 2021.02.17
10816 : 숫자 카드 2 (C++)  (0) 2021.02.17
10866 : 덱 (C++)  (0) 2021.02.16
10026 : 적록색약 (C++)  (0) 2021.02.12
18111 : 마인크래프트 (C++)  (0) 2021.02.12

댓글