매일 BOJ

(매일 BOJ) C++ 18110번 solved.ac

norepinephrine 2025. 7. 12. 22:52

이번 문제는 실버 4 난이도의 solved.ac 문제이다.

 

접근법부터 생각해보자

이 문제는 주어진 난이도 의견들 중 극단적인 값을 제거한 뒤 평균을 계산하는 문제로, 정렬 후 상위 및 하위 15%를 제외하고 나머지 값들의 평균을 반올림해 출력하는 것이 핵심이다.

먼저 입력값의 개수를 기준으로 제거할 의견 수를 round(n × 0.15)로 계산한 뒤, 전체 의견을 정렬하고 양 끝에서 해당 개수만큼 제외한 값을 합산하여 평균을 구한다. 이때 입력이 0일 경우를 예외 처리하고, 평균 계산 시 실수형으로 정확하게 나눈 후 round() 함수를 사용해 반올림해야 하며, 합계 자료형은 오버플로우를 방지하기 위해 long long을 사용하는 것이 안전하다. 하지만 입력이 10^5까지이기에 int 도 문제 없이 작동하는 것을 볼 수 있음.

 

아래는 작성한 코드이다.

#include <bits/stdc++.h>
using namespace std;

int main (void){
    ios::sync_with_stdio(0); cin.tie(0);
    int n;
    cin >> n;
    if (n == 0) {
        cout << 0;
        return 0;
    }
    int cutline = round((double)n * 0.15);
    int sum = 0;
    
    vector<int> v;
    for (int i  = 0; i < n; i++){
        int num;
        cin >> num;
        v.push_back(num);

    }
    sort(v.begin(),v.end());
    for (int i = cutline; i < n - cutline; i++){
        sum += v[i];
    }

    double result = (double)sum / (n - cutline*2);
    cout << (int)round(result);
}