말하는 컴공감자의 텃밭

백준 2108번 통계학 <S3> - 수학 본문

알고리즘/Backjoon - Java

백준 2108번 통계학 <S3> - 수학

현콩 2023. 11. 3. 12:00
728x90

 

백준 2108번 통계학

 

설명도 필요없다 후딱 짜봅시다.

왜.. 이리 많이 틀렸었니..?

 

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
import java.util.*;
 
public class Main { // 2108 통계학 26%
    public static void main(String[] args) throws Exception {
 
        Scanner sc = new Scanner(System.in);
        int K = sc.nextInt();
        int[] numbers = new int[K];
        int sum = 0;
 
        // 빈도용
        Map<Integer, Integer> map = new HashMap<>();
 
        // input
        for (int i = 0; i < K; i++) {
            int a = sc.nextInt();
            numbers[i] = a;
            sum += a;
            if (map.containsKey(a)) {
                int v = map.get(a);
                v++;
                map.put(a, v);
            } else {
                map.put(a, 1);
            }
        }
        Arrays.sort(numbers);
 
        double d_mean = (double) sum / K;
        int mean = (int) Math.round(d_mean);
        int median = numbers[K / 2];
 
        List<Integer> keySet = new ArrayList<>(map.keySet());
        List<Integer> fre = new ArrayList<>();
        // 먼저 람다 사용해서 value 내림차순으로 정렬
        keySet.sort((o1, o2) -> map.get(o2).compareTo(map.get(o1)));
 
        int mode = 0;
 
        int MaxFrequency = map.get(keySet.get(0)); // 가장 높은 빈도수
 
        for (int key : keySet) {
            if (map.get(key) == MaxFrequency) {
                fre.add(key);
            }
        }
        Collections.sort(fre);
 
        if (fre.size() >= 2) {
            mode = fre.get(1);
        } else {
            mode = fre.get(0);
        }
 
        int range = numbers[numbers.length - 1- numbers[0];
        // output
        System.out.println(mean);
        System.out.println(median);
        System.out.println(mode);
        System.out.println(range);
    }
}
 
cs

 

빈도를 Map을 활용했는데 사용이 어색해서 많이 틀렸었군요.. 조건이 또 여러개라면 두번째로 작은 값 때문에 틀렸네

안써도 풀거같은데.. 그리고 테스트 좀 잘하고 올리지 졸렸나

 

지금 생각으로는

 

산술평균 : Sum / N

중앙값 : sorting 후 N/2 idx 값

최빈값 : sorting 후 연속적으로 가장 많이 나오는 값 저장, List에 넣은 후 size() >= 2일 경우 ->  정렬 후 get(1) 

범위 : sorting 후 최소값, 최대값 차

했을거 같네오

 

728x90
Comments