
N개의 수가 주어질 때 산술평균, 중앙값, 최빈값, 범위를 순서대로 출력하는 문제.
- 최빈값이 여러 개면 두 번째로 작은 값 출력
- 산술평균은 소수점 첫째 자리에서 반올림
Math.round()로 반올림num[N/2]HashMap으로 빈도 계산 → 최대 빈도값 구하고 정렬된 배열에서 순서대로 탐색해 두 번째 최빈값 처리num[N-1] - num[0]prev 변수로 같은 값을 중복 카운트하지 않도록 처리Math.round()는 -0 출력 문제가 없어서 산술평균 반올림에 적합import java.util.Arrays;
import java.util.HashMap;
import java.util.Scanner;
class Main {
public static void main(String[] args) {
Scanner scanner = new Scanner(System.in);
int N = scanner.nextInt();
int[] num = new int[N];
for (int i = 0; i < N; i++) {
num[i] = scanner.nextInt();
}
Arrays.sort(num);
// 산술 평균
long sum = 0;
for (int n : num) sum += n;
System.out.println(Math.round((double) sum / N));
// 중앙값
System.out.println(num[num.length/2]);
// 최빈값
HashMap<Integer, Integer> freq = new HashMap<>();
for (int n : num) freq.put(n, freq.getOrDefault(n, 0) +1);
int max = 0;
for (int n : freq.values()) if (n > max) max = n;
int mode = 0;
int count = 0;
int prev = Integer.MIN_VALUE;
for (int n : num) {
if(freq.get(n) == max && n != prev) {
count++;
mode = n;
prev = n;
if (count == 2) break;
}
}
System.out.println(mode);
// 범위
System.out.println(num[N-1] - num[0]);
scanner.close();
}
}
HashMap + 정렬 배열 순회 조합으로 해결했으나, Collection이나 배열 풀이법도 있는 듯하다.-0 출력 방지를 위해 printf 대신 Math.round() + println 을 쓰는 게 안전하다는 것도 배웠다.