본문 바로가기

[BOJ] - JAVA

[백준] 2108 : 통계학 JAVA 풀이

다들 그랬겠지만 나역시도 최빈값을 구하는 게 제일 어려웠다.

빈도수가 가장 큰 걸 찾는 건 쉬운데 두 번째로 작은 값은 어떻게 찾나 엄청 고민했다.

다 풀고나서 보니 flag 하나만 추가하면 풀 수 있도록 저런 조건을 둔 것 같다.

 

1. 입력될 숫자의 개수 N을 입력받는다.

2. N개의 숫자를 입력받아 배열에 저장하고, 평균을 구할 때 사용할 누적합을 구한다.

3. N개의 숫자가 저장된 배열을 정렬한다.

4. 숫자의 빈도수를 셀 cnt, 빈도수 중 최댓값을 저장할 max, 최빈값을 저장할 mode, 처음 등장한 최빈값인지 판단하는 boolean형 flag를 생성한다.

5. 정렬된 배열을 순회하면서 다음 숫자가 자신과 같을 때마다 cnt를 증가시킨다.

6. cnt가 max보다 커지면 max와 mode값을 바꾸고 flag를 true로 바꾼다.

7. cnt와 max가 같고, flag가 true인 때가 오면,

   그때 배열의 값이 최빈값이 여러 개일 때 두 번째로 작은 값이라는 뜻이니

   mode값을 업데이트하고 flag를 false로 바꾼다.

   빈도수가 더 많은 수가 등장하지 않는 한 flag는 계속 false일 것이다.

8. 평균을 소수점 첫째자리에서 반올림한 값과 중앙값, 최빈값, 최댓값-최솟값을 구해 출력한다.

import java.io.IOException;
import java.io.InputStreamReader;
import java.util.Arrays;
import java.io.BufferedReader;
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];
        
        double sum =0;
        
        for(int i=0;i<N;i++){
            int num =Integer.parseInt(br.readLine());
            arr[i] = num;
            sum += num;
        }
        
        Arrays.sort(arr);
        
        int cnt=0;
        int max = -1;
        int mode = arr[0];
        boolean flag = false;
        
        for(int i=0;i<N-1;i++) {
        	if(arr[i] == arr[i+1]) cnt++;
        	else cnt = 0;
        	if(cnt>max) {
        		max = cnt;
        		mode = arr[i];
        		flag = true;
        	}
        	else if(cnt==max&&flag==true) {
        		mode = arr[i];
        		flag = false;
        	}
        }
       
        System.out.println(Math.round(sum/N));
        System.out.println(arr[N/2]);
        System.out.println(mode);
        System.out.println(arr[N-1]-arr[0]);
  
    }
}