algorithm

백준 2108(JAVA)

yjs3819 2022. 6. 15. 23:26
728x90

문제

https://www.acmicpc.net/problem/2108

 

2108번: 통계학

첫째 줄에 수의 개수 N(1 ≤ N ≤ 500,000)이 주어진다. 단, N은 홀수이다. 그 다음 N개의 줄에는 정수들이 주어진다. 입력되는 정수의 절댓값은 4,000을 넘지 않는다.

www.acmicpc.net

풀이

  • 산술평균
  1. 더해서 나누면 되는데, -1.8인 경우 반올림하면 -1이아닌 -2가 되어야함. 이 부분을 처리하기 위해 나는 나눈 값 절대값으로 바꾼 뒤, Math.round를 이용
  2. 오랜만에 자바를 해서 그런지 나눌때 auto casting되는걸 까먹었당. int / int => int가 된다. 그래서 피연산자 둘중 하나를 명시적으로 double로 casting 후 나눠야한다.
  • 중앙값
  1. ArrayList를 이용해 Collections sort 로 정렬후 중앙값 추출(N: 무조건 홀수)
  • 최빈값
  1. Map을 이용해서 풀었다. Map의 key는 입력받은 수이고, value는 해당 key의 빈도 수를 저장함.
  2. 문제를 꼼꼼히 읽지않아, 최빈값이 여러개 일 때, 두번째로 큰 값을 출력하는걸 몰랐다.
  • 범위
  1. 위의 정렬된 ArrayList를 재사용함

코드

package baekjoon.구현;

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.*;

public class Main2108 {
    static int N;
    static List<Integer> list = new ArrayList<>();
    static Map<Integer, Integer> map = new HashMap<>();

    static int maxCount = 0;
    static int maxKey = -10000;

    public static void main(String[] args) throws IOException {
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        N = Integer.parseInt(br.readLine());

        for(int i = 0; i < N; i++){
            int value = Integer.parseInt(br.readLine());
            list.add(value);
            if(map.containsKey(value)){
                map.put(value, map.get(value) + 1);
            }else{
                map.put(value, 1);
            }
        }

        Collections.sort(list);

        findMaxCountAndMaxKey();
        List<Integer> maxLists = getMaxCount();

        int sum = list.stream().mapToInt(Integer::intValue).sum();

        if(sum < 0){
            double result = (double)sum / N;
            double value = Math.abs(result);
            System.out.println(Math.round(value) * -1);
        }else{
            System.out.println(Math.round((double)sum / N));
        }
        System.out.println(list.get(N / 2));
        if(maxLists.size() == 1){
            System.out.println(maxLists.get(0));
        }else{
            System.out.println(maxLists.get(1));
        }
        System.out.println(list.get(N - 1) - list.get(0));
    }
    static void findMaxCountAndMaxKey(){
        for(Map.Entry<Integer, Integer> entry: map.entrySet()){
            int value = entry.getValue();
            int key = entry.getKey();
            if(maxCount < value){
                maxCount = value;
                maxKey = key;
            }
        }
    }

    static List<Integer> getMaxCount(){
        List<Integer> maxLists = new ArrayList<>();

        for(Map.Entry<Integer, Integer> entry: map.entrySet()){
            Integer value = entry.getValue();
            if(value == maxCount){
                maxLists.add(entry.getKey());
            }
        }

        Collections.sort(maxLists);

        return maxLists;
    }
}
728x90

'algorithm' 카테고리의 다른 글

백준 11723(JAVA)  (0) 2022.06.13
백준 3980(JAVA)  (0) 2021.11.01
백준 2661(JAVA)  (0) 2021.10.31
백준 1174(JAVA)  (0) 2021.10.17
백준 16987(JAVA)  (0) 2021.10.12