<aside> 💬 lv0, 슬라이딩 윈도우

최대 합계 배열 찾기

문제 설명

정수로 이루어진 배열과 'k' 길이의 윈도우가 주어집니다. 윈도우를 배열 전체에 슬라이드 시켜가며 얻을 수 있는 최대 합계를 갖는 연속 부분 배열의 합을 찾는 코드를 작성해주세요.


제한 사항


입출력 예

입력 (배열, k) 출력 (최대 합계)
([1, 3, 2, 6, -1, 4, 1, 8, 2], 5) 18
([4, 2, 1, 7, 8, 1, 2, 8, 1, 0], 3) 16

입출력 설명

첫 번째 예시에서 배열 [1, 3, 2, 6, -1, 4, 1, 8, 2]에 대해 길이가 5인 윈도우를 사용하여 얻을 수 있는 최대 합계는 [2, 6, -1, 4, 1, 8] 부분 배열의 합 17입니다. 두 번째 예시에서는 [7, 8, 1] 부분 배열의 합이 16으로 최대 합계입니다.

</aside>

😺 풀이 1. sum, max

def solution(data): **#1 함수 정의**
    nums, k = data **#2 데이터 분리**
    
    window_sum = sum(nums[:k]) **#3 윈도우의 초기 합계 계산**
    max_sum = window_sum **#4 최대 합계 초기화**
    
    for i in range(len(nums) - k): **#5 탐색 범위 정의**
        window_sum = window_sum - nums[i] + nums[i + k] **#6 슬라이딩 윈도우**
        max_sum = max(max_sum, window_sum) **#7 최대 합계 갱신**

    return max_sum **#8 최대 합계 반환**

단계별 풀이 전략

  1. 함수 정의

    코드의 첫 부분에서 solution이라는 함수를 정의합니다. 이 함수는 하나의 인자 data를 받습니다. data는 주어진 윈도우 크기의 배열에서 최대 합계를 구하고자 하는 전체 배열과 윈도우 크기를 가집니다.

  2. 데이터 분리

    data에서 전체 배열과 윈도우 크기를 numsk로 언패킹합니다.

  3. 윈도우의 초기 합계 계산

    윈도우 크기 k를 기준으로 초기 합계를 구하기 위해, 배열 nums에서 0을 포함한 k만큼 슬라이싱을 하고 sum 함수를 이용하여 합계를 구합니다. 나온 값을 window_sum에 할당하여 윈도우의 초기 합계를 나타냅니다.

  4. 최대 합계 초기화

    window_summax_sum에 할당하여 최대 합계를 초기화합니다.

  5. 탐색 범위 정의

    탐색 범위는 주어진 배열 nums에서 윈도우 크기 k를 기준으로 슬라이딩을 할 수 있는 횟수에 의해 결정됩니다. 여기서 슬라이딩할 수 있는 횟수는 nums의 길이에서 k를 뺀 값입니다. 그럼 for 문을 통해 i 변수로 탐색할 수 있는 숫자의 범위는 0부터 ‘nums의 길이 - k -1’까지의 숫자가 됩니다.

  6. 슬라이딩 윈도우

    윈도우를 슬라이딩하면서 윈도우 합계 window_sum을 갱신합니다. 윈도우 합계를 갱신하기 위해 기존 윈도우 합계 window_sum에서 배열 numsi 번째 원소를 빼고 배열 numsi+k 번째 원소를 더한 값을 window_sum에 재할당합니다. 그 과정에서 윈도우는 배열 nums 위에서 기존 윈도우의 0번째 원소를 제거하고 기존 윈도우의 마지막 원소 바로 다음에 오는 원소를 더하는 식으로 윈도우가 슬라이딩 됩니다.

  7. 최대 합계 갱신

    max 함수를 이용하여 기존 최대 합계 max_sum과 현재 윈도우 합계 window_sum을 비교한 최댓값을 구합니다. 구한 최댓값을 max_sum에 할당하여 최대 합계를 갱신합니다.

  8. 최대 합계 반환

    for 문을 통해 최종으로 갱신된 최대 합계 max_sum을 반환합니다.

알아둬야 할 개념

슬라이싱


max 함수