문제
N개의 점수에서 상하위 K개씩 제외한 절사평균과, 극값을 K번째 값으로 대체한 보정평균을 구하라.
입력
점수 수 N, 제외 수 K와 각 점수가 주어진다.
출력
절사평균과 보정평균을 소수점 둘째 자리까지 출력한다.
예제
| 입력 | 출력 |
|---|---|
5 1 40 50 60 70 80 | 60.00 60.00 |
풀이
정렬 후 절사와 보정을 각각 적용하여 평균을 구한다.
- 점수를 오름차순 정렬한다
- 절사평균: 앞뒤 K개를 제거한 나머지의 평균을 구한다
- 보정평균: 앞 K개를 K+1번째 값으로, 뒤 K개를 N-K번째 값으로 대체한 후 전체 평균을 구한다
핵심 아이디어: 절사평균은 이상치를 제거하고, 보정평균(윈저화 평균)은 이상치를 경계값으로 대체하여 안정적인 평균을 구한다.
코드
import sys
input = sys.stdin.readline
N, K = map(int, input().split())
scores = []
for _ in range(N):
a = float(input())
scores.append(a)
scores.sort()
if K == 0:
print("{:.2f}".format(sum(scores) / len(scores)))
print("{:.2f}".format(sum(scores) / len(scores)))
else:
cut = scores[K:-K]
corrected = scores.copy()
for i in range(K):
corrected[i], corrected[-i - 1] = corrected[K], corrected[-K - 1]
print("{:.2f}".format(sum(cut) / len(cut) + 0.00000001))
print("{:.2f}".format(sum(corrected) / len(corrected) + 0.00000001))복잡도
- 시간: O(N log N)
- 공간: O(N)