알고리즘/BOJ

[BOJ] 2108. 통계학

재담 2022. 2. 20. 01:37

문제 원본 : https://www.acmicpc.net/problem/2108

 

2108번: 통계학

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

www.acmicpc.net

import java.util.ArrayList;
import java.util.Collections;
import java.util.Scanner;

public class Main {
    public static void main(String[] args) {
        Scanner scanner = new Scanner(System.in);
        int n = scanner.nextInt();

        ArrayList<Integer> list = new ArrayList<>();
        for (int i = 0; i < n; ++i) {
            int num = scanner.nextInt();
            list.add(num);
        }
        list.add(99999);

        Collections.sort(list);

        int sum = list.get(0);
        int bin = list.get(0);
        int max = 0, cnt = 1;
        boolean flag = false;
        for (int i = 1; i < n + 1; ++i) {
            sum += list.get(i);

            if (list.get(i).equals(list.get(i - 1))) {
                ++cnt;
            } else {
                if (cnt > max) {
                    max = cnt;
                    flag = false;
                    bin = list.get(i - 1);
                } else if (cnt == max && !flag) {
                    flag = true;
                    bin = list.get(i - 1);
                }
                cnt = 1;
            }
        }
        sum -= 99999;

        System.out.println(Math.round( sum / (double) n));
        System.out.println(list.get(n / 2));
        System.out.println(bin);
        System.out.println(list.get(n - 1) - list.get(0));
    }
}
  • 실버 4라고 만만하게 봤다가 큰코다쳤다...
  • 99999를 넣은 것은 최빈값을 구할 때 for 문 끝나고 한 번 더 체크하지 않기 위해서 일부러 넣었다.
  • cnt를 초기화하는 부분은 else 문에서 무조건 해줘야 하는데,
  • else 문 안에서 if 문과 else if 문에서만 해줘서 모든 경우를 커버하지 못했다.
  • 반례 찾는데 1시간 넘게 걸린 것 같다.
  • 질문하기 게시판에서 1페이지부터 모든 게시물에 있는 반례를 시도하다가 거의 10페이지쯤 가서 찾았다.
  • 반례 찾아준 분한테 너무 고맙다.
  • 8001칸의 배열을 만들어서 하는 방식에 비해 효율은 그다지 안 좋은 것 같다...