백준 2108 통계학

최초의 풀이

#include <iostream>
#include <stdlib.h>
#include <vector>
#include <algorithm>
#include <numeric>

using namespace std;
#define MAX_NUM 8000

int most_val(vector<int> vec, int n);

int main() {
    ios_base::sync_with_stdio(false); cin.tie(NULL);
    int n;
    int avg, mid, most, range;
    cin >> n;

    vector<int> vec;

    for (int i = 0; i < n; i++) {
        int val;
        cin >> val;
        vec.push_back(val);
    }

    int arr[n], ans_arr[n];
    int counter = 0;
    int count[MAX_NUM] = {0};

    sort(vec.begin(), vec.end());

    avg = static_cast<int>(accumulate(vec.begin(), vec.end(), 0) / n);
    mid = vec[static_cast<int> (n/2)];
    most = most_val(vec, n);
    range = vec.back() - vec.front();
    
    cout << avg <<"\n";
    cout << mid <<"\n";
    cout << most <<"\n";
    cout << range <<"\n";
}

int most_val(vector<int> vec, int n) {
    int arr[n], ans_arr[n];
    int max = -1;
    int counter = 0;
    int ans = 0;
    int count[MAX_NUM] = {0};
    
    for (int i =0; i < n; i++) {
        if ((vec[i] <= 4000) || (vec[i] >= -4000)) 
        arr[i] = vec[i];
    }
    for (int i = 0; i < n; i++) {
        count[4000 + (arr[i])]++;
    }
    cout << count[8000] << "\n";
    for (int i = 0; i <= 8000; i++) {
        if ((count[i] == max) && (counter < 2)) {
            counter += 1;
            ans = i;
            cout << "ans : " <<  ans << "\n";
        } else if (count[i] > max) {
            counter = 1;
            max = count[i];
            ans = i;
            cout << count[i] << " \n";
            cout << "ans2 : " <<  ans << "\n";   
        }
    }
    return (ans - 4000);
}

편하게 받으려고 vector로 값들을 받았는데 이게 실수였다.
vector로는 counting 정렬을 정확하게 구현할 수가 없다.

정확한 풀이

#include <iostream>
#include <algorithm>
#include <cmath>

using namespace std;

int main() {
    ios_base::sync_with_stdio(false); cin.tie(NULL);
    int n;
    int sum = 0;
    int avg, mid, most, range;
    cin >> n;

    int arr[n];
    int count[8001] = {0};

    for (int i = 0; i < n; i++) {
        cin >> arr[i];
        sum += arr[i]; // sum for avg
        count[arr[i] + 4000]++;
    }

    sort(arr, arr + n);

    int ans;
    int max = 0;

    for (int i = 0; i < 8001; i++) {
        if (count[i] > max) {
            max = count[i];
            ans = i;
        } 
    }
    for (int i = ans + 1; i < 8001; i++) {
        if (count[i] == max) {
            ans = i;
            break;
        } 
    }

    avg = round(double(sum) / n);
    mid = arr[(n-1) / 2];
    most = ans - 4000;
    range = arr[n-1] - arr[0];
    
    cout << avg <<"\n";
    cout << mid <<"\n";
    cout << most <<"\n";
    cout << range <<"\n";
}

일단 값들을 arr로 받아야 counting 처리하기가 편하고

counting으로 최빈값을 받을 때, 한번의 for문으로 처리하기보다는, 최빈값을 찾고, 혹시나 같은 최빈값이 있는지 for문을 두번돌리는게 더 나은방법이였다.

그리고 3번이나 틀려서 뭐지 했는데 sum을 0으로 초기화를 안해줘서 쓰레기값이 같이 더해져서 평균부분이 오류가 나서 그런거였다...

좋은 웹페이지 즐겨찾기