포스트

통계학(2108)

통계학(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
import java.io.*;
import java.util.*;

public class Main{
  public static void main(String[] args) throws IOException {
    BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
    BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(System.out));
    StringBuilder sb = new StringBuilder();
    
    int n = Integer.parseInt(br.readLine());
    
    int[] arr = new int[n];
    int sum = 0;
    Map<Integer, Integer> map = new TreeMap<>();
    
    for(int i = 0; i < n; i++){
      arr[i] = Integer.parseInt(br.readLine());
      sum += arr[i];
      
      if(map.containsKey(arr[i])) map.put(arr[i], map.get(arr[i]) + 1);
      else map.put(arr[i], 1);
    }
    
    // 산술평균 : n개의 수의 합 / n, 소수 첫째자리에서 반올림
    int avg = (int)Math.round((double)sum / (double)n);
    sb.append(avg + "\n");
    
    // 중앙값 : n을 오름차순 정렬시 가운데 값
    Arrays.sort(arr);
    sb.append(arr[n/2] + "\n");
    
    // 최빈값 : n개의 수 중 가장 많이 나타내는 값, 경우가 많으면 두번째 값
    int cnt = 0;
    int num = 0;
    int order = 0;
    
    for(int key : map.keySet()){
      if(cnt <= map.get(key)){
        order = (cnt < map.get(key))? 1 : order+1;
        cnt = map.get(key);
        if(order <= 2) num = key;
      }
    }
    sb.append(num + "\n");
    
    // 범위 : 최대 - 최소
    int length = arr[n-1] - arr[0];
    sb.append(length);
    
    bw.write(sb.toString());
    bw.flush();
    bw.close();
    br.close();
  }
}

풀이과정

1) 산술평균, 중앙값, 볌위를 구하는 것은 어렵지 않았다.
2) 최빈값을 어떻게 구할까 고민을 하였고, 입력값과 그 갯수를 매핑 시켜야 한다는 생각을 하게 되었다.
3) 이차배열을 쓸 것인가를 고민하다가, 간편하게 map의 특성을 이용하여 같은 key면 value가 증가하도록 하였다.
4) 또한 같은 value 즉 최빈값이 동일한 값들이 있을 때, 두번째 값을 나타내야 함으로 TreeMap을 사용하여 오름차순 정렬이 되도록 하였다.
5) 입력값에 따른 갯수가 map에 세팅 되었다. 그렇다면 map의 value가 가장 큰(최빈값이 큰)애를 구분하고, value가 중복(최대 최빈값이 동일한 key가 2개 이상)인 경우를 조건으로 걸어야 했다.
6) cnt를 통해 map의 value를 구분하여 가장 많이 나온 key를 알아내려고 하였다
7) num은 가장 많이 나온 key를 넣어 문제에서 요구하는 값을 알아내기 위한 변수이다
8) order는 cnt가 동일할 때, 두번째를 check하기 위한 변수이다.

  • 성공
  • 메모리 : 70476 KB
  • 시간 : 904 ms

보안점

  • 다른 사람들의 결과를 보니까, 메모리가 40000대, 응답시간이 300대인 경우가 보였다.
  • 코드를 분석하고 내 코드를 비교해 보며 내 메모리와 응답시간에 대한 차이를 분석하고자 하였다.
  • 내가 생각한 차이점은 최빈값을 알아내기 위해 TreeMap을 사용하였는데, TreeMap은 입력 후에 특정 검색을 위해서는 좋지만 입력을 하며 오름차순으로 정렬을 하여야 하기에 시간이 지연된다는 단점을 상기해내었다.
  • 그리고 중앙값을 알아내기 위해 Arrays.sort를 사용한 부분도 메모리와 응답시간을 증가한 부분이라고 생각되었다.