끄적끄적 코딩
article thumbnail
Published 2019. 8. 30. 18:20
[C++] 백준 2108번 통계학 알고리즘
728x90

평균, 중앙값, 최빈값, 범위를 구하는 문제입니다.

평균 : 
n개의 입력받은 값을 전부 더한 후 n으로 나누고
+0.5를 해준 후 floor함수로 내림을 해줘서 평균해주어서 구했습니다.

중앙값 :
n은 홀수이므로 n / 2 + 1번째 위치가 중앙값입니다.
sort한 다음 n / 2 + 1번째 배열을 출력했습니다.

최빈값 :
많이 나온 값들을 vector에 넣어두고
그 값들중 두번째로 작은 값을 출력했습니다.

범위 :
입력받을 때 가장 큰 숫자와 가장 작은 숫자를 계산하였고
가장 큰 숫자 - 가장 작은 숫자를 해주어서 구했습니다.

 

#include <iostream>
#include <algorithm>
#include <cstring>
#include <vector>
#include <math.h>
using namespace std;

int main(int argc, char *argv[])
{
	int n;
	int num;
	double avg = 0;
	int sum = 0;
	int count = 0;
	int center;
	int centerN;
	int manyN;
	int arr[8010];
	int maxN = -987654321;
	int minN = 987654321;
	vector<int> v;

	cin >> n;

	memset(arr, 0, sizeof(arr));

	center = n / 2 + 1;
	for (int i = 0; i < n; ++i) {
		cin >> num;
		sum += num;
		maxN = max(maxN, num);
		minN = min(minN, num);
		++arr[num + 4000];
		if (count < arr[num + 4000]) {
			v.clear();
			count = arr[num + 4000];
			v.push_back(num + 4000);
		}
		else if (count == arr[num + 4000]) {
			v.push_back(num + 4000);
		}
	}

	sort(v.begin(), v.end());

	avg = floor(((double)sum / n) + 0.5);
	sum = 0;
	for (int i = 0; i <= 8000; ++i) {
		sum += arr[i];
		if (sum >= center) {
			centerN = i - 4000;
			break;
		}
	}

	if (v.size() == 1) {
		manyN = v[0] - 4000;
	}
	else {
		manyN = v[1] - 4000;
	}

	printf("%.0lf\n", avg);
	printf("%d\n", centerN);
	printf("%d\n", manyN);
	printf("%d\n", maxN - minN);

	return 0;
}

검색 태그