백준 2108 - 통계학

Updated:

Java

2108 번 - 통계학

문제

접근 방법

네 가지의 기본 통계값을 각각 구해보았다.

기본적으로, Arrays.sort를 이용하여 입력 받는 수들을 정렬한다.

산술평균

평균을 구하며, 소수 점 첫째 자리에서 반올림을 하므로 Math.round()을 이용하여 반올림을 계산하였습니다. 여기서 전체 수의 합과 n을 나누는데, Math.round(3 / 2)은 정수로 나누어 지므로, 1이라는 결과가 나온다.
올바른 연산을 위해 수 앞에 (double)을 붙혀주어야 제대로 된 소수점 까지 나오므로,
Math.round((double)sum / n)로 계산합니다.

출력 포멧은 printf로 소수점은 출력하지 않게 합니다.

최빈 값

입력되는 정수의 범위는 -4000 ~ 4000이므로, 각 정수가 나타나는 빈도를 기록할 int 배열을 8001 크기 만큼 선언 합니다.
각 정수가 입력 될 때마다, 4000을 더하여 빈도 수를 계산합니다.
이는, -4000의 값이 0이 되며, 4000이 8000인 인덱스로 저장됩니다.

이후 최빈값을 찾아야하는데, 인덱스 0부터 8000까지 cnt배열을 하나씩 탐색하여 빈도 수가 더 큰 수가 나오면 그 수와 빈도수를 기록합니다.

만약 똑같은 빈도 수의 값인 더 큰 수가 나오면 그 수를 한 번더 저장합니다.
이는 최빈값을 출력한다. 여러 개 있을 때에는 최빈값 중 두 번째로 작은 값을 출력한다.에 맞추기 위해 적용합니다.

또한, 두 번째의 값을 기록했으므로, 그 기록했다는 뜻을 나타내는 boolean 변수를 나타내어 다음에 똑같은 빈도 수의 값인 더 큰 수가 나와도 갱신이 되지 않게 합니다.

코드

import java.util.*;
import java.util.Map.Entry;
import java.io.*;

public class Main {
	static int n, result;
	static long sum = 0;
	public static void main(String[] args) throws IOException {
		BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
    	n = stoi(br.readLine());
    	int[] arr = new int[n];
    	int[] cnt = new int[8001];

    	for(int i = 0; i < n; i++) {
    		arr[i] = stoi(br.readLine());
    		sum += arr[i];
    		cnt[arr[i] + 4000]++;
    	}
    	Arrays.sort(arr);
    	// 산술 평균
    	double cal = Math.round((double)sum / (double)n);
    	System.out.printf("%.0f\n", cal);

    	// 중앙 값
    	System.out.println(arr[n / 2]);

    	// 최빈 값
    	int first = arr[0], second = arr[0];
    	boolean isSec = false;	// 동일한 빈도수의 값이 여러개 있을 때 두번째로 작은 값 출력
    	int maxCnt = 0;
    	for(int i = 0; i <= 8000; i++) {
    		if(cnt[i] > maxCnt) {
    			first = i - 4000;
    			isSec = false;
    			maxCnt = cnt[i];
    		}
    		else if(cnt[i] == maxCnt && !isSec) {
    			isSec = true;
    			second = i - 4000;
    		}
    	}

    	// 가장 빈도수가 큰 값이 하나만 있을 때
    	if(!isSec) {
    		System.out.println(first);
    	}
    	else {
    		System.out.println(second);
    	}
    	// 범위
    	System.out.println(arr[n - 1] - arr[0]);

    	br.close();
	}

	static int stoi(String str) {
    	return Integer.parseInt(str);
    }
}

총평

후기

Set에 의존하는 것을 줄일 필요가 있다.

반올림을 계산 할 때 Math.round()를 사용하자

개선할 점