-
2108번 - 통계학알고리즘/백준 2023. 2. 26. 20:13
import java.io.BufferedReader; import java.io.IOException; import java.io.InputStreamReader; import java.util.Arrays; import java.util.Collections; import java.util.HashMap; import java.util.TreeSet; public class Main { public static void main(String[] args) throws IOException { BufferedReader br = new BufferedReader(new InputStreamReader(System.in)); int N = Integer.parseInt(br.readLine()); int[] numbers = new int[N]; int sum = 0; for(int i=0;i<N;i++) { numbers[i] = Integer.parseInt(br.readLine()); sum += numbers[i]; } // 산술 평균 System.out.println((int)Math.round(sum / (double)N)); // 중앙값 Arrays.sort(numbers); System.out.println(numbers[N / 2]); // 최빈값 HashMap<Integer, Integer> map = new HashMap<>(); int cnt; for(int i=0;i<N;i++) { if(map.get(numbers[i]) == null) { map.put(numbers[i], 1); } else { cnt = map.get(numbers[i]); map.put(numbers[i], cnt + 1); } } int max = Collections.max(map.values()); TreeSet<Integer> set = new TreeSet<>(); for(int key : map.keySet()) { if(map.get(key) == max) { set.add(key); } } if(set.size() == 1) { System.out.println(set.pollFirst()); } else { set.pollFirst(); System.out.println(set.pollFirst()); } // 범위 System.out.println(numbers[N-1] - numbers[0]); br.close(); } }
보기보다 어려운 문제로 세번 째의 최빈값을 구하는 문제로만 봐도 무방합니다.
이 풀이는 760ms이 걸린 풀이로 최적 풀이와 시간 차이가 커 그다지 참고할 가치가 없는 것으로 봐도 좋겠습니다.
빠른 문제 해결을 위해 HashMap, TreeMap 등 자바 Collection Framework들을 적극 활용했습니다.
풀이
-----
1. 산술 평균의 경우 형변환을 제대로 해주지 않으면 중간에 오답이 발생합니다.(유독 이 문제에 질문글이 많은 이유로 보입니다.)
2. N이 홀수로 고정되어 있기 때문에 중앙값은 항상 정렬된 배열의 N/2 인덱스에 해당합니다.
3. 빈도를 세기 위해 HashMap을 활용했습니다. 각각의 수가 key가 되고 처음에는 1로 시작해서 중복해서 들어올 때마다 값이 1씩 증가합니다. 이 때 최대 중복 횟수를 업데이트해서 max에 저장하고 map이 완성되면 Treeset을 이용해 최댓값에 해당하는 key를 크기 순으로 정렬합니다. 그리고 최댓값에 해당하는 수가 하나인 경우 그대로 출력하고 둘 이상인 경우 두번째 원소를 출력하면 끝입니다.
4. 범위는 마지막 값에서 처음 값을 빼면 구해집니다.
'알고리즘 > 백준' 카테고리의 다른 글
2609번 - 최대공약수와 최소공배수 (0) 2023.03.01 1459번 - 걷기 (0) 2023.02.28 2292번 - 벌집 (0) 2023.02.27 2231번 - 분해합 (0) 2023.02.26 1978번 - 소수 찾기 (0) 2023.02.26