코린이의 소소한 공부노트

[백준 온라인 저지] 2108. 통계학 본문

코딩테스트 풀이/JAVA

[백준 온라인 저지] 2108. 통계학

무지맘 2023. 6. 22. 13:08

산술평균 : N개의 수들의 합을 N으로 나눈 값

중앙값 : N개의 수들을 증가하는 순서로 나열했을 경우 그 중앙에 위치하는 값

최빈값 : N개의 수들 중 가장 많이 나타나는 값

범위 : N개의 수들 중 최댓값과 최솟값의 차이

 

1. 입력

- 첫째 줄에 수의 개수 N(1 N 500,000)이 주어진다. , N은 홀수이다.

- 그 다음 N개의 줄에는 정수들이 주어진다. 입력되는 정수의 절댓값은 4,000을 넘지 않는다.

 

2. 출력

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

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

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

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

 

3. 예제

 

4. 코드

import java.util.*;
import java.io.*;
class Main {
    public static void main(String[] args) throws IOException {
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(System.out));
        int n = Integer.valueOf(br.readLine());
        int[] nums = new int[n];
        double sum = 0;
        HashMap<Integer, Integer> m = new HashMap<>();
        int maxcount = 0;
        
        for(int i=0 ; i<n ; i++) {
        	nums[i] = Integer.valueOf(br.readLine());
        	sum += nums[i];
        	m.put(nums[i], m.getOrDefault(nums[i],0)+1);
        	if(m.get(nums[i])>maxcount) maxcount = m.get(nums[i]);
        }
        bw.write((int)Math.round(sum/n)+"\n"); // 산술평균
        
        Arrays.sort(nums);
        bw.write(nums[n/2]+"\n"); // 중앙값
        
        List<Integer> freq = new ArrayList<>();
        for(int i : m.keySet())
        	if(m.get(i)==maxcount) freq.add(i);
        freq.sort(Comparator.naturalOrder());
        if(freq.size()==1) bw.write(freq.get(0)+"\n"); // 최빈값
        else bw.write(freq.get(1)+"\n");
        
        bw.write((nums[n-1]-nums[0])+"\n"); // 범위
        
        bw.flush(); bw.close();
    }
}

- 76488KB, 756ms