알고리즘/백준

[백준 2108] 통계학 C++

겜도리도리 2023. 12. 23. 23:41
반응형

문제

백준 2108 통계학 C++

 

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