728x90
import java.util.*;
public class Main {
public static void main(String[] args){
Scanner sc = new Scanner(System.in);
int N = sc.nextInt();
int[] arr = new int[8001];
int sum = 0;
int max = Integer.MIN_VALUE;
int min = Integer.MAX_VALUE;
int median = 10000;
int mode = 10000;
for(int i=0;i<N;i++){
int value = sc.nextInt();
sum += value;
arr[value + 4000]++;
if(max<value){
max = value;
}
if(min>value){
min=value;
}
}
int cnt = 0;
int mode_max=0;
boolean flag = false;
for(int i = min+4000; i<=max+4000 ; i++){
if(arr[i]>0){
if(cnt<(N+1)/2){
cnt += arr[i];
median = i-4000;
}
if(mode_max<arr[i]){
mode_max = arr[i];
mode = i-4000;
flag=true;
}
else if(mode_max == arr[i] && flag == true){
mode = i-4000;
flag=false;
}
}
}
System.out.println((int)Math.round((double)sum/N));
System.out.println(median);
System.out.println(mode);
System.out.println(max-min);
}
}
최빈값을 처리하는 방법에 대해 설명하자면..
이전의 최빈값의 최댓값(mode_max) 보다 현재 최빈값(arr[i]) 이 더 클 경우, index(i)를 최빈값에 초기화 해주며, flag 를 true 로 변경한다.
만약, 동일한 최빈값을 갖고있으면, 두 가지의 경우의 수로 나뉜다.
첫 번째는 동일한 최빈값이 이전에 1 번만 나타났을경우 인데, 이 경우에는 flag 가 true 일 테니 두 번째로 작은 값이 현재 i 가 되고 결과적으로 mode(최빈값 변수)를 초기화 해주면 된다. 그리고 반드시 flag를 false 로 바꿔주어야 된다. 이후에 같은 최빈값이 또 나오더라도 이미 두 번째로 작은 값은 변하지 않기 때문에 그래야 else if 문을 실행시키지 않으면서 두 번째로 작은 최빈값이 수정되지 않는다.
728x90
'백준 단계별' 카테고리의 다른 글
[Java] 백준 11650: 좌표 정렬하기 (0) | 2023.02.15 |
---|---|
[Java] 백준 1427: 소트인사이드 (0) | 2023.02.15 |
[Java] 백준 10989: 수 정렬하기 3 (0) | 2023.02.14 |
[Java] 백준 2751: 수 정렬하기 2 (0) | 2023.02.08 |
[Java] 백준 25305: 커트라인 (0) | 2023.02.02 |