본문 바로가기
Baekjoon

[백준] 2108 - 통계학 [JAVA]

by kssosoy 2025. 6. 20.

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

 

[정답]

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];
        for(int i = 0; i < n; i++){
            arr[i]=Integer.parseInt(br.readLine());
        }
        long result1=Math.round((float) Arrays.stream(arr).sum() /arr.length);
        System.out.println(result1);

        Arrays.sort(arr);
        int result2=arr[n/2];
        System.out.println(result2);

        HashMap<Integer, Integer> map = new HashMap<>();
        int maxcount=0;
        for(int i = 0; i < n; i++){
            map.put(arr[i], map.getOrDefault(arr[i], 0) + 1);
        }
        maxcount=Collections.max(map.values());
        ArrayList<Integer> result3=new ArrayList<>();
        for(Map.Entry<Integer, Integer> entry : map.entrySet()){
            if(entry.getValue()==maxcount){
                result3.add(entry.getKey());
            }
        }
        Collections.sort(result3);
        if(result3.size()>=2){
            System.out.println(result3.get(1));
        }
        else{
            System.out.println(result3.get(0));
        }

        int result4=Arrays.stream(arr).max().getAsInt()-Arrays.stream(arr).min().getAsInt();
        System.out.println(result4);


    }
}

 

[풀이]

1. 산술평균의 경우 배열의 합에서 / 배열의 길이

-> Arrays.stream(arr).sum() 스트림 함수 사용

-> 반올림을 위해 Math.round를 통해 소수 첫째자리 반올림 -> long값으로 반환

 

2. 중앙값

증가하는 순서대로 나열 -> Arrays.sort()

개수가 홀수개이므로 n/2 인덱스의 값

 

3. 최빈값 

가장 어려움을 겪었는데

key: value = 배열의 값, 빈도 수  저장하기 위해 HashMap을 사용

최빈값이 여러개 나올 수 있으므로 ArrayList를 사용 ( 원래 일반 배열을 사용했는데 배열의 길이를 선언하고 해야해서 0값이 들어가서 변경,,)

1. for문을 사용하여 map에 배열값과 빈도수를 저장

 for(int i = 0; i < n; i++){
            map.put(arr[i], map.getOrDefault(arr[i], 0) + 1);
        }

 

2. for문을 돌면서 maxcount( 가장 높은 빈도수)와 같으면 최빈값 배열에 저장

for(Map.Entry<Integer, Integer> entry : map.entrySet()){
            if(entry.getValue()==maxcount){
                result3.add(entry.getKey());
            }
        }

 

3. 최빈값 배열의 값을 정렬 => 만약 여러 개일 경우 최빈값 중 두번째를 출력하기 위해

Collections.sort(result3);

 

4.  최빈값이 2개 이상이면 2번째 값 출력, 아니면 첫번째 값 출력

if(result3.size()>=2){
            System.out.println(result3.get(1));
        }
        else{
            System.out.println(result3.get(0));
        }

 

4. 범위

최대값에서 최소값을 빼야 하기 때문에

stream 함수를 사용하여 빼기 진행하여 계산

'Baekjoon' 카테고리의 다른 글

[백준] 1309 동물원 [JAVA]  (0) 2025.07.02
[백준] 15655- N과 M (6) [JAVA]  (0) 2025.06.20
[백준] 1966- 프린터큐 [JAVA]  (0) 2025.06.19
[백준] 10866- 덱 [JAVA]  (0) 2025.06.19
[백준] 11866- 요세푸스 문제 0 [JAVA]  (0) 2025.06.18