[백준] 통계학

개발자 P군·2025년 7월 21일

백준

목록 보기
38/57
post-thumbnail

🔗 문제 보기 - [백준] 통계학

📖 문제

수를 처리하는 것은 통계학에서 상당히 중요한 일이다. 통계학에서 N개의 수를 대표하는 기본 통계값에는 다음과 같은 것들이 있다. 단, N은 홀수라고 가정하자.

  1. 산술평균 : N개의 수들의 합을 N으로 나눈 값
  2. 중앙값 : N개의 수들을 증가하는 순서로 나열했을 경우 그 중앙에 위치하는 값
  3. 최빈값 : N개의 수들 중 가장 많이 나타나는 값
  4. 범위 : N개의 수들 중 최댓값과 최솟값의 차이

N개의 수가 주어졌을 때, 네 가지 기본 통계값을 구하는 프로그램을 작성하시오.

✍ 입력

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

📄 출력

첫째 줄에는 산술평균을 출력한다. 소수점 이하 첫째 자리에서 반올림한 값을 출력한다.

둘째 줄에는 중앙값을 출력한다.

셋째 줄에는 최빈값을 출력한다. 여러 개 있을 때에는 최빈값 중 두 번째로 작은 값을 출력한다.

넷째 줄에는 범위를 출력한다.

✅ 코드

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[] arr = new int[n];  
        Map<Integer, Integer> map = new HashMap<>();  
  
        int sum = 0;  
        for(int i = 0; i < n; i++) {  
            int val = Integer.parseInt(br.readLine());  
            arr[i] = val;  
            sum += val;  
            map.put(val, map.get(val) == null ? 0 : map.get(val) + 1);  
        }
        
        // 1. 산술평균  
        System.out.println(Math.round((float) sum / n));  
  
        Arrays.sort(arr);  
  
        // 2. 중앙값  
        System.out.println(arr[n / 2]);  
  
        // 3. 최빈값  
        int max = Collections.max(map.values());  
        List<Integer> list = new ArrayList<>();  
        for(Map.Entry<Integer, Integer> entry : map.entrySet()) {  
            if(entry.getValue() == max) {  
                list.add(entry.getKey());  
            }  
        }  
  
        Collections.sort(list);  
        if(list.size() > 1) {  
            System.out.println(list.get(1));  
        } else if(list.size() == 1) {  
            System.out.println(list.get(0));  
        } else {  
            System.out.println(arr[1]);  
        }
        
        // 4. 범위  
        System.out.println(arr[n - 1] - arr[0]);  
  
    }  
}

🧩 코드풀이

해당 문제는 입력 값을 이용해서 산술평균, 중앙값, 최빈값, 범위 이 네가지를 구하는 문제입니다.

각각의 값을 구하는 방법은 아래와 같습니다.
1. 산술평균은 각 요소 값을 더해서 n으로 나누어주고 첫째자리에서 반올림 해주면 구해집니다.
2. 중앙값arr 배열에서 전체 크기의 절반에 있는 요소 값을 구해주면 됩니다.
3. 최빈값은 아래와 같은 순서로 구할 수 있습니다
1. Map을 활용하여 <입력값, count>와 같은 식으로 처음 입력 당시에 입력 받고
2. Map의 value 값이 가장 높은 값을 구하고, Map을 값들중 최댓값과 같은 값을 List에 저장해줍니다
3. list를 오름차순으로 정렬 후 list의 크기가 1보다 클때는 2번째 값 출력, 크기가 1일 때는 첫번째 값 출력, 그 외에는 처음 입력 받은 배열의 2번째 요소를 출력해줍니다.
4. 범위는 arr 배열 최대값 - 최솟값으로 구해줍니다.

profile
문제를 발견하고 해결하는 과정을 통해 얻은 새로운 지식을 공유하고자 합니다.

0개의 댓글