백준 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()
를 사용하자