문제
https://www.acmicpc.net/problem/2108
풀이
한창 PS를 시작할때 쉬워보여 도전했다가 한 부분에서 두드려맞고 포기했던 문제인데, 프린터 큐 문제와 함께 클래스 2에 남아있길래 한번 도전해보았다. 문제는 입력받는 값들에 대해 산술평균, 중앙값, 최빈값, 범위를 출력하는 것으로, 최빈값이 여러개 있다면 두 번째로 작은 최빈값을 출력해야 하는 조건이 있다.
산술평균은 반올림한 값을 출력해야 하므로 Math 라이브러리의 round를 이용하여 해결하였고, 중앙값과 범위는 사실 어려운 부분이 하나도 없다. 제일 까다로운 부분은 최빈값을 구하는 부분인데, 최빈값이 하나라면 그 값만 출력하면 되지만 최빈값이 여러개라면 두 번째로 작은 값을 출력해야 하는 것이 조금 까다롭게 다가왔다. 우선, 해시 맵에다가 입력받은 값을 key, 등장 횟수를 value로 저장해 주었다. 모든 입력이 끝나면 이 해시 맵을 List로 변환하였고, 이 List를 등장 횟수에 대응하는 해시 맵의 value를 기준으로 내림차순 정렬하였다. 그렇다면 이 List에 저장된 첫 번째 항목의 value 값이 최빈값의 등장 횟수가 된다. 이제 해시 맵에서 value 값이 최빈값의 등장 횟수가 같은 key 값을 mode_list에 저장해 주면 mode_list에는 최빈값이 될 수 있는 값들이 모두 들어가게 된다. 이제 mode_list의 크기가 1이라면 최빈값이 하나, 반대라면 최빈값이 여러개인 것이다. 최빈값이 여러개인 경우에는 mode_list를 오름차순 정렬하여 mode_list의 두 번째 원소의 값을 출력하도록 하면 문제에서 요구하는 최빈값을 구할 수 있다.
코드
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 | import java.io.BufferedReader; import java.io.IOException; import java.io.InputStreamReader; import java.util.*; public class Main { public static void main(String[] args) throws IOException { BufferedReader bf = new BufferedReader(new InputStreamReader(System.in)); int n = Integer.parseInt(bf.readLine()); int[] arr = new int [n]; HashMap<Integer, Integer> map = new HashMap<>(); for (int i=0; i<n; i++) { arr[i] = Integer.parseInt(bf.readLine()); if (! map.containsKey(arr[i])) { map.put(arr[i], 1); } else { map.put(arr[i], map.get(arr[i]) + 1); } } Arrays.sort(arr); int avg = 0; int mid = 0; int mode = 0; int range = 0; for (int i=0; i<n; i++) { avg += arr[i]; } avg = Math.round((float) avg / n); mid = arr[n/2]; List<Map.Entry<Integer, Integer>> list = new ArrayList<>(map.entrySet()); Collections.sort(list, new Comparator<Map.Entry<Integer, Integer>>() { @Override public int compare(Map.Entry<Integer, Integer> o1, Map.Entry<Integer, Integer> o2) { return o2.getValue().compareTo(o1.getValue()); } }); int freq = list.get(0).getValue(); List<Integer> mode_list = new ArrayList<>(); for (int i = 0; i < list.size(); i++) { if (list.get(i).getValue() == freq) { mode_list.add(list.get(i).getKey()); } } Collections.sort(mode_list); if (mode_list.size() == 1) { mode = mode_list.get(0); } else { mode = mode_list.get(1); } range = arr[n-1] - arr[0]; System.out.println(avg); System.out.println(mid); System.out.println(mode); System.out.println(range); } } | cs |
'PS > Solve' 카테고리의 다른 글
[Java] Boj 1541: 잃어버린 괄호 (1) | 2025.07.31 |
---|---|
[Java] Boj 9375: 패션왕 신해빈 (1) | 2025.07.28 |
[Java] Boj 1966: 프린터 큐 (2) | 2025.07.25 |
[Java] Boj 1049: 기타줄 (0) | 2025.07.14 |
[Java] Boj 1343: 폴리오미노 (0) | 2025.07.14 |