https://www.acmicpc.net/problem/2108
코드설명
구현(Implementation) + 정렬(Sorting)을 활용합니다.
문제에서 유의해야하는 점입니다.
1. 빈도값이 먼저 정렬의 기준이므로, 먼저 빈도값을 오름차순 정렬합니다.
만약, 빈도값이 다르다면 빈도값을 기준으로 오름차순 정렬합니다.
만약, 빈도값이 같다면, VALUE값의 크기를 기준으로 오름차순 정렬합니다.
@Override public int compareTo(Node other) { if(this.cnt != other.cnt) { return Integer.compare(this.cnt, other.cnt); } return Integer.compare(this.value, other.value); }
코드
package Main; import java.io.BufferedReader; import java.io.IOException; import java.io.InputStreamReader; import java.util.ArrayList; import java.util.Arrays; import java.util.Collections; import java.util.HashMap; import java.util.Map; import java.util.StringTokenizer; public class Main { private static int N, T, M; private static int[] arr; private static int answer = 0; private static HashMap<Integer, Integer> hashmap = new HashMap<Integer, Integer>(); public static void main(String[] args) throws IOException{ BufferedReader br = new BufferedReader(new InputStreamReader(System.in)); StringTokenizer st = new StringTokenizer(br.readLine()); N = Integer.parseInt(st.nextToken()); arr = new int[N]; ArrayList<Node> arrList = new ArrayList<Node>(); for(int i=0;i<N;i++) { st = new StringTokenizer(br.readLine()); arr[i] = Integer.parseInt(st.nextToken()); hashmap.put(arr[i], hashmap.getOrDefault(arr[i], 0) + 1); } Arrays.sort(arr); //1. 산술평균. double sum = 0; for(int i=0;i<N;i++) { sum += arr[i]; } System.out.println( Math.round(sum / N) ); //2. 중앙값 int mid = N / 2; System.out.println( arr[mid] ); for(Map.Entry<Integer, Integer> entrySet : hashmap.entrySet()) { arrList.add(new Node(entrySet.getKey(), entrySet.getValue())); } //3. 최빈값 Collections.sort(arrList); for(Node v : arrList) { System.out.println(v.value+" "+v.cnt); } //가장 많이 나온 숫자입니다. int topCnt = arrList.get(arrList.size() - 1).cnt; answer = arrList.size() - 1; if(arrList.size() >= 2) { int answerIdx = 0; for(int i=0;i<arrList.size(); i++) { if(topCnt == arrList.get(i).cnt) { answerIdx++; } if(answerIdx == 2) { answer = i; break; } } System.out.println( arrList.get(answer).value ); } else { System.out.println( arrList.get(0).value ); } //4. 범위 : N개의 수들 중 최댓값과 최솟값의 차이 int diff = arr[N-1] - arr[0]; System.out.println(diff); } private static class Node implements Comparable<Node>{ int value; int cnt; public Node(int value, int cnt) { this.value = value; this.cnt = cnt; } @Override public int compareTo(Node other) { //실수했었던 부분입니다. //빈도값이 먼저 정렬의 기준이므로, 먼저 빈도값을 오름차순 정렬합니다. if(this.cnt != other.cnt) { return Integer.compare(this.cnt, other.cnt); } //만약 빈도값이 같아서 여기까지 왔다면, value값 기준으로 오름차순 정렬합니다. //만약 내림차순 정렬하고 싶다면, 매개변수의 위치를 바꿔주면됩니다. return Integer.compare(this.value, other.value); } } }
'알고리즘 > 백준' 카테고리의 다른 글
[백준] 2659 십자카드 문제 - 브루트포스(BruteForce, 완전탐색) JAVA (0) | 2024.07.28 |
---|---|
[백준] 2548 대표 자연수 - 정렬(Sorting) + 수학(Math) JAVA (0) | 2024.07.28 |
[백준] 1485 정사각형 - 기하학(Geometry) + 정렬(Sorting) JAVA (0) | 2024.07.27 |
[백준] 1431 시리얼 번호 - 정렬(Sorting) JAVA (0) | 2024.07.27 |
[백준] 9657 돌 게임 3 - 동적계획법(Dynamic Programming, DP) + 게임이론(Game Theory) JAVA (0) | 2024.07.26 |