Shiny Sky Blue Star

백준 문제 풀이/백준 (JAVA)

JAVA 백준 2108 통계학 (수학, 정렬)

gamja00 2025. 5. 9. 20:33

 

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

 


문제

    1. 첫째 줄에 수의 개수 N ( 1 <= N <= 500000, N % 2 == 1 ) 이 입력된다.
    2. 둘째 줄부터 N개의 줄에 정수들이 주어진다. ( Math.abs( 입력되는 정수 ) <= 4000 )
    3. 첫째 줄에는 산술평균을 출력한다. 소수점 이하 첫째 자리에서 반올림한 값을 출력한다.
    4. 둘째 줄에는 중앙값을 출력한다.셋째 줄에는 최빈값을 출력한다.
    5. 여러 개 있을 때에는 최빈값 중 두 번째로 작은 값을 출력한다.
    6. 넷째 줄에는 범위를 출력한다.

 

 

정답 코드

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

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

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

        int[] list = new int[N];
        HashMap<Integer, Integer> map = new HashMap<>();

        double sum = 0;

        for (int i = 0; i < N; i++) {
            list[i] = Integer.parseInt(br.readLine());
            map.put(list[i], map.getOrDefault(list[i], 0) + 1);
            sum += list[i];
        }

        Arrays.sort(list);

        if (N == 1) {
            String result = list[0] + "\n" + // 산술 평균
                    list[0] + "\n" + // 중앙값
                    list[0] + "\n" + // 최빈값
                    0; // 범위

            System.out.println(result);
            return;
        }

        StringBuilder sb = new StringBuilder();

        sb.append(Math.round(sum / N)).append("\n"); // 산술 평균

        sb.append(list[N / 2]).append("\n"); // 중앙값

        List<Integer> temp = new ArrayList<>(map.values());
        Collections.sort(temp);

        ArrayList<Integer> result = new ArrayList<>();

        for (int key : map.keySet()) {
            if (Objects.equals(map.get(key), temp.get(temp.size() - 1))) {
                result.add(key);
            }
        }

        Collections.sort(result);

        if (result.size() <= 1) {
            sb.append(result.get(0)).append("\n"); // 최빈값
        } else {
            sb.append(result.get(1)).append("\n"); // 최빈값
        }

        sb.append(list[N - 1] - list[0]); // 범위

        System.out.println(sb);
    }
}

 

다른 건 다 쉬운데 최빈값을 구하는 게 어려운 것 같다.

다른 건 조건만 잘 지켜주면 된다.