ALGORITHM

[JAVA] 백준 2108번 - 통계학

연듀 2022. 9. 22. 14:11

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

 

2108번: 통계학

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

www.acmicpc.net

 

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.Arrays;

public class Main{
    public static final int ABSOLUTE_VAL = 4000;
    public static void main(String[] args) throws IOException {
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));

        int n = Integer.parseInt(br.readLine());

        int[] arr = new int[n];
        int[] cnt = new int[8001];

        double sum=0;
        int max = Integer.MIN_VALUE;
        int mostCntNum = 0;

        for(int i=0; i<n; i++){
            arr[i] = Integer.parseInt(br.readLine());
            cnt[arr[i]+ABSOLUTE_VAL]++;
            sum+=arr[i];
        }
        Arrays.sort(arr);

        boolean flag = false;
        for(int i=0; i<cnt.length; i++){
             if(cnt[i] == 0) continue;
             if(max<cnt[i]){ // max값 갱신
                max = cnt[i];
                mostCntNum = i-ABSOLUTE_VAL;
                flag = true;
            }
             else if(flag && max==cnt[i]){ // 빈도수가 같은 최빈값이 또 나왔을 때
                 mostCntNum = i-ABSOLUTE_VAL;
                 flag = false;
             }
        }
        System.out.println(Math.round(sum/n)); // 산술 평균
        System.out.println(arr[n/2]); // 중앙값
        System.out.println(mostCntNum); // 최빈값
        System.out.println(arr[n-1]-arr[0]); // 범위
    }
}