Koder / 박성훈
article thumbnail

절사평균을 구현해내는 문제.

클래스2에 새로 들어간 문제가 되어서

클래스2 금장이 은장이되었길래 풀어보았다.

https://www.acmicpc.net/problem/18110

 

18110번: solved.ac

5명의 15%는 0.75명으로, 이를 반올림하면 1명이다. 따라서 solved.ac는 가장 높은 난이도 의견과 가장 낮은 난이도 의견을 하나씩 제외하고, {5, 5, 7}에 대한 평균으로 문제 난이도를 결정한다.

www.acmicpc.net

 

절사평균을 구하는 방법은 문제에서 제시해주고 있으므로 문제에서 말하는 바에 따라 계산해 주면 되는데,

반올림하는법을 여기서 짚고가면 도움이 될 듯 하다.

 

내가 아는 바로 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;
}

반응형