본문 바로가기
Programming/BOJ

[BOJ] 2108 통계학 (C++)

by coco88 2025. 5. 25.

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

 

 

review

N개의 숫자를 입력받아서 산술평균, 중앙값, 최빈값, 범위를 출력하는 문제이다. 

 

1. 산술평균은 전체합을 N으로 나눈 값이다. 소수점 첫째 자리에서 반올림해야 하므로 round 함수를 사용했다. -0.333333 같은 수는 첫째 자리에서 반올림하면 -0으로 출력될 수 있는 점을 주의해야 한다. 

2. 중앙값은 <algorithm> 라이브러리의 sort함수를 이용하여 쉽게 구할 수 있었다. 

3. 최빈값이 여러 개 있을 경우에 두 번째로 작은 값을 출력해야하는 문제를 가장 해결하기 어려웠다.

정수의 범위가 -4000~4000인 점을 고려하여 8001 크기의 count 배열을 만들었고, 수를 입력받을 때 해당 배열의 값을 증가시키도록 하였다. 첫 번째 반복문에서 최빈값을 구하고, 두 번째 반복문에서 최빈값이 여러 개라고 판단되는 경우에 첫 번째 반복문에서 찾은 값과 같지 않을 때의 값을 저장해 출력하도록 하였다. 

4. 범위는 오름차순으로 정렬한 배열에서 최댓값과 최솟값의 차이로 구하였다. 

 

C++ code

#include <iostream>
#include <algorithm>
#include <math.h>

using namespace std;

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

    int num[N];
    int sum=0;
    int count[8001];
    fill(count, count + 8001, 0);

    for(int i=0;i<N;i++){
        cin >> num[i];
        sum+=num[i];
        count[4000+num[i]]++;
    }
    int avg=round((double)sum/N);
    cout << avg << endl; //산술평균
    sort(num, num+N); 
    cout << num[(N-1)/2] << endl; //중앙값

    int mode=0;
    for(int i=0;i<=8000;i++){
        if(count[mode]<count[i]){
            mode=i;
        }
    }

    for(int i=0;i<=8000;i++){
        if((count[mode]==count[i])&&(mode!=i)){
            mode=i;
            break;
        }
    }

    cout << mode-4000 << endl; //최빈값

    int min=num[0];
    int max=num[N-1];
    cout << max-min << endl; //범위

    return 0;
}

 

result

 

'Programming > BOJ' 카테고리의 다른 글

[BOJ] 25206 너의 평점은 (C++)  (0) 2025.05.22