본문 바로가기

Algorithm/BAEKJOON

[BOJ] 2108번 통계학 (C++)

728x90
반응형

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

 

2108번: 통계학

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

www.acmicpc.net

 

#include <iostream>
#include <cmath>
#include <algorithm>
#include <vector>
using namespace std;
 
int main() {
	ios::sync_with_stdio(false);
	cin.tie(NULL);
 
	int n, num, sum = 0;
	cin >> n;
 
	int number[8001] = {0, };
	vector<int> v;
	for(int i = 0; i < n; i++){
		cin >> num;
		v.push_back(num);
		sum += num;
		number[num + 4000]++;
	}
	if(round((float)sum / n) == -0) cout << 0 << endl;
	else cout << round((float)sum / n) << endl;
 
	sort(v.begin(), v.end());
	cout << v[n / 2] << endl;
 
	bool isFirst = false;
	int most_v, most = -9999;
	for(int i = 0; i < 8001; i++){
		if(number[i] == 0) continue;
		if(number[i] == most){
			if(isFirst){
				most_v = i - 4000;
				isFirst = false;
			}
		}
		if(number[i] > most){
			most = number[i];
			most_v = i - 4000;
			isFirst = true;
		}
	}
	cout << most_v << endl;
 
	cout << v[n - 1] - v[0] << endl;
	return 0;
}

 

입력을 받음과 동시에 평균을 구할 수 있도록 sum이라는 변수에 값을 더해주고, -4000~4000의 숫자가 몇 번 나왔는지 저장하는 배열 number[8001]을 활용하여 어떤 숫자가 나오면 해당 인덱스의 값을 증가시켜준다.

 

평균을 구할 때 cmath 라이브러리의 round(반올림) 함수를 사용했다. 이 때 주의할 점은 sum / n이 정수가 되기 때문에 sum을 float로 형변환해야 한다.

 

그 후, 입력받은 숫자들을 sort 함수를 통해 정렬해주고, 중앙값을 구한다. n이 무조건 홀수라고 하였기 때문에 중앙값은 n/2+1번째 수이고 인덱스는 1을 뺀 n/2이다.

 

최빈값의 경우 만약 나온 횟수가 같으면 두 번째로 작은 값을 출력하라고 하였으므로, isFirst라는 bool형 플래그값을 줘서 최빈값이 갱신될 때마다 true로 바꾸고, 같은 횟수가 두 번째로 나오면(true일 때) 해당 수를 최빈값으로 설정하고 false로 바꾼다.

 

범위의 경우에는 이미 오름차순으로 정렬되었으므로, 마지막 값에서 처음 값을 빼면 된다.

 

 

 

+) 데이터 추가  : 산술평균이 -0일 때 0으로 출력되도록 함

728x90
반응형