21.08.23 기록

1 분 소요

백준 알고리즘 2108 풀이

🎆해설(메모리 40.4MB, 시간 348ms로 통과)

-입력값에 음수가 있을 때의 처리와, 최빈값 출력을 해결하지 못해 해설을 보았다.
-산술평균 출력의 경우 sum이나 N중 하나를 double로 캐스팅하여 소수점이 버려지는 것을 방지하고, 반올림을 하여 int형으로 다시 캐스팅해야한다.

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;

public class B2108 {
    public static void main(String[] args) throws IOException {
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        int N = Integer.parseInt(br.readLine());

        final int RANGE = 4000;
        int[] numbers = new int[2*RANGE+1];

        int sum = 0;                    //총 합계
        int max = Integer.MIN_VALUE;    //최댓값
        int min = Integer.MAX_VALUE;    //최솟값

        // -4000 ~ 4000 을 제외한 수로 초기화
        int median = 10_000;            //중앙값
        int mode = 10_000;              //최빈값

        for(int i = 0; i < N; i++) {
            int num = Integer.parseInt(br.readLine());
            sum += num;
            numbers[num+RANGE]++;

            if(max < num) { max = num; }
            if(min > num) { min = num; }
        }

        int cnt = 0;        //중앙값 빈도 누적 수
        int modeMax = 0;    //최빈값의 최댓값

        //이전의 동일한 최빈값이 1번만 등장했을 경우 true
        boolean flag = false;

        for(int i = (min + RANGE); i <= (max + RANGE); i++) {
            if(numbers[i] > 0) {

                //중앙값 찾기
                if (cnt < (N + 1) / 2) {
                    cnt += numbers[i];
                    median = (i - RANGE);
                }

                //최빈값 찾기
                if (modeMax < numbers[i]) {
                    modeMax = numbers[i];
                    mode = (i - RANGE);
                    flag = true;
                } else if (modeMax == numbers[i] && flag) {
                    mode = (i - RANGE);
                    flag = false;
                }
            }
        }

        StringBuilder sb = new StringBuilder();
        sb.append((int)Math.round((double)sum/N)).append("\n").append(median).append("\n").append(mode).append("\n").append(max-min).append("\n");
        System.out.println(sb);
    }
}

카테고리:

업데이트: