[백준] 2108번 통계학 C++ 문제풀이

https://www.acmicpc.net/problem/2108

 

2108번: 통계학

첫째 줄에 수의 개수 N(1 ≤ N ≤ 500,000)이 주어진다. 단, N은 홀수이다. 그 다음 N개의 줄에는 정수들이 주어진다. 입력되는 정수의 절댓값은 4,000을 넘지 않는다.

www.acmicpc.net

문제 풀이

이 문제 풀 때 어려웠던 점은 산술평균과 최빈값을 구하는 과정이었던 것 같다.

산술 평균의 경우에는 float로 바꾼 후 연산하고 cmath의 round를 이용해 값을 구했다.

최빈값 같은 경우에는 숫자가 나온 횟수를 저장하는 cnt배열을 만들어 숫자를 저장한 후 값들을 비교해 최빈값을 구했다.

 

소스 코드

#include <iostream>
#include <vector>
#include <algorithm>
#include <cmath>
using namespace std;

vector<int> num;
int cnt[8001] = { 0 };

int main() {
	int N;
	int sum = 0;
	cin >> N;

	for (int i = 0; i < N; i++) {
		int a;
		cin >> a;
		num.push_back(a);
		sum += a;
		cnt[a + 4000] += 1;
	}
	sort(num.begin(), num.end());

	// 산술평균
	int mean = round((float)sum / N);
	cout << mean << '\n';
	
	// 중앙값
	cout << num[N / 2] << '\n';
	
	// 최빈값
	bool first = false;
	int max_count = 0;
	int max_num = -4001;
	
	for (int i = 0; i < N; i++) {
		int idx = num[i];
		int b = cnt[idx+4000]; //횟수

		if (max_count < b) {
			first = false;
			max_num = idx;
			max_count = b;
		}
		else if (max_count == b) {
			if (first == false && idx != max_num) {
				first = true;
				max_num = idx;
			}
		}
	}
	cout << max_num << '\n';

	//범위 출력
	cout << num.back()  - num.front() << '\n';
}