Algorithm/📖Baekjoon
#2108 통계학
yewoneeee
2022. 5. 12. 22:24
# 문제
# 입력 및 출력
# 풀이
일단 산술평균은 입력받을 때 총합을 구해놓으면 되고,
중앙값도 vector를 정렬해서 n/2의 값을 가져오면 됨
최빈값이 가장 복잡했는데 가장 많은 빈도를 가진 인덱스를 구하고 그 인덱스와 같은 빈도를 가진 수를 벡터에 넣어두고
같은 빈도 수를 가진 숫자가 2개 이상이면 두번째 값을 가져와서 출력함
마지막 범위는 벡터의 끝 - 벡터의 처음 하면 됨
* -0 문제는 floor함수를 사용해서 해결했음 (cmath 헤더)
* 자세한건 아래 블로그 참고
https://code-examples.net/ko/q/874dc
소수점 - ceil c++
code-examples.net
#include <iostream>
#include <vector>
#include <cmath> // floor 함수용
#include <algorithm> // sort 함수용
#pragma warning (disable:4996)
using namespace std;
vector<int> arr; // 입력받은 숫자 저장용
vector<int> most; // 최다 빈도수 숫자 저장용
int cnt[8001]; // count 배열
int main() {
int n, t, sum = 0, max = 0;
cin >> n;
for (int i = 0; i < n; i++) { // 입력 및 count, sum 계산
scanf("%d", &t);
arr.push_back(t);
cnt[t + 4000]++;
sum += t;
}
sort(arr.begin(), arr.end());
for (int i = 0; i < 8001; i++) { // 최다 빈도수 찾기
if (cnt[max] < cnt[i]) max = i;
}
for (int i = 0; i < 8001; i++) { // 최다 빈도수와 같은 빈도를 가진 숫자 찾기
if (cnt[max] == cnt[i]) most.push_back(i);
}
if (most.size() >= 2) max = most.at(1); // 같은 빈도수를 가진 숫자가 2개 이상이면 두번째값
printf("%.0f\n", floor((double)sum / n + 0.5)); // 산술평균
printf("%d\n", arr.at(n / 2)); // 중앙값
printf("%d\n", max - 4000); // 최빈값
printf("%d\n", arr.back() - arr.front()); // 범위
}