본문 바로가기
Algorithm/BOJ

[백준/BOJ] 2108번 - 통계학 (C++)

by shine-jung 2022. 3. 22.
반응형

문제 링크


코드

#include <bits/stdc++.h>
using namespace std;

int arr[500001], cnt[8001];
int main(void) {
    ios::sync_with_stdio(0);
    cin.tie(0);
    int n, sum = 0, mean, mode, mode_cnt = 0;
    cin >> n;
    for (int i = 0; i < n; i++) {
        cin >> arr[i];
        sum += arr[i];
        cnt[arr[i] + 4000]++;
        mode_cnt = max(cnt[arr[i] + 4000], mode_cnt);
    }
    mean = round((double)sum / n);
    if (mean == -0) mean = 0;
    sort(arr, arr + n);
    bool isSecond = false;
    for (int i = -4000; i <= 4000; i++) {
		if (cnt[i + 4000] == mode_cnt) {
			mode = i;
			if (isSecond) break;
			isSecond = true;
		}
	}
    cout << mean << '\n';
    cout << arr[n / 2] << '\n';
    cout << mode << '\n';
    cout << arr[n - 1] - arr[0];
}



설명

최빈값 구하기 (여러 개 있을 때에는 최빈값 중 두 번째로 작은 값 구하기)
1. 최대 빈도 값을 구한다.
2. cnt 배열을 순회하면서 최대 빈도 값과 같은지 비교한다.
    첫 번째로 같다면 최빈값을 저장하고 isSecond를 참으로 저장한다.
    두 번째로 같다면 최빈값을 저장하고 반복문을 탈출한다.

문제 설명에도 있지만 -0을 출력하면 안 된다.




(주의) 기록용으로 작성한 글입니다. 좋은 코드가 아닐 수 있습니다.

댓글 환영합니다!


반응형

댓글