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);
    	}
    }
    
}

+ Recent posts