[백준] 2108 통계학

문제보기

import java.util.*;
import java.io.*;
class myNum{ // 최빈값 구할 때 사용할 클래스
  int num;
  int cnt;
  myNum(int num, int cnt){
    this.num = num;
    this.cnt = cnt;
  }
}
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[] num = new int[n]; // 주어진 숫자를 담을 배열 
    // 차례대로 평균값, 중앙값, 최빈값, 최대최소차이값 
    double a = 0.0;
    int b = 0;
    int c = 0;
    int d = 0;

    for(int i = 0 ; i < n ; i++){
      num[i] = Integer.parseInt(br.readLine()); // 숫자 입력 받기
      a += num[i]; // 평균값에 차곡차곡 넣어줌 
    }
    if( n == 1 ){ // 만약 숫자가 1개만 들어올 경우 - 예외처리 
      System.out.println(num[0]+"\n"+num[0]+"\n"+num[0]+"\n0");
      return;
    }
		// 오름차순으로 정리
    Arrays.sort(num);

    a = Math.round(a/n); // 합이 모두 더해져 있으므로 전체갯수로 나눠준 뒤 반올림하면 끝
    b = num[n/2]; // 중앙값이니까 중앙번째 값 넣어줌
    d = num[n-1] - num[0]; // 양끝값이 최대 최소 이므로

    List<myNum> list = new ArrayList<>(); // 숫자별 갯수를 입력받을 리스트
    int cnt = 1;
    for(int i = 1 ; i < n ; i++){
      int now = num[i];
      int prev = num[i-1];

      if( now == prev ) cnt++;
      else{
        list.add(new myNum(prev, cnt));
        cnt = 1; // 초기화
      }
      if( i == n-1 ){ // 마지막 처리
        list.add(new myNum(now, cnt));
      }
    }

    list.sort(new Comparator<myNum>(){
      @Override
      public int compare(myNum o1, myNum o2){
        if(o1.cnt > o2.cnt){ // 최빈값이 앞으로 오도록
          return -1;
        }else if(o1.cnt == o2.cnt){ // 만약 같다면 숫자 순서대로
          return o1.num - o2.num;
        }else{
          return 1;
        }
      }
    });

    if( list.get(0).cnt > list.get(1).cnt ){ // 최빈값이 한개면
      c = list.get(0).num; // 출력
    }else{ // 최빈값이 여러개면
      c = list.get(1).num; // 두번째로 작은 값 출력 
    }

    System.out.println((int)a+"\n"+b+"\n"+c+"\n"+d);
  }
}

Tags:

Categories:

Updated:

Comments