Computer >> 컴퓨터 >  >> 프로그래밍 >> Python

파이썬으로 최소·최대 5% 요소를 제거한 후 배열의 평균 구하기

문제 개요

nums라는 배열이 주어졌다고 가정해 보겠습니다. 이때 가장 작은 5%와 가장 큰 5%에 해당하는 요소들을 제거한 뒤, 남은 값들의 평균을 구하는 것이 목표입니다.

예를 들어 입력이 nums = [2,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,8]과 같다면, 가장 작은 값과 가장 큰 값을 제거한 후 남은 값들이 모두 4로 동일하므로 결과는 4.0이 됩니다.

해결 접근 방법

이 문제는 다음 단계를 따라 해결할 수 있습니다.

  • nums 리스트를 오름차순으로 정렬합니다.

  • n := nums의 크기를 저장합니다.

  • per := (n * 5 / 100)의 몫을 계산하여 제거할 요소의 개수를 구합니다.

  • l2 := nums에서 인덱스 per부터 (nums 크기 - per - 1)까지의 부분 배열을 추출합니다. 즉, 양쪽 끝의 5%씩을 잘라낸 중간 부분입니다.

  • x := l2에 포함된 모든 요소의 평균을 계산합니다.

  • x를 반환합니다.

Python 예제 코드

아래 구현 예시를 통해 더 자세히 이해해 보겠습니다.

def solve(nums):
   nums.sort()

   n = len(nums)
   per = int(n*5/100)
   l2 = nums[per:len(nums)-per]

   x = sum(l2)/len(l2)

   return x

nums = [2,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,8]
print(solve(nums))

입력

[2,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,8]

출력

4.0

코드 동작 원리

위 코드가 어떻게 동작하는지 단계별로 살펴보겠습니다.

  • 정렬: nums.sort()를 호출해 배열을 오름차순으로 정렬합니다. 정렬을 수행해야 최솟값들은 배열의 앞부분에, 최댓값들은 뒷부분에 모이게 되어 손쉽게 제거할 수 있습니다.

  • 제거할 개수 계산: int(n*5/100)으로 전체 요소 수의 5%에 해당하는 개수를 정수로 구합니다. 위 예제에서 n=20이므로 per은 1이 되어, 앞뒤로 각각 1개씩 제거하게 됩니다.

  • 슬라이싱: nums[per:len(nums)-per] 슬라이싱을 통해 앞에서 per개, 뒤에서 per개를 제외한 중간 요소들만 새로운 리스트 l2로 추출합니다.

  • 평균 계산: sum(l2)를 len(l2)로 나누어 남은 요소들의 평균을 구한 뒤 반환합니다.

이 알고리즘은 정렬에 O(n log n)의 시간 복잡도를 가지며, 통계에서 흔히 사용되는 '절사평균(trimmed mean)' 개념을 구현한 것으로, 극단적인 이상치(outlier)의 영향을 줄인 평균값을 얻을 때 유용합니다.