코딩하기 좋은날
백준 2108 통계학 본문
반응형
문제와 채점은 위 사이트에서 확인 하실 수 있습니다.
이 문제는 각각 입력받은 숫자들의 산술평균, 중앙값, 최빈값, 최댓값과 최솟값의 차이를 구하는 문제였습니다.
다른값들은 구하는게 아주 쉬운데 최빈값이 그나마 좀 구하기 힘들었습니다. 양수와 음수 배열을 하나씩 만들고 각 숫자가 나온 빈도를 배열에 저장한 뒤
가장 많은 빈도가 나온 값을 찾으면 됩니다. 그런데 최빈값이 여러개인 경우엔 그 최빈값들 중 두번째로 작은 숫자를 출력하라고 되있으므로 동일한 최빈값이 나올 경우 벡터에 저장 한후 두번째 원소를 출력해주면 됩니다.
다음은 코드입니다.
#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 |