<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>
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 최대 합계 반환**
함수 정의
코드의 첫 부분에서 solution
이라는 함수를 정의합니다. 이 함수는 하나의 인자 data
를 받습니다. data
는 주어진 윈도우 크기의 배열에서 최대 합계를 구하고자 하는 전체 배열과 윈도우 크기를 가집니다.
데이터 분리
data
에서 전체 배열과 윈도우 크기를 nums
와 k
로 언패킹합니다.
윈도우의 초기 합계 계산
윈도우 크기 k
를 기준으로 초기 합계를 구하기 위해, 배열 nums
에서 0을 포함한 k
만큼 슬라이싱을 하고 sum
함수를 이용하여 합계를 구합니다. 나온 값을 window_sum
에 할당하여 윈도우의 초기 합계를 나타냅니다.
최대 합계 초기화
window_sum
을 max_sum
에 할당하여 최대 합계를 초기화합니다.
탐색 범위 정의
탐색 범위는 주어진 배열 nums
에서 윈도우 크기 k
를 기준으로 슬라이딩을 할 수 있는 횟수에 의해 결정됩니다. 여기서 슬라이딩할 수 있는 횟수는 nums
의 길이에서 k를 뺀 값입니다. 그럼 for
문을 통해 i
변수로 탐색할 수 있는 숫자의 범위는 0부터 ‘nums
의 길이 - k -1’까지의 숫자가 됩니다.
슬라이딩 윈도우
윈도우를 슬라이딩하면서 윈도우 합계 window_sum
을 갱신합니다. 윈도우 합계를 갱신하기 위해 기존 윈도우 합계 window_sum
에서 배열 nums
의 i
번째 원소를 빼고 배열 nums
의 i+k
번째 원소를 더한 값을 window_sum
에 재할당합니다. 그 과정에서 윈도우는 배열 nums
위에서 기존 윈도우의 0번째 원소를 제거하고 기존 윈도우의 마지막 원소 바로 다음에 오는 원소를 더하는 식으로 윈도우가 슬라이딩 됩니다.
최대 합계 갱신
max
함수를 이용하여 기존 최대 합계 max_sum
과 현재 윈도우 합계 window_sum
을 비교한 최댓값을 구합니다. 구한 최댓값을 max_sum
에 할당하여 최대 합계를 갱신합니다.
최대 합계 반환
for
문을 통해 최종으로 갱신된 최대 합계 max_sum
을 반환합니다.
슬라이싱
기본 형태: 객체[시작 인덱스:종료 인덱스:건너뛰는 크기]
또는 배열[시작 인덱스:종료 인덱스:건너뛰는 크기]
개념: 슬라이싱은 객체로부터 객체의 시작 index에서 종료 index 전까지 해당하는 원소를 잘라냅니다.
s = 'Hello World'
s[:2] # 'He'
l = [1, 2, 3, 4]
l[:-1] # [1, 2, 3]
s = 'Hello Python!'
s[6:-1] # 'Python'
l = range(51)
l2 = [i for i in l[::10]]
l2 # [0, 10, 20, 30, 40, 50]
max 함수
max(순회할 수 있는 자료형)
또는 max(값, 값, …)