[백준 Java]_통계학 (2108)

NANO·2026년 3월 16일

[Algorithm]

목록 보기
4/10
post-thumbnail

문제 정보


문제 요약

N개의 수가 주어질 때 산술평균, 중앙값, 최빈값, 범위를 순서대로 출력하는 문제.

  • 최빈값이 여러 개면 두 번째로 작은 값 출력
  • 산술평균은 소수점 첫째 자리에서 반올림

풀이 접근

  1. 입력받은 수를 배열에 저장 후 정렬
  2. 산술평균: 합계 / N, Math.round()로 반올림
  3. 중앙값: 정렬 후 num[N/2]
  4. 최빈값: HashMap으로 빈도 계산 → 최대 빈도값 구하고 정렬된 배열에서 순서대로 탐색해 두 번째 최빈값 처리
  5. 범위: num[N-1] - num[0]

핵심 아이디어

  • 최빈값이 여러 개일 때 두 번째로 작은 값을 뽑아야 해서 정렬된 배열을 순서대로 순회하며 count가 2가 되는 순간 break
  • prev 변수로 같은 값을 중복 카운트하지 않도록 처리
  • Math.round()는 -0 출력 문제가 없어서 산술평균 반올림에 적합

코드

import java.util.Arrays;
import java.util.HashMap;
import java.util.Scanner;

class Main {
    public static void main(String[] args) {
        Scanner scanner = new Scanner(System.in);
        int N = scanner.nextInt();
        int[] num = new int[N];

        for (int i = 0; i < N; i++) {
            num[i] = scanner.nextInt();
        }

        Arrays.sort(num);

		// 산술 평균
        long sum = 0;
        for (int n : num) sum += n;
        System.out.println(Math.round((double) sum / N));

		// 중앙값
        System.out.println(num[num.length/2]);

		// 최빈값
        HashMap<Integer, Integer> freq = new HashMap<>();
        for (int n : num) freq.put(n, freq.getOrDefault(n, 0) +1);
        int max = 0;
        for (int n : freq.values()) if (n > max) max = n;

        int mode = 0;
        int count = 0;
        int prev = Integer.MIN_VALUE;
        for (int n : num) {
            if(freq.get(n) == max && n != prev) {
                count++;
                mode = n;
                prev = n;
                if (count == 2) break;
            }
        }
        System.out.println(mode);

		// 범위
        System.out.println(num[N-1] - num[0]);

        scanner.close();

    }
}

배운 점 / 회고

  • 최빈값 조건을 처음에 대수롭지 않게 봤다가 틀렸던 문제이다.
  • HashMap + 정렬 배열 순회 조합으로 해결했으나, Collection이나 배열 풀이법도 있는 듯하다.
  • -0 출력 방지를 위해 printf 대신 Math.round() + println 을 쓰는 게 안전하다는 것도 배웠다.
profile
즐거운 토마토

0개의 댓글