728x90
반응형
1. 문제
2. 풀이과정
N개의 수에 대해
-
산술평균 : N개의 수들의 합을 N으로 나눈 값
-
중앙값 : N개의 수들을 증가하는 순서로 나열했을 경우 그 중앙에 위치하는 값
-
최빈값 : N개의 수들 중 가장 많이 나타나는 값
-
범위 : N개의 수들 중 최댓값과 최솟값의 차이
를 구해주면 된다.
[코드설명]
먼저 중앙값, 범위 등을 쉽게 구하기 위해 n개의 수를 입력받은 후 sort로 오름차순 정렬해준다.
average함수는 산술평균을 반환해준다. n개의 수를 더해서 n으로 나눈 후
소수점 이하 첫째 자리에서 반올림한 값을 반환해준다.
median함수는 정렬된 수에서 n/2인덱스에 해당하는 값, 즉 중앙값을 반환해준다.
mode함수는 최빈값을 리턴해준다. 0~4000사이의 값은 positive배열에 카운팅하고,
-4000~-1의 값은 negative배열에 카운팅하여 가장 많이 카운팅된 수를 반환해준다.
최빈값이 여러 개 있을 때에는 최빈값 중 두 번째로 작은 값을 반환해야하는데,
빈도가 같은 값들을 모아서 오름차순 정렬한 후 2번째에 해당하는 값을 반환해줬다.
range함수는 범위를 반환해준다. 최댓값과 최솟값의 차이를 반환해준다.
3. 코드
#include <iostream>
#include <algorithm>
#include <cmath>
#include <vector>
using namespace std;
int n;
vector<int> arr;
int positive[4001], negative[4001];
double average() {
int sum = 0;
for(int i=0; i<n; i++) sum+=arr[i];
double d_sum = sum;
return round(d_sum/n);
}
int median() {
return arr[n/2];
}
int mode() {
int max_cnt = -1;
vector<int> modes;
for(int i=0; i<n; i++) {
if(arr[i] < 0) {
negative[abs(arr[i])]++;
}
else {
positive[arr[i]]++;
}
}
for(int i=0; i<=4000; i++) {
if(positive[i] > max_cnt) max_cnt = positive[i];
if(negative[i] > max_cnt) max_cnt = negative[i];
}
for(int i=0; i<=4000; i++) {
if(positive[i] == max_cnt) modes.push_back(i);
if(negative[i] == max_cnt) modes.push_back(i*(-1));
}
if(modes.size()==1) return modes[0];
sort(modes.begin(), modes.end());
return modes[1];
}
int range() {
return arr[n-1] - arr[0];
}
int main() {
cin.tie(NULL);
ios::sync_with_stdio(false);
cin >> n;
for(int i=0; i<n; i++) {
int tmp;
cin >> tmp;
arr.push_back(tmp);
}
sort(arr.begin(), arr.end());
cout << average() << "\n";
cout << median() << "\n";
cout << mode() << "\n";
cout << range();
return 0;
}
728x90
반응형
'💡 Problem Solving > Baekjoon' 카테고리의 다른 글
[백준 - 15663] N과 M (9) [C++] (0) | 2021.01.20 |
---|---|
[백준 - 2529] 부등호 [C++] (0) | 2021.01.18 |
[백준 - 14502] 연구소 [C++] (0) | 2021.01.16 |
[백준 - 14889] 스타트와 링크 [C++] (0) | 2021.01.15 |
[백준 - 14888] 연산자 끼워넣기 [C++] (0) | 2021.01.14 |