알고리즘/백준(BOJ)

[백준/알고리즘]#6896: 절사평균 [파이썬(python)/부동소수점]

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

 

6986번: 절사평균

첫째 줄에 절사평균(N, K)를, 둘째 줄에 보정평균(N, K)를 각각 소수점이하 셋째 자리에서 반올림하여 둘째 자리까지 출력한다. 예를 들어 결과값이 9.667인 경우 9.67로, 5인 경우 5.00으로, 5.5인 경우

www.acmicpc.net

절사평균과 보정평균을 구하는 방법은 쉬운데 

float를 사용한다는 점을 유의해야한다.

 

첫 시도에는 round()로 단순하게 반올림을 했다가 실패했는데 테스트케이스 답이 다 맞아도 틀리는 이유가 부동소수점 밖에 없겠다는 생각이 들었다

 

float를 다루어 나누기 때문에 정수로 먼저 숫자를 바꾸어 (10이상의 수를 곱해주기) 계산해주고 마지막에 다시 그 숫자로 나누어준다. (C언어든 파이썬이든 나눗셈을 하면 정수 몫만 돌려주기 때문이다.)

 

부동소수점의 구조는 float가

부호가 1비트, 지수가 8비트, 그리고 더 작은 숫자를 나타내려면 가수부분까지 23비트를 사용한다. 

 

부동소수점의 오차를 해결해주기 위해 지수 부분 2^-7만큼 더해주면 된다. 

 

 

파이썬 코드

#6896 절사평균
import sys
input = sys.stdin.readline

N, K = map(int, input().split())

score = []
for _ in range(N):
    score.append(float(input())*10)

score = sorted(score)[K:N-K]

jp=0
for i in score:
    jp+=i
jp = jp/(N-2*K)/10
#jp = round(jp, 2)


bp=0
for i in score:
    bp+=i
bp = bp + score[0]*K + score[-1]*K
bp = bp/N/10
#bp = round(bp, 2)

print("{:.2f}\n{:.2f}".format(jp + 0.00000001, bp + 0.00000001))