문제
https://www.acmicpc.net/problem/18110
문제 요약
Solved.ac 한 문제에 대한 n개의 난이도 의견을 입력 받고, 해당 문제의 난이도를 출력한다.
난이도를 결정하는 방식은 다음과 같다.
1. 아직 아무 의견이 없다면, 문제의 난이도는 0으로 결정한다.
2. 의견이 하나 이상 있다면, 문제의 난이도는 모든 사람의 난이도 의견의 30% 절사평균으로 결정한다.
절사 평균이란, 난이도 왜곡을 막기 위해, 가장 큰 값과 가장 작은 값들을 제외하고 평균을 내는 방식이다.
30% 절사평균은 위에서 15%, 아래에서 15%를 각각 제외하고 평균을 계산한다.
제외되는 사람의 수와 계산된 평균 값은 정수로 반올림한다.
코드
#include <iostream>
#include <algorithm>
#include <cmath>
#define MAX 300000
using namespace std;
int n;
double total;
int arr[MAX];
int main() {
cin >> n;
// 아무 의견이 없는 경우, 난이도는 0
if (n == 0) {
cout << 0;
return 0;
}
// 모든 사람의 의견 입력
for (int i = 0; i < n; i++) {
int num;
cin >> arr[i];
}
// 절사평균을 위한 오름차순 정렬
sort(arr, arr + n);
// 위, 아래에서 제외할 개수
int except = round(n * 0.15);
// 절사 평균 계산
for (int i = 0; i < n; i++) {
// 제외 범위의 수
if (except > i || (n - except) <= i) {
continue;
}
total += arr[i];
}
cout << round(total / (n - except * 2));
return 0;
}
코드 설명
1. n과 모든 사람의 난이도 의견을 입력 받아 배열 arr에 저장한다.
+ n이 0인 경우, 아직 아무 의견도 없는 것이므로 0을 출력하고 종료한다.
2. 절사평균에서 가장 큰 값과 작은 값들을 제외하기 위해 오름차순 정렬한다.
3. 위, 아래에서 제외할 개수를 round함수를 통해 계산한다.
4. arr에 대해 반복문을 돌며 제외하지 않을 난이도만 계산하여 30% 절사평균을 계산한다.
고찰
#include <cmath>
반올림, 올림, 내림 함수를 사용하기 위해서는 cmath 헤더 파일이 필요하다.
1. 올림 함수
=> ceil(a) : 소수형 변수 a를 올림하여, 정수를 반환한다.
2. 내림 함수
=> floor(a) : 소수형 변수 a를 내림하여, 정수를 반환한다.
3. 반올림 함수
=> round(a) : 소수형 변수 a를 반올림하여, 정수를 반환한다.
'Algorithm Problems > 수학' 카테고리의 다른 글
[백준/C++] 피보나치 수 3 (1) | 2024.08.04 |
---|---|
[백준/C++] 9471번: 피사노 주기 (2) | 2024.08.04 |
[백준/C++] 5692번: 팩토리얼 진법 (0) | 2024.05.18 |
[백준/C++] 28418번: 회장님께 바치는 합성함수 (3) | 2024.05.16 |
[백준/C++] 5618번: 공약수 (0) | 2024.04.21 |