정수로 이루어진 리스트가 주어졌을 때, 리스트 안에서 가장 큰 N개의 요소를 찾아내는 것이 이번 포스팅의 목표입니다. 예를 들어 리스트에서 두 번째로 큰 값이나 상위 5개의 값 등을 추출해야 하는 경우에 유용하게 활용할 수 있습니다.
예제
입력 : [40, 5, 10, 20, 9] N = 2 출력 : [40, 20]
알고리즘
1단계 : 정수 리스트와 찾고자 하는 최댓값의 개수 N을 입력받습니다.
2단계 : 리스트를 N번 반복하여 순회합니다.
3단계 : 매 순회마다 현재 남은 요소 중 최댓값을 찾아 새로운 리스트에 저장하고,
해당 값을 원래 리스트에서 제거합니다.
구현 코드
def Nnumberele(list1, N):
new_list = []
for i in range(0, N):
max1 = 0
for j in range(len(list1)):
if list1[j] > max1:
max1 = list1[j]
list1.remove(max1)
new_list.append(max1)
print("Largest numbers are ", new_list)
# 드라이버 코드
my_list = [12, 61, 41, 85, 40, 13, 77, 65, 100]
N = 4
# 함수 호출
Nnumberele(my_list, N)
실행 결과
Largest numbers are [100, 85, 77, 65]
동작 원리 살펴보기
이 코드는 다음과 같은 방식으로 동작합니다.
- 외부 반복문 : 총 N번 실행되며, 한 번 실행될 때마다 하나의 최댓값을 추출합니다.
- 내부 반복문 : 리스트 전체를 탐색하면서 현재까지 발견된 최댓값보다 큰 요소가 있으면 그 값으로 갱신합니다.
- remove()와 append() : 찾은 최댓값은 결과 리스트(new_list)에 추가되고, 중복 계산을 피하기 위해 원본 리스트에서는 삭제됩니다.
결과적으로 가장 큰 값부터 차례대로 N개의 요소가 내림차순으로 저장된 리스트를 얻게 됩니다.
더 간단한 방법 : heapq 모듈 활용하기
파이썬에서는 표준 라이브러리인 heapq 모듈의 nlargest() 함수를 사용하면 위 과정을 단 한 줄로 처리할 수 있습니다. 데이터가 많을 경우 성능 면에서도 유리합니다.
import heapq
my_list = [12, 61, 41, 85, 40, 13, 77, 65, 100]
N = 4
result = heapq.nlargest(N, my_list)
print("Largest numbers are ", result)
# 출력 : Largest numbers are [100, 85, 77, 65]
heapq.nlargest(N, iterable)은 주어진 반복 가능한 객체에서 가장 큰 N개의 요소를 내림차순 리스트로 반환해 주므로, 실무에서는 이 방법을 사용하는 것을 권장합니다.