문제 개요
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)의 영향을 줄인 평균값을 얻을 때 유용합니다.