본문 바로가기

백준 문제풀기/JAVA

[백준 2108 JAVA 자바] 통계학

4개의 통계값을 출력하는 문제입니다

 

산술평균 = (전체합)/(표본 수) 반올림함수를 이용합시다

중앙값 = sort하여 중앙에 있는 값을 출력합시다

최빈값 = "가장 많이 나온 값" 여러개인경우 "두번째로 작은 값" <-어려운 부분이네요

범위 = sort하거나 입력할때 min max를 찾읍시다

 

코드입니다

 

import java.util.ArrayList;
import java.util.Collections;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.Scanner;

public class Main {
	public static void main(String[] args){
    
    	Scanner scan = new Scanner(System.in);
    
    	int n = scan.nextInt();
    	ArrayList<Integer> numbers = new ArrayList<>();
    
    	int sum=0;
    
    	for(int i=0; i<n; i++) {
        int t = scan.nextInt();
        numbers.add(t);
        sum += t;
        }
            
        double average = (double) sum / n;
        double roundedAverage = Math.round(average);
		
        Collections.sort(numbers);
        int length = numbers.get(n-1) - numbers.get(0);
        
        Map<Integer, Integer> frequencyMap = new HashMap<>();
        for (int num : numbers) {
            frequencyMap.put(num, frequencyMap.getOrDefault(num, 0) + 1);
        }
        
        int mode = 0;
        int maxFrequency = 0;
        for (Map.Entry<Integer, Integer> entry : frequencyMap.entrySet()) {
            int num = entry.getKey();
            int frequency = entry.getValue();
            
            if (frequency > maxFrequency) {
                maxFrequency = frequency;
                mode = num;
            }
        }
        int secondSmallestMode = findSecondSmallestMode(numbers);
		
		System.out.println((int)roundedAverage);
		System.out.println(numbers.get((n-1)/2));
		System.out.println(secondSmallestMode);
		System.out.println(length);

	}

	public static int findSecondSmallestMode(ArrayList<Integer> numbers) {
        Map<Integer, Integer> frequencyMap = new HashMap<>();
        for (int num : numbers) {
            frequencyMap.put(num, frequencyMap.getOrDefault(num, 0) + 1);
        }
        int maxFrequency = 0;
        for (int frequency : frequencyMap.values()) {
            if (frequency > maxFrequency) {
                maxFrequency = frequency;
            }
        }
        List<Integer> modes = new ArrayList<>();
        for (Map.Entry<Integer, Integer> entry : frequencyMap.entrySet()) {
            int num = entry.getKey();
            int frequency = entry.getValue();

            if (frequency == maxFrequency) {
                modes.add(num);
            }
        }
        if (modes.size() == 1) {
            return modes.get(0);
        }else {
            modes.sort(null);
            return modes.get(1);
        }
    }
}

 

findSecondSmallestMode 함수가 두번째로 작은 최빈값을 구하는 함수입니다

 

frequencyMap으로 빈도수를 체크합니다

 

최대값을 찾은 다음

 List<Integer> modes = new ArrayList<>();

에 최대값을 갖는 수들을 넣어줍니다

 

modes.size() == 1 

최빈값을 갖는 수가 1개인 경우

 

else 라면

sort하고 get(1)을 합니다 

컴퓨터는 0부터 시작하기 때문에

1이 두번째로 작은 값 입니다