본문 바로가기
알고리즘/[python] 백준 BOJ

[python] 백준 6986 절사평균

by Alan_Kim 2024. 4. 17.
728x90
반응형

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

 

6986번: 절사평균

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

www.acmicpc.net

 

문제 해결

  • 우선 풀의 과정 순서는 어렵지 않다.
  • 리스트를 만들어서 절사평균은 앞에 k개, 뒤에 k개를 빼고 평균을 구하고, 보정평균은 앞에 k개, 뒤에 k개를 각각 k, -k-1 인덱스 값으로 변환시키고 평균을 구하면 된다.
  • 하지만 93%쯤에서 계속 오답이 나오는데 이유가 파이썬 나누기를 하는 과정중에 소수점 일부 계산이 손실되어 잘못 답이 나올 수 있다고 한다. 그래서 아주 작은 수를 더해줘서 그 손실을 막는다고 한다. (사실 생각하지 못했고 어려웠다.)

 

CODE

import sys
input = sys.stdin.readline
import copy

if __name__ == "__main__":
    n, k = map(int, input().split())
    S = sorted([float(input()) for _ in range(n)])

    t = sum(S[k:n-k])/(n-2*k)
    if k ==0:
        print(f"{t:.2f}")
        print(f"{t:.2f}")
        exit()
    C = sorted(copy.deepcopy(S))
    for i in range(k):
        C[i] = C[k]
        C[-i-1] = C[-k-1]
    b = sum(C)/n
    t += 0.00000001
    b += 0.00000001
    print(f"{t:.2f}")
    print(f"{b:.2f}")
728x90
반응형

댓글