수를 처리하는 것은 통계학에서 상당히 중요한 일이다. 통계학에서 N개의 수를 대표하는 기본 통계값에는 다음과 같은 것들이 있다. 단, N은 홀수라고 가정하자.
산술평균 : N개의 수들의 합을 N으로 나눈 값
중앙값 : N개의 수들을 증가하는 순서로 나열했을 경우 그 중앙에 위치하는 값
최빈값 : N개의 수들 중 가장 많이 나타나는 값
범위 : N개의 수들 중 최댓값과 최솟값의 차이
N개의 수가 주어졌을 때, 네 가지 기본 통계값을 구하는 프로그램을 작성하시오.
첫째 줄에 수의 개수 N(1 ≤ N ≤ 500,000)이 주어진다. 단, N은 홀수이다. 그 다음 N개의 줄에는 정수들이 주어진다. 입력되는 정수의 절댓값은 4,000을 넘지 않는다.
첫째 줄에는 산술평균을 출력한다. 소수점 이하 첫째 자리에서 반올림한 값을 출력한다.
둘째 줄에는 중앙값을 출력한다.
셋째 줄에는 최빈값을 출력한다. 여러 개 있을 때에는 최빈값 중 두 번째로 작은 값을 출력한다.
넷째 줄에는 범위를 출력한다.
중앙값을 구하기 위해 해당 수를 정렬해서 가운데 있는 수를 골랐고,
최빈값을 구하기 위해 -4000~4000까지의 개수, 즉 8001개의 배열을 만들어서 각 수가 몇번 발생하는지 개수를 세었다. 개수가 같을 경우 2번째로 작은 수를 계산하기 위해서 firstMaxHaveNum과 secondMaxHaveNum 를 각각 입력받았고,
범위를 입력하기 구하기 위해서 최댓값과 최솟값을 구했다.
import java.util.*;
import java.io.*;
public class Main{
public static void main(String [] args) throws Exception {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(System.out));
int N = Integer.parseInt(br.readLine());
int num[] = new int [N];
int total = 0;
int haveNum[] = new int [8001]; //최빈값이 여러개 있을 때에는 최빈값 중 두 번 째로 작은 값을 출력한다.
int maxHaveNum = 0;
int maxHaveNumValue = -4001;
int firstMaxHaveNum = -4001;
int secondMaxHaveNum = -4001;
for(int i=0;i<N;i++) {
num[i] = Integer.parseInt(br.readLine());
total += num[i];
haveNum[num[i]+4000]++;
if(haveNum[num[i]+4000]>maxHaveNum) {
maxHaveNum = haveNum[num[i]+4000];
}
}
for(int i=0;i<8001;i++) {
if(haveNum[i]==maxHaveNum) {
if(firstMaxHaveNum==-4001) {
firstMaxHaveNum = i - 4000;
}else {
secondMaxHaveNum = i - 4000;
break;
}
}
}
if(secondMaxHaveNum==-4001) {
maxHaveNumValue = firstMaxHaveNum;
}else {
maxHaveNumValue = secondMaxHaveNum;
}
Arrays.sort(num);
double avg = (double)total/N;
bw.write(Math.round(avg)+"\n");
bw.write(num[N/2]+"\n");
bw.write(maxHaveNumValue+"\n");
bw.write((num[N-1]-num[0])+"\n");
bw.flush();
br.close();
bw.close();
}
}