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 |