백준 2108

찬들이·2022년 7월 30일
0

알고리즘

목록 보기
19/42

문제 2108번

소스코드

import java.io.*;
import java.util.*;
public class boj2108 {
    public static void main(String[] args) throws IOException{
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        int N = Integer.parseInt(br.readLine());
        List<Integer> list = new ArrayList<>();
        int max = Integer.MIN_VALUE;
        int min = Integer.MAX_VALUE;
        int sum = 0;
        Map<Integer,Integer> mp = new HashMap<>();
        for (int i = 0; i < N; i++) {
            int input = Integer.parseInt(br.readLine());
            list.add(input);
            max = Math.max(max, input);
            min = Math.min(min, input);
            sum += input;
            //해쉬맵에 input을 key로, 빈도 수를 value로 저장
            if(mp.containsKey(input)){
                mp.put(input, mp.get(input) + 1);
            }else mp.put(input,1);
        }
       //해쉬맵의 최대값을 변수로 저장하고, list를 만들어서 최대값의 인덱스만 저장                                       
        int maxValue = Collections.max(mp.values());
        List<Integer> list2  = new ArrayList<>();
        for (Map.Entry<Integer,Integer> i : mp.entrySet()){
            if(i.getValue() == maxValue){
                list2.add(i.getKey());
            }
        }
  		//list를 정렬해서 가장 낮은 값에서 2번째를 저장
        Collections.sort(list2);
        if(list2.size()>1){
            maxValue = list2.get(1);
        }else  maxValue = list2.get(0);
        //산술평균 + 반올림
        if(sum <0){
            sum = 0-sum;
            System.out.println(0-(int)Math.round((double)sum/N));
        }else{
            System.out.println((int)Math.round((double)sum/N));
        }
        // 중앙값
        Collections.sort(list);
        System.out.println(list.get(N/2));
        //최빈값
        System.out.println(maxValue);
        //범위  최댓값 - 최소값
        System.out.println(max - min);
    }
}

풀이 접근

  1. 문제에서 주어진 출력은 총 4가지로 이루어져 있다.
  2. 산술평균은 입력할 때마다 sum 변수로 값을 더해서 Math.round를 통해 N으로 나눠 반올림 값을 받는다.
  3. 중앙 값은 입력 값들을 list에 add하고 sort함수를 사용한 뒤, 중앙 인덱스의 값을 출력한다.
  4. 최빈값은 HashMap과 빈도수 배열로 받는 방법이 있는데 여기서는 HashMap으로 받는 방법을 택했다.
    key값은 입력값, value는 빈도수로 받고, Collections.max를 통해 최대 빈도수를 구하고, 해당 값을 가진 인덱스를 최신화한다. 이후 정렬을 통해 최대 빈도수를 가지는 값이 2개 이상이면 2번째로 낮은 값을 출력하고 아니면 최대 빈도수 값을 출력한다.
  5. 범위는 입력 받을 때 찾았던 max값과 min 값의 차를 출력한다.

문제 핵심

  • Math 라이브러리 활용 방법을 아는지
  • 최빈값을 구하는 로직을 구현할 수 있는지
profile
Junior-Backend-Developer

0개의 댓글