문제
https://www.acmicpc.net/problem/18110
개념
수학, 구현, 정렬
실행 결과
코드(c++)
#include <algorithm>
#include <cmath>
#include <iostream>
#include <vector>
using namespace std;
int main() {
ios_base::sync_with_stdio(false);
cin.tie(nullptr);
cout.tie(nullptr);
long long n; // 난이도 의견의 개수
cin >> n;
if (n == 0) {
cout << 0;
} else {
vector<long long> arr(n); // 난이도 의견들 저장할 동적 배열 선언
for (int i = 0; i < n; i++)
cin >> arr[i];
sort(arr.begin(), arr.end()); // 난이도 의견을 오름차 순으로 정렬
long long n_del = round(static_cast<double>(n) *
0.15); // 앞뒤로 제외할 의견 개수 구하고 반올림
long long sum = 0; // 난이도 합
for (int i = n_del; i < n - n_del; i++)
sum += arr[i];
long long ave =
round(static_cast<double>(sum) / (n - 2 * n_del)); // 난이도 평균 계산
cout << ave;
}
return 0;
}
코드 설명
이 문제는 난이도가 숫자로 주어지면 절사평균을 구하는 문제이다.
먼저 아무 의견이 없다면 0을 출력한다.
아니라면 난이도를 입력받는다. 이 때 입력받는 난이도 개수를 n이라고하면
n의 크기를 가진 동적배열 arr를 선언하고, 해당 배열을 오름차순으로 정렬한다.
왜냐하면 앞 뒤로 15%씩 잘라내서 절사평균을 구해야하기 때문이다.
절사평균 구하는 과정?
먼저, 앞 뒤로 잘라야하는 의견의 개수를 n_del라고 한다면
n_del는 n의 15%를 반올림해야한다. 이때 반올림할 때는 소숫점이 필요하므로
정수형 타입은 n을 실수형 타입으로 강제 형변환한 후 반올림해야 올바르게 반올림된다.
마찬가지로 해당 n을 이용하여 평균을 계산할 때도 마찬가지로 강제 형변환을 해야한다.
그렇지 않으면 정수형이 알아서 소숫점 이하를 잘라버리므로 유의하자.
'PS' 카테고리의 다른 글
[백준] 11399번: ATM (0) | 2024.09.17 |
---|---|
[백준] 28445번: 알록달록 앵무새 (0) | 2024.09.16 |
[백준] 9095번: 1, 2, 3 더하기 (0) | 2024.09.15 |
[백준] 1463번: 1로 만들기 (0) | 2024.09.13 |
[백준] 1602번: 나는야 포켓몬 마스터 이다솜 (2) | 2024.09.10 |