공부/백준

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

상연 2020. 10. 30. 18:21

목차

    2108번: 통계학 링크

    코드

    #include <iostream>
    using namespace std;
    
    int main() {
        int num[8001] = {0, };
        int n, tmp;
        scanf("%d", &n);
    
        double avg = 0.0;
        int mid = 10000, cnt = 0, min = 4000, max = -4000;
        int old_mode = 4000;
        int mode = 4000;
    
        for(int i=0; i<n; i++){
            scanf("%d", &tmp);
            num[4000 + tmp] += 1;
    
            if(tmp < min) min = tmp;
            if(tmp > max) max = tmp;
        }
    
        for(int j=8000; j>=0; j--){
            avg += (-4000 + j) * num[j];
    
            if(mid == 10000 && cnt + num[j] >= (n / 2) + 1 ){
                mid = -4000 + j;
            }
            else{
                cnt += num[j];
            }
    
            if(num[j] > num[mode + 4000]){
                old_mode = -4000 + j;
                mode = -4000 + j;
            }
            else if(num[j] == num[mode + 4000]){
                old_mode = mode;
                mode = -4000 + j;
            }
        }
        avg = avg / n;
        printf("%.0f\n", avg);
        printf("%d\n", mid);
        printf("%d\n", old_mode);
        printf("%d\n", max - min);
    
    }

    사견

    풀면서 python numpy가 너무 그리웠다...
    한 번 numpy 맛을 봤던 나로서는 이 문제가 너무 귀찮았다... 사랑해요 라이브러리

    뭐 결국은, 귀찮을 뿐이지 어려운 문제는 아니다.

    이전에 했던 카운팅 정렬로 들어온 입력값을 정렬해 준 후,
    그 값들을 토대로 통계를 하면 된다.