[백준 2108] 통계학 (C#, C++) - soo:bak
작성일 :
문제 링크
설명
정수들이 주어지는 상황에서, 홀수 개의 정수 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;
}