백준 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으로 초기화를 안해줘서 쓰레기값이 같이 더해져서 평균부분이 오류가 나서 그런거였다...
Author And Source
이 문제에 관하여(백준 2108 통계학), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다 https://velog.io/@blacklandbird/백준-2108-통계학저자 귀속: 원작자 정보가 원작자 URL에 포함되어 있으며 저작권은 원작자 소유입니다.
우수한 개발자 콘텐츠 발견에 전념 (Collection and Share based on the CC Protocol.)