반응형
Notice
Recent Posts
Recent Comments
Link
«   2024/07   »
1 2 3 4 5 6
7 8 9 10 11 12 13
14 15 16 17 18 19 20
21 22 23 24 25 26 27
28 29 30 31
Archives
Today
Total
관리 메뉴

코딩하기 좋은날

백준 2108 통계학 본문

백준(Baekjoon) 문제

백준 2108 통계학

huiung 2019. 1. 22. 00:24
반응형

문제와 채점은 위 사이트에서 확인 하실 수 있습니다.

 

이 문제는 각각 입력받은 숫자들의 산술평균, 중앙값, 최빈값, 최댓값과 최솟값의 차이를 구하는 문제였습니다.

 

다른값들은 구하는게 아주 쉬운데 최빈값이 그나마 좀 구하기 힘들었습니다. 양수와 음수 배열을 하나씩 만들고 각 숫자가 나온 빈도를 배열에 저장한 뒤

 

가장 많은 빈도가 나온 값을 찾으면 됩니다. 그런데 최빈값이 여러개인 경우엔 그 최빈값들 중 두번째로 작은 숫자를 출력하라고 되있으므로 동일한 최빈값이 나올 경우 벡터에 저장 한후 두번째 원소를 출력해주면 됩니다. 

 

다음은 코드입니다.

 

#include <iostream>
#include <cmath>
#include <algorithm> 
#include <vector>

using namespace std;

int main(void) {
	ios_base::sync_with_stdio(false); cin.tie(NULL);
	int N;
	float result = 0;
	vector<int> v;
	cin >> N;
	int arr[N];
	int fre[4001] = {0,}; //양수 저장 
	int fre2[4001] = {0,}; //음수 저장 
	int count = 0;
	for(int i = 0; i < N; i++)
		cin >> arr[i];

	sort(arr, arr+N);
	 
	for(int i = 0; i < N; i++)
		result += arr[i];
	
	result = result / N;
	result = floor(result + 0.5);
	
	cout<<result<<'\n'; //산술평균 
	
	cout<<arr[N/2]<<'\n'; //중앙값 
	
	for(int i = 0; i < N; i++) { //각 숫자가 나온 횟수를 저장 
		if(arr[i] >= 0)
			fre[arr[i]]++;
		else
			fre2[abs(arr[i])]++; 
	}
		
	for(int i = 0; i < 4001; i++) {
		if(count < fre[i]) {
			count = fre[i];
			result = i;
			v.clear();
			v.push_back(result);
		}
		
		if(count < fre2[i]) {
			count = fre2[i];
			result = -i;
			v.clear();
			v.push_back(result);
		}
		
		if(count == fre[i]) //최빈값이 동일한 경우 벡터에 저장 
			v.push_back(i);
			
		if(count == fre2[i])
			v.push_back(-i);
	
	}
	
	sort(v.begin(), v.end());
	if(v.size() == 1) //최빈값 출력 
		cout<<v[0]<<'\n';
	else
		cout<<v[1]<<'\n';
	
	cout<<arr[N-1] - arr[0]<<'\n'; //범위 
	return 0;
}
반응형

'백준(Baekjoon) 문제' 카테고리의 다른 글

백준 4948 베르트랑 공준  (0) 2019.01.22
백준 1929 소수 구하기(에라토스테네스의 체)  (0) 2019.01.22
백준 2800 괄호 제거  (0) 2019.01.21
백준 1092 배  (0) 2019.01.21
백준 2399 거리의 차이  (0) 2019.01.20