ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • 2108번 - 통계학
    알고리즘/백준 2023. 2. 26. 20:13
    import java.io.BufferedReader;
    import java.io.IOException;
    import java.io.InputStreamReader;
    import java.util.Arrays;
    import java.util.Collections;
    import java.util.HashMap;
    import java.util.TreeSet;
    
    public class Main {
        public static void main(String[] args) throws IOException {
            BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
            int N = Integer.parseInt(br.readLine());
            int[] numbers = new int[N];
            int sum = 0;
            for(int i=0;i<N;i++) {
                numbers[i] = Integer.parseInt(br.readLine());
                sum += numbers[i];
            }
            // 산술 평균
            System.out.println((int)Math.round(sum / (double)N));
            // 중앙값
            Arrays.sort(numbers);
            System.out.println(numbers[N / 2]);
            // 최빈값
            HashMap<Integer, Integer> map = new HashMap<>();
            int cnt;
            for(int i=0;i<N;i++) {
                if(map.get(numbers[i]) == null) {
                    map.put(numbers[i], 1);
                }
                else {
                    cnt = map.get(numbers[i]);
                    map.put(numbers[i], cnt + 1);
                }
            }
            int max = Collections.max(map.values());
            TreeSet<Integer> set = new TreeSet<>();
            for(int key : map.keySet()) {
                if(map.get(key) == max) {
                    set.add(key);
                }
            }
            if(set.size() == 1) {
                System.out.println(set.pollFirst());
            }
            else {
                set.pollFirst();
                System.out.println(set.pollFirst());
            }
            // 범위
            System.out.println(numbers[N-1] - numbers[0]);
            br.close();
        }
    }

     

    보기보다 어려운 문제로 세번 째의 최빈값을 구하는 문제로만 봐도 무방합니다.

    이 풀이는 760ms이 걸린 풀이로 최적 풀이와 시간 차이가 커 그다지 참고할 가치가 없는 것으로 봐도 좋겠습니다.

    빠른 문제 해결을 위해 HashMap, TreeMap 등 자바 Collection Framework들을 적극 활용했습니다.

     

    풀이

    -----

     

    1. 산술 평균의 경우 형변환을 제대로 해주지 않으면 중간에 오답이 발생합니다.(유독 이 문제에 질문글이 많은 이유로 보입니다.)

     

    2. N이 홀수로 고정되어 있기 때문에 중앙값은 항상 정렬된 배열의 N/2 인덱스에 해당합니다.

     

    3. 빈도를 세기 위해 HashMap을 활용했습니다. 각각의 수가 key가 되고 처음에는 1로 시작해서 중복해서 들어올 때마다 값이 1씩 증가합니다. 이 때 최대 중복 횟수를 업데이트해서 max에 저장하고 map이 완성되면 Treeset을 이용해 최댓값에 해당하는 key를 크기 순으로 정렬합니다. 그리고 최댓값에 해당하는 수가 하나인 경우 그대로 출력하고 둘 이상인 경우 두번째 원소를 출력하면 끝입니다.

     

    4. 범위는 마지막 값에서 처음 값을 빼면 구해집니다.

     

     

    '알고리즘 > 백준' 카테고리의 다른 글

    2609번 - 최대공약수와 최소공배수  (0) 2023.03.01
    1459번 - 걷기  (0) 2023.02.28
    2292번 - 벌집  (0) 2023.02.27
    2231번 - 분해합  (0) 2023.02.26
    1978번 - 소수 찾기  (0) 2023.02.26
Designed by Tistory.