수를 처리하는 것은 통계학에서 상당히 중요한 일이다. 통계학에서 N개의 수를 대표하는 기본 통계값에는 다음과 같은 것들이 있다. 단, N은 홀수라고 가정하자.
N개의 수가 주어졌을 때, 네 가지 기본 통계값을 구하는 프로그램을 작성하시오.
첫째 줄에 수의 개수 N(1 ≤ N ≤ 500,000)이 주어진다. 단, N은 홀수이다. 그 다음 N개의 줄에는 정수들이 주어진다. 입력되는 정수의 절댓값은 4,000을 넘지 않는다.
첫째 줄에는 산술평균을 출력한다. 소수점 이하 첫째 자리에서 반올림한 값을 출력한다.
둘째 줄에는 중앙값을 출력한다.
셋째 줄에는 최빈값을 출력한다. 여러 개 있을 때에는 최빈값 중 두 번째로 작은 값을 출력한다.
넷째 줄에는 범위를 출력한다.
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.*;
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[] arr = new int[n];
Map<Integer, Integer> map = new HashMap<>();
int sum = 0;
for(int i = 0; i < n; i++) {
int val = Integer.parseInt(br.readLine());
arr[i] = val;
sum += val;
map.put(val, map.get(val) == null ? 0 : map.get(val) + 1);
}
// 1. 산술평균
System.out.println(Math.round((float) sum / n));
Arrays.sort(arr);
// 2. 중앙값
System.out.println(arr[n / 2]);
// 3. 최빈값
int max = Collections.max(map.values());
List<Integer> list = new ArrayList<>();
for(Map.Entry<Integer, Integer> entry : map.entrySet()) {
if(entry.getValue() == max) {
list.add(entry.getKey());
}
}
Collections.sort(list);
if(list.size() > 1) {
System.out.println(list.get(1));
} else if(list.size() == 1) {
System.out.println(list.get(0));
} else {
System.out.println(arr[1]);
}
// 4. 범위
System.out.println(arr[n - 1] - arr[0]);
}
}
해당 문제는 입력 값을 이용해서 산술평균, 중앙값, 최빈값, 범위 이 네가지를 구하는 문제입니다.
각각의 값을 구하는 방법은 아래와 같습니다.
1. 산술평균은 각 요소 값을 더해서 n으로 나누어주고 첫째자리에서 반올림 해주면 구해집니다.
2. 중앙값은 arr 배열에서 전체 크기의 절반에 있는 요소 값을 구해주면 됩니다.
3. 최빈값은 아래와 같은 순서로 구할 수 있습니다
1. Map을 활용하여 <입력값, count>와 같은 식으로 처음 입력 당시에 입력 받고
2. Map의 value 값이 가장 높은 값을 구하고, Map을 값들중 최댓값과 같은 값을 List에 저장해줍니다
3. list를 오름차순으로 정렬 후 list의 크기가 1보다 클때는 2번째 값 출력, 크기가 1일 때는 첫번째 값 출력, 그 외에는 처음 입력 받은 배열의 2번째 요소를 출력해줍니다.
4. 범위는 arr 배열 최대값 - 최솟값으로 구해줍니다.