백준 2108 c++
#include <iostream>
#include <vector>
#include <algorithm>
#include <cmath>
using namespace std;
int input(int lower, int upper);
int input_odd(int lower, int upper);
void input_numbers(vector <int>& vi, int size);
void sort_vector(vector <int>& vi);
void show_result(vector <int> vi);
int arithmetic_mean(vector <int> vi);
int median(vector <int> vi);
int mode(vector <int> vi);
int range(vector <int> vi);
int main(void)
{
ios_base::sync_with_stdio(false);
cin.tie(NULL);
cout.tie(NULL);
int N;
vector <int> num_list;
N = input_odd(1, 500000);
input_numbers(num_list, N);
sort_vector(num_list);
show_result(num_list);
return 0;
}
int input(int lower, int upper)
{
//cout << "input()" << endl;
int A;
while (1)
{
cin >> A;
if (A >= lower && A <= upper)
{
break;
}
else
{
;
}
}
return A;
}
int input_odd(int lower, int upper)
{
//cout << "input_odd()" << endl;
int A;
while (1)
{
cin >> A;
if (A >= lower && A <= upper && A % 2 == 1)
{
break;
}
else
{
;
}
}
return A;
}
void input_numbers(vector <int>& vi, int size)
{
//cout << "input_numbers()" << endl;
int i;
for (i = 0; i < size; i++)
{
vi.push_back(input(-4000, 4000));
}
return;
}
void sort_vector(vector <int>& vi)
{
//cout << "sort_vector()" << endl;
sort(vi.begin(), vi.end());
return;
}
void show_result(vector <int> vi)
{
//cout << "show_result" << endl;
//4000 * 500000해도 20억이기때문에 int로 계산한다.
cout << arithmetic_mean(vi) << "\n";//산술평균
cout << median(vi) << "\n";//중앙값
cout << mode(vi) << "\n";//최빈값
cout << range(vi) << "\n";//범위
}
int arithmetic_mean(vector <int> vi)
{
double mean, total = 0;
int i, result;
int size = vi.size();
for (i = 0; i < size; i++)
{
total = total + vi[i];
}
mean = total / size;
//올림 : celi, 내림 : floor, 반올림 : round
result = round(mean);
return result;
}
int median(vector <int> vi)
{
int size = vi.size();
return vi[size / 2];
}
int mode(vector <int> vi)//최빈값이 여러개일 경우 최빈값 중 두 번째로 작은 값
{
int size = vi.size();
int i;
int currentNum = vi[0];
int count = 1;
int maxCount = 1;
int mode = currentNum;
vector <int> temp;//최빈값이 여러개인 경우 모아둠
temp.push_back(vi[0]);
for (i = 1; i < size; i++)
{
if (vi[i] == currentNum)
{
count++;
}
else
{
currentNum = vi[i];
count = 1;
}
if (count > maxCount) //최빈값을 초과하는 수가 나온 경우
{
temp.clear();
maxCount = count;
mode = currentNum;
temp.push_back(mode);
}
else if (count == maxCount)//최빈값이 같은 경우
{
temp.push_back(currentNum);
}
else
{
;
}
}
if (temp.size() != 1)
{
mode = temp[1];
}
else
{
;
}
return mode;
}
int range(vector <int> vi)
{
return vi.back() - vi.front();
}