작성일 :

문제 링크

2108번 - 통계학

설명

정수들이 주어지는 상황에서, 홀수 개의 정수 N (1 ≤ N ≤ 500,000, 홀수)개와 각 정수(-4,000 이상 4,000 이하)가 주어질 때, 네 가지 통계값을 구하는 문제입니다.

구해야 하는 통계값은 다음과 같습니다:

  • 산술평균: 모든 수의 평균을 소수점 첫째 자리에서 반올림한 값
  • 중앙값: 정렬했을 때 가운데 위치한 값
  • 최빈값: 가장 많이 나타나는 값. 여러 개 있을 경우 두 번째로 작은 값
  • 범위: 최댓값과 최솟값의 차이


접근법

입력을 받으면서 합계, 최솟값, 최댓값을 계산하고, 빈도 배열에 각 수의 등장 횟수를 기록합니다.


산술평균은 합계를 개수로 나눈 후 반올림합니다. 중앙값은 배열을 정렬한 후 가운데 위치(N/2)의 값을 선택합니다.

최빈값은 빈도 배열을 순회하며 찾습니다. 최대 빈도를 갱신할 때마다 해당 값을 저장하고, 같은 최대 빈도가 다시 나타나면 그 값을 최빈값으로 선택합니다. 이렇게 하면 여러 개의 최빈값 중 두 번째로 작은 값을 얻을 수 있습니다.

범위는 최댓값에서 최솟값을 뺀 값입니다.


빈도 배열은 -4,000부터 4,000까지를 표현하기 위해 크기 8,001의 배열을 사용하고, 인덱스는 값에 4,000을 더해 접근합니다.



Code

C#

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
using System;

namespace Solution {
  class Program {
    static void Main(string[] args) {
      var n = int.Parse(Console.ReadLine()!);
      var numbers = new int[n];
      var frequency = new int[8001];

      var sum = 0L;
      var minValue = 4000;
      var maxValue = -4000;
      
      for (var i = 0; i < n; i++) {
        var num = int.Parse(Console.ReadLine()!);
        numbers[i] = num;
        sum += num;
        frequency[num + 4000]++;
        if (num < minValue) minValue = num;
        if (num > maxValue) maxValue = num;
      }

      Array.Sort(numbers);
      var median = numbers[n / 2];

      var mode = 0;
      var maxFrequency = 0;
      var isFirst = false;
      
      for (var i = 0; i <= 8000; i++) {
        if (frequency[i] > maxFrequency) {
          maxFrequency = frequency[i];
          mode = i - 4000;
          isFirst = true;
        } else if (frequency[i] == maxFrequency && isFirst) {
          mode = i - 4000;
          isFirst = false;
        }
      }

      var mean = (int)Math.Round((double)sum / n, MidpointRounding.AwayFromZero);
      if (mean == -0) mean = 0;

      Console.WriteLine(mean);
      Console.WriteLine(median);
      Console.WriteLine(mode);
      Console.WriteLine(maxValue - minValue);
    }
  }
}

C++

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
#include <bits/stdc++.h>
using namespace std;

typedef long long ll;
typedef vector<int> vi;

int main() {
  ios::sync_with_stdio(false);
  cin.tie(nullptr);

  int n; cin >> n;
  vi numbers(n);
  int frequency[8001] = {0};
  
  ll sum = 0;
  int minValue = 4000;
  int maxValue = -4000;

  for (int i = 0; i < n; i++) {
    int num; cin >> num;
    numbers[i] = num;
    sum += num;
    frequency[num + 4000]++;
    minValue = min(minValue, num);
    maxValue = max(maxValue, num);
  }

  sort(numbers.begin(), numbers.end());
  int median = numbers[n / 2];

  int mode = 0;
  int maxFrequency = 0;
  bool isFirst = false;
  
  for (int i = 0; i <= 8000; i++) {
    if (frequency[i] > maxFrequency) {
      maxFrequency = frequency[i];
      mode = i - 4000;
      isFirst = true;
    } else if (frequency[i] == maxFrequency && isFirst) {
      mode = i - 4000;
      isFirst = false;
    }
  }

  ll mean = llround((long double)sum / n);
  if (mean == 0) mean = 0;

  cout << mean << "\n";
  cout << median << "\n";
  cout << mode << "\n";
  cout << maxValue - minValue << "\n";
  
  return 0;
}