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
반응형
'Algorithm > BAEKJOON' 카테고리의 다른 글
[BOJ] 24039번 2021은 무엇이 특별할까? (C++) (0) | 2022.01.01 |
---|---|
[BOJ] 7662번 이중 우선순위 큐 (C++) (0) | 2021.12.31 |
[BOJ] 15702번 중간고사 채점 (C++) (0) | 2021.12.29 |
[BOJ] 1018번 체스판 다시 칠하기 (C++) (0) | 2021.12.29 |
[BOJ] 10816번 숫자 카드 2 (C++) (0) | 2021.12.29 |