절사평균을 구현해내는 문제.
클래스2에 새로 들어간 문제가 되어서
클래스2 금장이 은장이되었길래 풀어보았다.
https://www.acmicpc.net/problem/18110
절사평균을 구하는 방법은 문제에서 제시해주고 있으므로 문제에서 말하는 바에 따라 계산해 주면 되는데,
반올림하는법을 여기서 짚고가면 도움이 될 듯 하다.
내가 아는 바로 C언어에는(Cpp에는 있을지도 모르겠다) 반올림이 없으므로,
floor(바닥함수), ceil(천장함수) 둘의 조합으로 반올림을 구현해야 한다.
어떠한 소수 a/b를 반올림 하고 싶을때,
floor((double)a/b + 0.5)
(int)((double)a/b + 0.5)
다음과 같은 두 가지 방법을 통해 반올림을 해줄 수 있다.
정렬하고 다음과 같은 방법으로 반올림한뒤 절사평균을 구해주면 된다.
- 출력하는 답안도 반올림해줘야한다는 점과
- N이 0인 입력에 대해서 divided by 0 오류를 일으킬 수 있다는 점
두가지에 대해 조심하도록 하자.
#include <bits/stdc++.h>
using namespace std;
vector<int> v;
int main(){
int n,k;
cin >> n;
int cnt = (double)n*15/100 + 0.5;
int avg = 0;
if(n==0){ cout << 0; return 0; }
for(int i=0; i<n; i++){
cin >> k;
v.push_back(k);
}
sort(v.begin(), v.end());
for(int i=cnt; i<n-cnt; i++){ avg += v[i]; }
cout << (int)((double)avg / (n-cnt*2) + 0.5);
return 0;
}
반응형