BOJ 18110 - Solved.ac [C++]
18110번: solved.ac (acmicpc.net)
18110번: solved.ac
5명의 15%는 0.75명으로, 이를 반올림하면 1명이다. 따라서 solved.ac는 가장 높은 난이도 의견과 가장 낮은 난이도 의견을 하나씩 제외하고, {5, 5, 7}에 대한 평균으로 문제 난이도를 결정한다.
www.acmicpc.net
문제 설명은 다음과 같다.
간단히 이야기하자면, solved.ac가 결정한 문제의 난이도를 계산해서 출력해야 하는데, 그 과정은 다음의 과정을 따른다.
1. 아직 아무 의견이 없다면 (제출한 사람이 0) -> 난이도 : 0
2. 의견이 1개 이상 있다면 (n>=1), 난이도는 상위 의견 15%, 하위 의견 15%를 제외하고 나머지 의견들로 난이도를 책정한다.
C++에서는 <numeric> header file과, 벡터 자료구조를 사용해서 쉽게 구현이 가능했다.
우선 아래는 제출한 C++ 코드이다.
#include <iostream>
#include <algorithm>
#include <vector>
#include <numeric>
#include <cmath>
using namespace std;
int main() {
ios::sync_with_stdio(false);
cin.tie(NULL);
cout.tie(NULL);
double test;
cin >> test;
vector<int> anslist;
if (test==0){
cout << 0 << '\n';
return 0;
}
for (int i=0;i<test;i++){
int itg;
cin >> itg;
anslist.push_back(itg);
}
sort(anslist.begin(),anslist.end());
double mok = round(test*0.15);
double dap = accumulate(anslist.begin()+mok,anslist.end()-mok, 0) / (test-2*mok);
cout << round(dap) << endl;
return 0;
}
우선 벡터 자료구조 안에 입력 받은 값들을 다 때려박는다.
이후에 sort 시켜서 오름차순 정렬을 시켜놓은 후에, round 함수를 사용해서
전체 인원의 15%이 몇 명인지 mok 변수에 담는다.
그 다음에, 처음과 끝으로부터 mok을 뺀 포인터가 가리키는 변수들을 모조리 더한다.
(accumulate 함수를 사용하면 벡터 안의 원소 값을 다 더해준다)
마지막으로 평균을 내기 위해서, 전체 인원 수에서 2*mok 만큼 빼준 것의 평균을 내준다 (위 아래 상위 15%가 빠졌음)
반올림을 해주기 위해 round 함수를 써주면 끝 ~!