21.08.23 기록
백준 알고리즘 2108 풀이
🎆해설(메모리 40.4MB, 시간 348ms로 통과)
-입력값에 음수가 있을 때의 처리와, 최빈값 출력을 해결하지 못해 해설을 보았다.
-산술평균 출력의 경우 sum이나 N중 하나를 double로 캐스팅하여 소수점이 버려지는 것을 방지하고, 반올림을 하여 int형으로 다시 캐스팅해야한다.
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
public class B2108 {
public static void main(String[] args) throws IOException {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
int N = Integer.parseInt(br.readLine());
final int RANGE = 4000;
int[] numbers = new int[2*RANGE+1];
int sum = 0; //총 합계
int max = Integer.MIN_VALUE; //최댓값
int min = Integer.MAX_VALUE; //최솟값
// -4000 ~ 4000 을 제외한 수로 초기화
int median = 10_000; //중앙값
int mode = 10_000; //최빈값
for(int i = 0; i < N; i++) {
int num = Integer.parseInt(br.readLine());
sum += num;
numbers[num+RANGE]++;
if(max < num) { max = num; }
if(min > num) { min = num; }
}
int cnt = 0; //중앙값 빈도 누적 수
int modeMax = 0; //최빈값의 최댓값
//이전의 동일한 최빈값이 1번만 등장했을 경우 true
boolean flag = false;
for(int i = (min + RANGE); i <= (max + RANGE); i++) {
if(numbers[i] > 0) {
//중앙값 찾기
if (cnt < (N + 1) / 2) {
cnt += numbers[i];
median = (i - RANGE);
}
//최빈값 찾기
if (modeMax < numbers[i]) {
modeMax = numbers[i];
mode = (i - RANGE);
flag = true;
} else if (modeMax == numbers[i] && flag) {
mode = (i - RANGE);
flag = false;
}
}
}
StringBuilder sb = new StringBuilder();
sb.append((int)Math.round((double)sum/N)).append("\n").append(median).append("\n").append(mode).append("\n").append(max-min).append("\n");
System.out.println(sb);
}
}