본문 바로가기
알고리즘/백준

백준 2108번 - 통계학 (Java 8)

by latissimus 2022. 3. 3.

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

 

2108번: 통계학

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

www.acmicpc.net

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.ArrayList;
import java.util.Collections;
import java.util.List;

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[] counting = new int[8001]; //0~8000 -> 1~4000 음수, 4001~8000 양수
        int sum = 0;
        int max = -4000;
        int min = 4001;

        //카운팅 배열 생성
        for(int i=0; i<N; i++){
            int index = Integer.parseInt(br.readLine());
            //합
            sum += index;
            //최댓값
            max = Math.max(max, index);
            //최솟값
            min = Math.min(min, index);

            //1~8000
            //음수: 인덱스 0~3999  / 0: 인덱스 4000 / 양수 : 인덱스 4001~8000
            index += 4000;
            counting[index]++;
        }


        //산술평균
        int mean = (int)Math.round((double)sum/N);

        //중앙값
        // N/2+1 번째 수가 필요?
        int medianIndex = 0;
        int median =0;
        for(int i=0; i<8001; i++){
            medianIndex += counting[i];
            if(medianIndex >= N/2+1) {
                median = i;
                break;
            }
        }
        median -= 4000;

        //최빈값
        // 문제 발생, 1~4000에 -를 곱하면 크기 순서가 역순이 되어버림. 최빈값 두 번째 출력에 문제가 생긴다.
        int mode = 0;
        int modeIndex = 0;
        for(int i=0; i<8001; i++){
            modeIndex = Math.max(counting[i], modeIndex);
        }
        int modeCount = 0;
        for(int i=0; i<8001; i++){
            if(counting[i] == modeIndex){
                mode = i;
                modeCount++;
                if(modeCount == 2) break;
            }
        }
        mode -= 4000;

        //범위
        int range = max - min;

        //출력
        StringBuilder sb = new StringBuilder();
        sb.append(mean).append("\n")
                .append(median).append("\n")
                .append(mode).append("\n")
                .append(range);

        System.out.println(sb);
    }
}

 

그냥 풀기 위한 코드를 무작정 썼는데, 많이 틀리고 시간도 오래걸리고 코드도 지저분하고... 자괴감이 든다. 참고도 안하고 풀어서 좋은 방법인지 내일 확인해야겠다. 다음엔 더 빨리 풀어봐야겠다.

 

계수 정렬 중간단계에서 풀어버린 느낌인데 뭔지 모르겠다.

댓글