문제
2108번: 통계학
첫째 줄에 수의 개수 N(1 ≤ N ≤ 500,000)이 주어진다. 단, N은 홀수이다. 그 다음 N개의 줄에는 정수들이 주어진다. 입력되는 정수의 절댓값은 4,000을 넘지 않는다.
www.acmicpc.net
풀이
예전에 재채점으로 틀렸었는데 여유될 때 다시 풀어보았다.
먼저 수를 입력받은 뒤 오름차순 정렬한다.
1. 산술평균 : 루프를 돌면서 계산하면 된다. 반올림 주의
2. 중앙값 : 원소 개수가 홀수일 때와 짝수일 때를 나눠서 계산한다.
3. 최빈값 : 이게 제일 귀찮았는데, 다음과 같은 과정을 거친다.
3-1. 먼저 가장 자주 등장한 횟수를 0으로 초기화해 준다.
3-2. 루프를 돌면서 현재값의 등장 횟수를 1 증가시킨다.
3-3-1. 현재값이 제일 많다면, 최빈값 vector를 Clear()해준다. 그리고 vector에 현재값을 push
3-3.2. 현재값이 그전까지 가장 자주 등장한 횟수와 같다면, 그대로 vector에 현재값을 push 해준다.
3-4. 루프가 끝난 뒤 vector의 원소가 1개라면, 그 값을 그대로 출력하고 2개 이상이라면 1번째 원소를 출력한다. 이미 오름차순으로 정렬되어 있는 루프를 순회했으므로 vector를 다시 정렬해 줄 필요는 없다.
4. 범위 : 정렬되어 있으므로 back()에서 front()를 빼면 된다.
후기
최빈값은 map <int(num), int(frequency)을 활용했으면 더 깔끔했을 듯.
범위가 작아서 망정이지 0 ~ 10억과 같이 범위가 컸으면 배열로는 counting이 불가능했을 것이다.
소스 코드
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
70
71
72
73
74
75
76
77
78
79
|
#include <iostream>
#include <algorithm>
#include <vector>
#include <cmath>
using namespace std;
int modeCounter[8001] = {};
int main()
{
ios_base::sync_with_stdio(false);
cin.tie(0);
int cnt = 0;
vector<int> v;
cin >> cnt;
v.reserve(cnt);
for (int i = 0; i < cnt; i++)
{
int n;
cin >> n;
v.push_back(n);
}
sort(v.begin(), v.end());
int sum = 0;
int modeIdx = 0;
int modeValue = 0;
vector<int> modeVec;
for (int num : v)
{
sum += num;
int curModeIdx = num + 4000;
modeCounter[curModeIdx]++;
if (modeCounter[curModeIdx] >= modeValue)
{
if (modeCounter[curModeIdx] > modeValue)
{
modeVec.clear();
modeValue = modeCounter[curModeIdx];
}
modeVec.push_back(num);
}
}
int average = round((float)sum / v.size());
int mid = 0;
int midIdx = v.size() / 2;
if (v.size() % 2 == 0)
{
mid = round((v[midIdx] + v[midIdx - 1]) / 2.0f);
}
else
{
mid = v[midIdx];
}
int mode = 0;
if (modeVec.size() > 1)
{
mode = modeVec[1];
}
else
{
mode = modeVec.front();
}
int range = v.back() - v.front();
cout << average << '\n' << mid << '\n' << mode << '\n' << range;
return 0;
}
|
cs |
'알고리즘 > 백준' 카테고리의 다른 글
[백준 1725] 히스토그램 C++ (0) | 2023.12.04 |
---|---|
[백준 3015] 오아시스 재결합 C++ (2) | 2023.12.02 |
[백준 2564] 경비원 C++ (3) | 2023.05.30 |
[백준 4811] 알약 C++ (0) | 2023.05.15 |
[백준 2302] 극장 좌석 C++ (0) | 2023.05.11 |