리스트(행렬)를 K 크기의 연속된 하위 리스트(subarray) 합계 중 최댓값을 기준으로 정렬해야 하는 경우가 있습니다. 이럴 때 파이썬에서는 max와 sum 내장 함수를 활용한 사용자 정의 키 함수를 만들어 sort() 메서드에 적용하면 간단하게 해결할 수 있습니다.
예제 코드
아래 예제를 통해 실제 동작 방식을 확인해 보겠습니다.
def sort_matrix_K(my_list):
return max(sum(my_list[index: index + K]) for index in range(len(my_list) - K))
my_list = [[51, 23, 4, 24, 1], [45, 6, 26, 36, 5], [56, 16, 6, 36, 8], [5, 4, 36, 26, 26]]
print("The list is :")
print(my_list)
K = 4
print("The value of K is ")
print(K)
my_list.sort(key=sort_matrix_K)
print("The resultant list is :")
print(my_list)실행 결과
The list is : [[51, 23, 4, 24, 1], [45, 6, 26, 36, 5], [56, 16, 6, 36, 8], [5, 4, 36, 26, 26]] The value of K is 4 The resultant list is : [[5, 4, 36, 26, 26], [51, 23, 4, 24, 1], [45, 6, 26, 36, 5], [56, 16, 6, 36, 8]]
코드 설명
먼저
sort_matrix_K라는 이름의 함수를 정의하고, 리스트를 매개변수로 전달받습니다.함수 내부에서는 리스트를 순회하면서 각 인덱스 위치부터 K개 요소로 이루어진 구간의 합을 계산합니다.
생성자(generator) 표현식으로 구한 모든 구간 합 중에서
max()함수를 통해 최댓값을 추출하여 반환합니다.함수 외부에서는 리스트 안에 여러 개의 리스트가 포함된 2차원 리스트를 정의하고 콘솔에 출력합니다.
K 값(여기서는 4)을 지정한 뒤 콘솔에 함께 출력합니다.
sort()메서드의key인자에 앞서 정의한 함수를 전달하여, 각 내부 리스트의 K 크기 하위 리스트 최대 합을 기준으로 정렬을 수행합니다.마지막으로 정렬된 결과 리스트를 콘솔에 출력합니다.
핵심 포인트
이 방식의 장점은 별도의 반복문 없이 슬라이싱과 생성자 표현식을 조합해 코드를 간결하게 유지할 수 있다는 점입니다. 다만 리스트 길이가 매우 길고 K 값이 클 경우 슬라이싱 연산이 반복되므로 성능이 중요한 환경에서는 누적합(cumulative sum) 기법을 고려하는 것이 좋습니다.