최대 1 분 소요

백준 2108번 통계학

틀렸는데 왜 올리냐,,? 변명을 하자면,,,,많은 구글링을 해본 결과 Arrays를 사용하는 것이 아닌 ArraysList 를 사용하는 것 같으며, 입력도 BufferedReader 객체를 활용한다. 정답률 44%인데 그 후에 시간 초과 라고 뜬다. 정확한 이유는 모르지만 스캐너보다는 버퍼리더가 좀더 짧은 시간이 걸린다고 어디서 본 것 같다. 하지만 퍼버리더 같은 경우는 문자열만 받기 때문에 입력받은 문자들을 모두 Integer.parseInt 를 사용해주어서 모두 바꾸어야 한다. 그래도 아까우니,,,,일단 올린다. 시간 진짜 많이 걸렸기 때문이다. ㅜㅜ

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
package _1월_4주차;
 
import java.util.Arrays;
import java.util.Scanner;
 
public class 백준_손수경_정답_2108 {
 
    public static void main(String[] args) {
        
        Scanner sc = new Scanner(System.in);
        int n = sc.nextInt();
        int[] nums = new int[n];
        int sum = 0
        int avg; //산술평균
        int middle; //중앙값
        int[] frequency = new int[n]; //빈도수
        int mostMax = 0//가장 큰 빈도수
        int[] mode = new int[n];
        int cnt = 0//두 번째로 작은 최빈값을 구하기 위함
        int range; //범위
 
        for (int i = 0; i < n; i++) {
            nums[i] = sc.nextInt();
            sum += nums[i];
        }
        
        //중앙값, 범위를 구하기 위해 필요
        Arrays.sort(nums);
        
        //최빈값을 구하기 위한 반복문
        for (int i = 0; i < n - 1; i++) {
            for (int j = i + 1; j < n; j++) {
                if (nums[i] != nums[j]) {
                    break;
                }
                frequency[i]++;
                
                if (mostMax < frequency[i]) {
                    mostMax = frequency[i];
                }
                
            }
        }
        
        int j = 0;
        for (int i = 0; i < n; i++) {
            if (mostMax == frequency[i]) {
                mode[j] = nums[i];
                j++;
            }
        }
        //Math.round, Math.floor -> double형으로 반환
        avg = (int)Math.round((double)sum / n); //반올림
        middle = nums[(int)Math.floor(n / 2)]; //버림
        range = nums[n - 1- nums[0];
        
        System.out.println(avg);
        System.out.println(middle);
        if (j >= 2) {
            System.out.println(mode[1]);
        }
        else {
            System.out.println(mode[0]);
        }
        System.out.println(range);
                
    }
}
 
cs

산술 평균, 중앙값, 범위는 구하기 쉽다. 그냥 오름차순으로 정리만 해준다면 간단한 문제이다. 하지만 최빈값 구하는 부분이 굉장히 어려웠다. (사실 아직도 정확한 정답은 모른다.) 하지만 계속 시간 초과의 문제로 Arrays 한계 내에서 최대한 줄일 수 있는 부분들을 줄여보았다. frequency 배열에서 빈도수를 구할 때, 오름차순으로 정렬된 것이므로 배열상에서 오른쪽에 있는 숫자와 다르다면 다른 숫자와도 같을 일이 없으므로 break문을 사용해주었고, 그게 아니라면 빈도수를 늘리는 방식을 사용하였다.

배우고 나서 수정해보자!

  1. BufferedReader 의 정확한 사용 방법
  2. ArraysList 는 무엇이고 어떻게 사용하는가,,,

댓글남기기