문제 : https://www.acmicpc.net/problem/6986
[ 알고리즘풀이 ]
절사평균과 보정평균의 정의대로 평균을 구하는 것은 굉장히 쉽습니다. 하지만, 이 문제는 단순히 double 형으로 절사평균과 보정 평균을 구할 시 부동소수점 오류로 정답을 구할 수 없습니다. 즉, 실수가 아닌 정수형으로 바꾼 후 소수점 셋째 자리까지 구하고 반올림을 해줘야 합니다.
소수점 셋째 자리까지 정수형으로 구하기 위해서는 들어오는 Input에 1000을 곱해서 저장합니다. 그 후, Input을 K로 나누면 소숫점 셋째 자리까지 값을 얻어낼 수 있습니다. 그 후, 반올림을 진행하면 됩니다.
예시를 통해서 익혀보겠습니다.
72.8 / 6 은 소숫점 셋째 자리까지 구하면 12.133 입니다. 이 과정을 72.8 * 1000을 해서 72800 으로 만들고 6으로 나눈다면 정수형으로 12133을 얻을 수 있습니다. 즉, 뒤에 3개는 소수점 나머지는 정수에 해당되는 수를 부동소수점 오류 없이 정수형으로 얻어낼 수 있습니다.
#include<iostream>
#include<vector>
#include<algorithm>
using namespace std;
void print(int A, int K) {
A = A / K;
if (A % 10 >= 5)
A += 10;
A /= 10;
cout << A / 100 << '.' << (A / 10) % 10 << A % 10 << '\n';
}
int main(void) {
ios::sync_with_stdio(false);
cin.tie(0); cout.tie(0);
int N, K;
vector<int> list;
double t;
cin >> N >> K;
for(int i = 0; i < N; i++){
cin >> t;
list.push_back(1000 * t);
}
sort(list.begin(), list.end());
int avg1 = 0, avg2 = 0;
for (int i = K; i < N - K; i++)
avg1 += list[i];
avg2 = avg1 + K *( list[K] + list[N - K - 1]);
print(avg1, N - 2*K);
print(avg2, N);
return 0;
}
'Problem Solving > BOJ' 카테고리의 다른 글
[BOJ] 2467 : 용액 - travelbeeee (0) | 2020.01.22 |
---|---|
[BOJ] 2470 : 두 용액 - travelbeeee (0) | 2020.01.22 |
[BOJ] 2028 : 자기복제수 - travelbeeee (0) | 2020.01.21 |
[BOJ] 2033 : 반올림 - travelbeeee (0) | 2020.01.21 |
[BOJ] 15975 : 화살표 그리기 - travelbeeee (0) | 2020.01.21 |