안녕 세상아,

[c++/백준] 2108 통계학 본문

백준

[c++/백준] 2108 통계학

돈 많은 백수가 되고싶다 2023. 5. 8. 17:44

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

 

2108번: 통계학

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

www.acmicpc.net

산술평균, 중앙값, 최빈값, 범위를 구하는 문제이다.

다른 값은 구하기 매우 쉽지만 최빈값은 약간의 생각을 하고 풀어야한다. 아마 이것 때문에 실버3인듯한 느낌?

 

산술평균값은 소수점 이하 첫번째 자리에서 반올림해야한다. 이는 round를 사용하여 쉽게 구할 수 있다. round는 cmath 헤더에 include 되어있다. 

 

중앙값과 범위는 vector를 정렬하면 쉽게 구할 수 있다.

 

최빈값은 절댓값이 4000이하라고 주어져있기 때문에 범위가 8001인 배열을 만든다(arr[8001]={0}).

그 후 입력되는 숫자 +4000을 해서 ++해주면 된다. 이렇게 되면 같은 숫자가 여러개라면 arr[i]만 숫자가 클 것이다. 이렇게 최빈값을 찾을 수 있다.

가장 큰 숫자를 찾는 방법은 int max=0을 선언한 후 비교하면 max값이 큰 값으로 갱신된다. max값을 찾은 후 해당 값을 새로운 벡터에 push_back 해준다.

 

코드를 보면 더 쉽게 이해가 될 것이다.

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

int main() {
	ios::sync_with_stdio(false);
	cin.tie(NULL);
	cout.tie(NULL);

	vector<int> v;
	int n;
	cin >> n;
	int arr[8001] = { 0 };

	double sum = 0;

	for (int i = 0; i < n; i++) {
		int x;
		cin >> x;
		sum = sum + x;		//평균 구하기 위함
		v.push_back(x);
		arr[x + 4000]++;	//최빈값 구하기 위함
	}

	
	//평균
	double avg = round(sum / n);	//소수점 첫번째에서 반올림
	if (avg == -0) {	//예외 설정
		cout << 0 << '\n';
	}
	else
	{
		cout << avg << '\n';
	}
	
	sort(v.begin(), v.end()); //중앙값, 범위 구하기 위해 정렬
	
	//중앙값
	int mid = v[n / 2];
	cout << mid << '\n';

	//최빈값
	int recent;
	int max = 0;
	for (int i = 0; i < 8001; i++) {
		if (arr[i] == 0)
			continue;
		else
		{
			if (arr[i] > max)
				max = arr[i];
		}
	}
	vector<int> ans;	//최빈값 벡터
	for (int i = 0; i < 8001; i++) {
		if (arr[i] == max) {
			ans.push_back(i - 4000);
		}
	}
	sort(ans.begin(), ans.end());	//최빈값 중 2번째 작은 수 찾기 위함

	//최빈값이 여러개일 때와 한개일 때 나눠서 구하기
	if (ans.size() == 1) {
		recent = ans[0];
	}
	else{
		recent = ans[1];
	}
	cout << recent << '\n';

	//범위
	int rage = v[n - 1] - v[0];
	cout << rage << '\n';
}

최빈값 빼고는 브론즈 수준인듯. 

'백준' 카테고리의 다른 글

[c++/백준] 1021 회전하는 큐  (0) 2023.05.09
[c++/백준] 11659 구간 합 구하기 4  (1) 2023.05.09
[c++/백준] 14501 퇴사  (0) 2023.05.08
[c++/백준] 15650 N과 M(2)  (0) 2023.05.08
[c++/백준] 2606 바이러스  (1) 2023.05.08