주소 : https://www.acmicpc.net/problem/2108
2108번: 통계학
첫째 줄에 수의 개수 N(1 ≤ N ≤ 500,000)이 주어진다. 단, N은 홀수이다. 그 다음 N개의 줄에는 정수들이 주어진다. 입력되는 정수의 절댓값은 4,000을 넘지 않는다.
www.acmicpc.net


소스 코드 :
#define _CRT_SECURE_NO_WARNINGS
#include <iostream>
#include <vector>
#include <math.h>
#include <cmath>
#include <algorithm>
using namespace std;
double arithmetic_number(double sum, int N)
{
double num = sum / N;
if (num >= 0.5)
return round(num);
else if (num < 0.5 && num >-0.5)
return 0;
else if (num <= -0.5)
return round(num);
}
int median(vector<int> v,int N)
{
sort(v.begin(), v.end());
int middle = N / 2;
return v[middle];
}
int mode(vector<int> v, int N)
{
if (N == 1)
return v[0];
sort(v.begin(), v.end());
vector<int> order;
vector<int> result;
for (int i = 0;i < N;i++)
{
int temp = v[i];
auto l = lower_bound(v.begin(), v.end(), temp);
auto r = upper_bound(v.begin(), v.end(), temp);
order.push_back(r - l);
}
int max = *max_element(order.begin(), order.end());
if (max == 1)
return v[1];
if (order[0] == max)
result.push_back(v[0]);
for (int i = 1;i < N;i++)
{
if (order[i] == max && v[i]!=v[i-1])
result.push_back(v[i]);
}
sort(result.begin(), result.end());
if (result.size() == 1)
return result[0];
else return result[1];
}
int scope(vector<int> v, int N)
{
int max = v[0];
int min = v[0];
if (N == 1)
return 0;
else return *max_element(v.begin(), v.end()) - *min_element(v.begin(), v.end());
}
int main()
{
int N;
int middle;
double sum = 0;
cin >> N;
vector<int> v;
for (int i = 0;i < N;i++)
{
int temp;
cin >> temp;
v.push_back(temp);
sum += temp;
}
cout << arithmetic_number(sum, N) << '\n';
cout << median(v,N) << '\n';
cout << mode(v, N) << '\n';
cout << scope(v, N) << '\n';
}
마무리 : 이 문제는 산술평균, 중앙값, 최빈값, 범위를 구하는 문제로 산술평균은 평균 구하는 식으로 하면 되고 중앙값은 sort함수로 정렬한 뒤에 그 가운데 값을 리턴하면 된다. 최빈값은 가장 많이 나타난 값을 구해야하지만 그 값이 여러 개 있으면 두 번째로 작은 값을 출력해야하기 때문에 sort로 정렬한 뒤에 lower_bound와 upper_bound로 많이 나타낸 값을 구한다. 여러 개 있으면 다시 한 번 더 sort로 정렬한 뒤 두 번째로 작은 값을 출력한다. 범위는 단순히 알고리즘 라이브러리로 최댓값과 최솟값의 차이를 구해주면 된다.
'백준 > C++' 카테고리의 다른 글
백준 1874번 : 스택 수열 [C++] (0) | 2022.08.23 |
---|---|
백준 1654번 : 랜선 자르기 [C++] (0) | 2022.08.22 |
백준 1966번 : 프린터 큐 [C++] (0) | 2022.08.22 |
백준 1929번 : 소수 구하기 [C++] (0) | 2022.08.18 |
백준 10866번 : 덱 [C++] (0) | 2022.08.18 |