본문 바로가기
백준/C++

백준 2108번 : 통계학 [C++]

by 대니스 2022. 8. 22.

주소 : 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