T'SPACE

다채로운 에디터들의 이야기

컴퓨터공학/알고리즘

[백준,C++] 18110번 : solved.ac / 사사오입과 오사오입이란?

Hak_Fe 2024. 3. 3. 20:07
반응형

https://www.acmicpc.net/problem/18110

 

18110번: solved.ac

5명의 15%는 0.75명으로, 이를 반올림하면 1명이다. 따라서 solved.ac는 가장 높은 난이도 의견과 가장 낮은 난이도 의견을 하나씩 제외하고, {5, 5, 7}에 대한 평균으로 문제 난이도를 결정한다.

www.acmicpc.net

 

* 해결 아이디어

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 함수가 있다면)


오사오입은 왜 사용하는가?

반올림의 목적 : 실제수치에 가장 가깝게 표시하기 위해

 

예를 들자면 아래와 같다.

* 정수의 경우

  1. 123을 오사오입으로 반올림한다면?
    • 123은 5의 배수가 아니므로, 가장 가까운 5의 배수인 125로 반올림 한다.
  2. 187을 오사오입으로 반올림한다면?
    • 187은 5의 배수가 아니므로, 가장 가까운 5의 배수인 185로 반올림 한다.
  3. 92를 오사오입으로 반올림한다면?
    • 92는 5의 배수가 아니므로, 가장 가까운 5의 배수인 90으로 반올림한다.
  4. 760을 오사오입으로 반올림한다면?
    • 760은 5의 배수이므로 그대로 유지한다.

 * 소수의 경우

  1. .23을 오사오입으로 반올림한다면?
    • 3.23은 5의 배수가 아니므로, 가장 가까운 5의 배수인 3.25로 반올림 한다.
  2. 6.58을 오사오입으로 반올림한다면?
    • 6.58은 5의 배수가 아니므로, 가장 가까운 5의 배수인 6.6으로 반올림 한다.
  3. 9.94를 오사오입으로 반올림한다면?
    • 9.94는 5의 배수가 아니므로, 가장 가까운 5의 배수인 9.95로 반올림 한다.
  4. 12.76을 오사오입으로 반올림한다면?
    • 12.76은 5의 배수가 아니므로, 가장 가까운 5의 배수인 12.75로 반올림 한다.
  5. 18.00을 오사오입으로 반올림한다면?
    • 18.00은 5의 배수이므로 그대로 유지 한다.
SMALL

이러한 반올림 방식은 주로 경제학이나 회계학 분야에서 사용되며, 계산의 간편함과 오차를 최소화하는 효과를 가지고 있다.

 

더욱 자세한 설명은 아래 블로그를 참고하자. 수학적으로 증명하는 과정이 명시되어 있다.

https://blog.naver.com/noseoul1/221592047071

 

반올림하는 두 가지 방법 (Round-off(사사오입), Round-to-nearest-even(오사 오입))

피지에서 유효 숫자 반올림하는 법을 누가 질문했는데 조금 다른 방식으로 반올림을 했다. '5의 경우 ...

blog.naver.com

 

반응형