수를 처리하는 것은 통계학에서 상당히 중요한 일이다. 통계학에서 N개의 수를 대표하는 기본 통계값에는 다음과 같은 것들이 있다. 단, N은 홀수라고 가정하자.
산술평균 : N개의 수들의 합을 N으로 나눈 값
중앙값 : N개의 수들을 증가하는 순서로 나열했을 경우 그 중앙에 위치하는 값
최빈값 : N개의 수들 중 가장 많이 나타나는 값
범위 : N개의 수들 중 최댓값과 최솟값의 차이
N개의 수가 주어졌을 때, 네 가지 기본 통계값을 구하는 프로그램을 작성하시오.
첫째 줄에 수의 개수 N(1 ≤ N ≤ 500,000)이 주어진다. 그 다음 N개의 줄에는 정수들이 주어진다. 입력되는 정수의 절댓값은 4,000을 넘지 않는다.
첫째 줄에는 산술평균을 출력한다. 소수점 이하 첫째 자리에서 반올림한 값을 출력한다.
둘째 줄에는 중앙값을 출력한다.
셋째 줄에는 최빈값을 출력한다. 여러 개 있을 때에는 최빈값 중 두 번째로 작은 값을 출력한다.
넷째 줄에는 범위를 출력한다.
import java.io.*;
import java.util.*;
public class Main {
private static List<Integer> list;
private static int n;
private static final int MAX = 500_001;
public static void main(String[] args) throws IOException {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
StringBuilder sb = new StringBuilder();
n = Integer.parseInt(br.readLine());
list = new ArrayList<>(MAX);
for (int i = 0; i < n; i++) {
list.add(Integer.parseInt(br.readLine()));
}
Collections.sort(list);
sb.append(getAverage()).append('\n').append(getMedian()).append('\n').append(getMode()).append('\n').append(getScope());
System.out.println(sb.toString());
}
private static int getScope() {
return list.get(n - 1) - list.get(0);
}
private static int getMode() {
int[] includeMinus = new int[8001];
List<Integer> answer = new ArrayList<>();
for (int i : list) {
if (i < 0) {
includeMinus[(-1) * i + 4000]++;
} else {
includeMinus[i]++;
}
}
int max = 0;
for (int minus : includeMinus) {
if (minus != 0 && minus > max) {
max = minus;
}
}
for (int i = 0; i < includeMinus.length; i++) {
int index = i;
if (includeMinus[i] == max) {
if (i > 4000) {
index -= 4000;
index *= (-1);
answer.add(index);
} else{
answer.add(i);
}
}
}
Collections.sort(answer);
if(answer.size() > 1) return answer.get(1);
return answer.get(0);
}
private static int getMedian() {
int centerValue = n / 2;
return list.get(centerValue);
}
private static int getAverage() {
int sum = 0;
for (int i : list) {
sum += i;
}
return Math.round((float) sum / n);
}
}