© 2025 anveloper.dev
GitHub·LinkedIn·Contact

목차

  • 문제
  • 입력
  • 출력
  • 예제
  • 풀이
  • 코드
  • 복잡도
풀이 목록으로 돌아가기

BOJ 6986 - 절사평균

2025-07-15
BOJ
실버 III
python
원본 문제 보기
구현
정렬

문제

BOJ 6986 - 절사평균

N개의 점수에서 상하위 K개씩 제외한 절사평균과, 극값을 K번째 값으로 대체한 보정평균을 구하라.

입력

점수 수 N, 제외 수 K와 각 점수가 주어진다.

출력

절사평균과 보정평균을 소수점 둘째 자리까지 출력한다.

예제

입력출력
5 1 40 50 60 70 8060.00 60.00

풀이

정렬 후 절사와 보정을 각각 적용하여 평균을 구한다.

  1. 점수를 오름차순 정렬한다
  2. 절사평균: 앞뒤 K개를 제거한 나머지의 평균을 구한다
  3. 보정평균: 앞 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)