코드
#include <iostream>
#include <algorithm>
#include <string>
#include <vector>
#include <cmath>
using namespace std;
int n, a[500003],numcnt[8105], res, temp,many, sum,cnt;
vector<int> v;
int main() {
cin >> n;
for(int i = 0; i < n; i++) {
cin >> a[i];
// 절대값이 4000 이하인 수들이므로, 4000을 더해준 값의 개수를 구해준다
numcnt[a[i] + 4000]++;
sum += a[i];
}
sort(a, a + n);
for(int i = 0; i < 8001; i++) {
if(numcnt[i] >= temp) temp = numcnt[i]; // 최빈값 구하기
}
for(int i = 0; i < 8001; i++) {
if(numcnt[i] == temp) v.push_back(i - 4000); // 4000을 더했으므로, 원상복귀
}
// 소수점 연산은 오차가 있을 수 있으므로, 10을 곱해서 정수 연산
double avg = (double)(sum) / n;
avg *= 10;
if(avg >= 0) {
if(((int)avg % 10) >= 5) avg += 10;
} else {
avg = -avg;
if(((int)avg % 10) >= 5) avg += 10;
avg = -avg;
}
avg /= 10;
cout << (int)avg << '\n';
cout << a[n / 2] << '\n';
v.size() > 1 ? cout << v[1] << '\n' : cout << v[0] << '\n';
cout << (a[n - 1] - a[0]) << '\n';
return 0;
}
평균을 맞게 구한 거 같은데 계속 틀려서 의아해하다가, 지문을 잘못 읽어 a배열을 적게 할당한 게 걸림돌이었던 문제. 최대값과 중앙값을 구하기는 쉬웠다.
평균은 소수연산을 하면 오차가 나서 틀릴 것 같아 10을 곱해준 값에서 반올림 조건을 주고, 다시 10을 나누어주는 방식을 선택했다.
최빈값은, 주어지는 값의 절대값이 4000이하이므로 8000개의 배열을 만든 후, 4000을 더해줘서 그 개수를 세는 방식으로 진행했다.
'백준' 카테고리의 다른 글
[백준] 13301번 타일 장식물 C++ 코드 (0) | 2024.07.27 |
---|---|
[백준] 9625번 BABBA C++ 코드 (0) | 2024.07.27 |
[백준] 1913번 달팽이 C++ 코드 (0) | 2024.07.27 |
[백준] 6603번 로또 C++ 코드 (0) | 2024.07.25 |
[백준] 9184번 신나는 함수 실행 C++ 코드 (0) | 2024.07.15 |