CodingTEST

[백준 2108] 통계학 (JAVA)

경걍 2023. 11. 30. 02:53
반응형

백준 2108번 문제 - 통계학

 

2108번: 통계학

첫째 줄에 수의 개수 N(1 ≤ N ≤ 500,000)이 주어진다. 단, N은 홀수이다. 그 다음 N개의 줄에는 정수들이 주어진다. 입력되는 정수의 절댓값은 4,000을 넘지 않는다.

www.acmicpc.net


문제 분석

 

 

  • 수를 N개 입력 받고, 다음 4가지 값을 출력해라
    • 산술평균 : N개의 수들의 합을 N으로 나눈 값 (소수점 이하 첫째자리에서 반올림한 값)
    • 중앙값 : N개의 수들을 증가하는 순서로 나열했을 경우 그 중앙에 위치하는 값
    • 최빈값 : N개의 수들 중 가장 많이 나타나는 값 (여러개 일 경우 2번째로 작은 값)
    • 범위 : N개의 수들 중 최댓값과 최솟값의 차이

해결 키 포인트

 

  • 반올림하는 방법 : (int) Math.round((double)sum/N)
  • 최빈수 구하는 법
    1. 숫자 정렬
    2. 최빈수를 숫자 리스트 생성
    3. 최빈수 개수 기록
    4. 숫자가 바뀌면 현재 숫자 개수 초기화
      - 이전 숫자 개수가 최빈수와 동일할 경우: 리스트 추가
      - 이전 숫자 개수가 최빈수보다 큰 경우: 리스트 초기화 및 추가

코드

 

import java.io.*;
import java.util.*;

public 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.parseInt(br.readLine());

        int [] nums = new int[N];
        int sum = 0;
        for (int i = 0; i < N; i++) {
            nums[i] = Integer.parseInt(br.readLine());
            sum += nums[i];
        }

        // 정렬
        Arrays.sort(nums);

        // 최빈수 구하기
        ArrayList<Integer> manyNum = new ArrayList<>();
        int manyCount = -1;
        int checkNum = 9999;
        int checkCount = 0;
        for (int i = 0; i < N; i++) {
            if(checkNum != nums[i]) {
                if(manyCount < checkCount) {
                    manyCount = checkCount;
                    manyNum.clear();
                    manyNum.add(checkNum);
                }
                else if(manyCount == checkCount) {
                    manyCount = checkCount;
                    manyNum.add(checkNum);
                }
                checkCount = 1;
                checkNum = nums[i];
            }
            else {
                checkCount++;
            }
        }
        // 제일 큰 수도 체크
        if(manyCount < checkCount) {
            manyNum.clear();
            manyNum.add(checkNum);
        }
        else if(manyCount == checkCount) {
            manyNum.add(checkNum);
        }

        // 최빈수가 여러개일 경우 2번째 작은 수로
        Collections.sort(manyNum);
        int frequent = (manyNum.size() >= 2) ? manyNum.get(1) : manyNum.get(0);
        // 평균
        int avg = (int) Math.round((double)sum/N);
        // 중간값
        int mid = nums[N/2];
        // 큰 값 - 작은 값
        int maxToMin = nums[N-1] - nums[0];

        bw.write(avg+"\n");
        bw.write(mid+"\n");
        bw.write(frequent+"\n");
        bw.write(maxToMin+"\n");
        bw.flush();
        bw.close();
    }
}
반응형