본문 바로가기
Algorithm

백준 2108번 통계학

by 2nyong 2023. 3. 17.

 

배열을 받아 산술평균, 중앙값, 최빈값, 범위를 구하여 출력하는 문제다.

 

최빈값은 주어진 배열의 범위 만큼의 배열을 새롭게 선언하여 문제를 해결하였다.

주어진 배열의 범위 : -2 ~ 8

빈도수를 입력할 배열(Freq) 선언
Freq = new int[11]

Freq[0] => -2의 빈도수
Freq[1] => 1의 빈도수
...
Freq[10] = 8의 빈도수

 

import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;
import java.util.Scanner;

public class Main {
    static int[] arr;
    static int[] freq;
    static int N;

    public static void main(String[] args) {

        Scanner in = new Scanner(System.in);
        StringBuilder sb = new StringBuilder();

        N = in.nextInt();

        int sum = 0;
        arr = new int[N];
        for (int i = 0; i < N; i++) {
            arr[i] = in.nextInt();
            sum += arr[i];
        }

        Arrays.sort(arr);

        int min = arr[0]; // -2
        int max = arr[N - 1]; // 8

        int mostFreq = getFreq(arr, max - min + 1); // 최빈값

        sb.append((int)Math.round((double)sum/N)).append('\n'); // 산술평균
        sb.append(arr[N/2]).append('\n'); // 중앙값
        sb.append(mostFreq).append('\n'); // 최빈값
        sb.append(max - min); // 범위
        System.out.println(sb);
    }

    static int getFreq(int[] arr, int nFreq) {

        freq = new int[nFreq];

        int max = 0;
        for (int i = 0; i < N; i++) {
            int idx = arr[i] - arr[0];
            freq[idx]++;

            if (freq[idx] > max) {
                max = freq[idx];
            }
        }

        List<Integer> duplicate = new ArrayList<>();
        for (int i = 0; i < nFreq; i++) {
            if (freq[i] == max) {
                duplicate.add(i);
            }
        }

        if (duplicate.size() > 1) {
            return duplicate.get(1) + arr[0];
        } else {
            return duplicate.get(0) + arr[0];
        }
    }
}

'Algorithm' 카테고리의 다른 글

백준 11651번 좌표 정렬하기 2  (0) 2023.03.17
백준 12865번 평범한 배낭  (0) 2023.03.17
백준 1932번 정수 삼각형  (0) 2023.03.16
백준 1149번 RGB거리  (0) 2023.03.16
백준 9461번 파도반수열  (0) 2023.03.16

댓글