반응형
https://www.acmicpc.net/problem/18110
* 해결 아이디어
N명의 사람의 15%를 구한 후, 1~30점 난이도 의견 배열의 앞과 뒤에서 1씩 빼준다.
그려면 30% 절사평균이 구현되며, 배열에 들어있는 값들을 평균내어 문제에 알맞게 출력하면 된다.
반응형
#include <iostream>
#include <string>
#include <vector>
#include <cmath>
#include <algorithm>
#include <utility>
#include <stack>
#include <queue>
#include <deque>
#include <utility>
#define MIN 0
#define MAX 10000000
using namespace std;
typedef unsigned long long int ll;
int level[31] = { 0, };
int main() {
ios::sync_with_stdio(false);
cin.tie(NULL);
cout.tie(NULL);
int n;
double numOfPeople, ans = 0;
cin >> n;
if (n == 0)
{
cout << 0;
return 0;
}
for (int i = 0; i < n; i++)
{
int temp;
cin >> temp;
level[temp]++;
}
numOfPeople = round(n * 0.15);
for (int i = 1; i <= 30; i++)
{
if (numOfPeople == 0)
break;
while (numOfPeople != 0 && level[i] != 0) {
level[i]--;
numOfPeople--;
}
}
numOfPeople = round(n * 0.15);
for (int i = 30; i >= 1; i--)
{
if (numOfPeople == 0)
break;
while (numOfPeople != 0 && level[i] != 0) {
level[i]--;
numOfPeople--;
}
}
numOfPeople = round(n * 0.15);
for (int i = 1; i <= 30; i++)
{
ans += level[i] * i;
}
cout << round(ans / (n - round(2 * numOfPeople)));
}
728x90
Round-off (사사오입)과 Round-to-nearest-even(오사오입)
이번 문제를 풀게되면서 C++에서 반올림을 해주는 round 함수를 알게되었고 사용했다.
c++는 반올림 할 때의 수가 5이상이면 올리고 4이하면 버린다. 이를 사사오입이라 한다.
오사오입은 4이하는 버리고 6이상은 올려주는 반올림 법을 뜻한다.
언어마다 반올림 방식이 다르기때문에 잘 확인하고 함수를 사용해야한다.(round 함수가 있다면)
오사오입은 왜 사용하는가?
반올림의 목적 : 실제수치에 가장 가깝게 표시하기 위해
예를 들자면 아래와 같다.
* 정수의 경우
- 123을 오사오입으로 반올림한다면?
- 123은 5의 배수가 아니므로, 가장 가까운 5의 배수인 125로 반올림 한다.
- 187을 오사오입으로 반올림한다면?
- 187은 5의 배수가 아니므로, 가장 가까운 5의 배수인 185로 반올림 한다.
- 92를 오사오입으로 반올림한다면?
- 92는 5의 배수가 아니므로, 가장 가까운 5의 배수인 90으로 반올림한다.
- 760을 오사오입으로 반올림한다면?
- 760은 5의 배수이므로 그대로 유지한다.
* 소수의 경우
- .23을 오사오입으로 반올림한다면?
- 3.23은 5의 배수가 아니므로, 가장 가까운 5의 배수인 3.25로 반올림 한다.
- 6.58을 오사오입으로 반올림한다면?
- 6.58은 5의 배수가 아니므로, 가장 가까운 5의 배수인 6.6으로 반올림 한다.
- 9.94를 오사오입으로 반올림한다면?
- 9.94는 5의 배수가 아니므로, 가장 가까운 5의 배수인 9.95로 반올림 한다.
- 12.76을 오사오입으로 반올림한다면?
- 12.76은 5의 배수가 아니므로, 가장 가까운 5의 배수인 12.75로 반올림 한다.
- 18.00을 오사오입으로 반올림한다면?
- 18.00은 5의 배수이므로 그대로 유지 한다.
이러한 반올림 방식은 주로 경제학이나 회계학 분야에서 사용되며, 계산의 간편함과 오차를 최소화하는 효과를 가지고 있다.
더욱 자세한 설명은 아래 블로그를 참고하자. 수학적으로 증명하는 과정이 명시되어 있다.
https://blog.naver.com/noseoul1/221592047071
반응형
'컴퓨터공학 > 알고리즘' 카테고리의 다른 글
정렬된 배열을 위한 효율적인 해법: Binary Search (이진탐색) (47) | 2024.04.10 |
---|---|
[백준,C++] 18111번 : 마인크래프트 (52) | 2024.03.23 |
Strassen Algorithm (스트라센 알고리즘) 행렬의 곱 (57) | 2024.03.02 |
C++, C 언어 알고리즘 표준 입출력 (58) | 2024.03.01 |
[백준/C++] 1541: 잃어버린 괄호 (55) | 2024.02.27 |