728x90
문제
https://www.acmicpc.net/problem/2108
접근 방법
1. 산술평균, 중앙값, 최빈값(같으면 2번째 작은값), 범위를 구하면 되는 문제이다.
2. 카운팅 정렬을 만들고 풀어줍니다.
3. 최빈값은 flag를 만들어 만약 뒤에 나온 값이 앞에 나온 최빈값이랑 같으면 변경해주고, flag를 다시 false로 바꾸면서 풀었습니다.
코드
import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.util.Arrays;
import java.util.StringTokenizer;
public class Main {
private static StringBuilder sb;
private static BufferedReader br;
private static StringTokenizer st;
private static int N;
private static int[] arr = new int[8010];
private static double sum; //산술평균
private static int mid; //중앙값
private static int count; // 최빈값
private static int max = Integer.MIN_VALUE; //범위
private static int min = Integer.MAX_VALUE; //범위
//입력
public static void input() throws Exception {
br = new BufferedReader(new InputStreamReader(System.in));
sb = new StringBuilder();
N = Integer.parseInt(br.readLine());
for(int i = 0 ; i < N ; i++){
int input = Integer.parseInt(br.readLine());
arr[input+4000]++;
sum += input;
if(input > max){
max = input;
}
if(input < min){
min = input;
}
}
}
//실행
public static void process() {
int midCount = 0 ;
int recentCnt = 0;
boolean flag = false;
for(int i = min+4000 ; i <= max+4000 ; i++){
if(arr[i] > 0){
//중앙값
if(midCount < (N+1)/2){
midCount += arr[i];
mid = i-4000;
}
//최빈값
if(recentCnt < arr[i]){
recentCnt = arr[i];
count = i-4000;
flag = true;
}else if(flag == true && recentCnt == arr[i]){
count = i-4000;
flag = false;
}
}
}
System.out.println(Math.round(sum/N));
System.out.println(mid);
System.out.println(count);
System.out.println(max-min);
}
public static void main(String[] args) throws Exception {
input();
process();
}
}
'코딩테스트 > 백준' 카테고리의 다른 글
[Java] 백준 2231번 : 분해합 (0) | 2024.04.29 |
---|---|
[Java] 백준 2164번 : 카드2 (0) | 2024.04.29 |
[Java] 백준 1978번 : 소수 찾기 (0) | 2024.04.26 |
[Java] 백준 1966번 : 프린터 큐 (0) | 2024.04.26 |
[Java] 백준 1929번 : 소수 구하기 (0) | 2024.04.25 |