[백준] 2108번 통계학 Java 문제 풀이

2023. 2. 17. 12:01알고리즘/백준

728x90
반응형

문제풀이

import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.util.*;

interface Main {
    public static void main(String[] args) throws Exception {
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        StringBuilder sb = new StringBuilder();

        int N = Integer.parseInt(br.readLine());
        int[] arr  = new int[8001];

        int min = 4000, max = -4000, sum = 0, num;
        for(int i=0; i<N; i++) {
            num = Integer.parseInt(br.readLine());
            if(num > max) max = num;
            if(num < min) min = num;
            arr[num+4000]++;
            sum += num;
        }

        int midSum = 0, midVal = 0, maxFreq = 0, freq = 0, prevFreq = 0;
        for(int i=arr.length-1; i>=0; i--) {
            if(arr[i] > 0) {
                if (midSum < N / 2 + 1) {
                    midSum += arr[i];
                    midVal = i - 4000;
                }

                if(maxFreq < arr[i]) {
                    maxFreq = arr[i];
                    freq = i - 4000;
                    prevFreq = i - 4000;
                } else if(maxFreq == arr[i]) {
                    freq = prevFreq;
                    prevFreq = i - 4000;
                }
            }
        }

        sb.append(Math.round((float)sum/N)+"\n");
        sb.append(midVal+"\n");
        sb.append(freq+"\n");
        sb.append(max-min);

        System.out.print(sb);
    }
}

길이가 8001짜리 배열을 선언해서 -4000부터 4000까지 각 숫자가 나타난 횟수를 담을 수 있도록 했습니다.

 

1. 평균

    입력받는 동시에 값들을 모두 sum에 합해두고 나중에 N으로 나누면 됩니다.

    소수점 첫째 자리까지 구한 다음 반올림을 해야 하므로 Math.round() 함수를 사용했습니다. 셋째 자리까지 구해야 한다면 (float) Math.round(값*1000)/1000 이런 식으로 하면 됩니다.

 

2. 중앙값

    중앙값 때문에 배열 끝에서부터 순회했습니다. "증가하는 순서로 나열했을 경우 중앙에 위치하는 값"이기 때문에 입력 순서에 상관없이 N/2+1 번째에 있는 값이 중앙값이 됩니다.

    midSum은 등장한 횟수의 합입니다. midSum이 N/2+1보다 작으면 계속 값을 더해주고 마지막 midVal에 저장된 값이 중앙값이 됩니다.

    

3. 최빈값

    배열에 저장된 값이 나타난 횟수이므로 가장 큰 값을 찾으면 됩니다. 배열 값이 클 경우 최빈값일 수 있으므로 maxFreq에 저장하고 freq(최빈값)과 prevFreq(이전 최빈값)에 값을 저장해 둡니다.

    maxFreq와 같은 값이 있을 경우 최빈값이 여러 개가 있다는 조건이 성립될 수 있으므로 freq(최빈값)에는 prevFreq(이전 최빈값)을 넣어주고 prevFreq(이전 최빈값)에는 현재 등장한 값을 넣어줍니다. 이런 식으로 반복하게 되면 freq에는 항상 최빈값이 저장되므로 그대로 출력하면 됩니다.

 

4. 범위

    입력받는 동시에 최소값과 최대값을 비교하여 구해둡니다. 마지막에 max에서 min만 빼주면 됩니다.

 

출처 : https://www.acmicpc.net/problem/2108

 

2108번: 통계학

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

www.acmicpc.net

 

728x90
반응형