<aside>
💬 lv1
, 탐색
, 슬라이딩 윈도우
정수 배열과 타겟 합 S가 주어집니다. 배열 내 연속된 부분 배열 중에서 그 합이 S 이상이 되는 가장 작은 길이의 부분 배열을 찾아, 그 길이를 반환하는 코드를 작성해주세요. 만약 그러한 부분 배열이 존재하지 않으면 0을 반환합니다.
입력 (배열, 타겟 합 S) | 출력 (최소 길이) |
---|---|
([2, 1, 5, 2, 3, 2], 7) | 2 |
([1, 1, 1, 1, 1, 1, 1], 11) | 0 |
첫 번째 예시에서 배열 [2, 1, 5, 2, 3, 2] 내에서 합이 7 이상이 되는 가장 작은 길이의 부분 배열은 [5, 2]로 길이가 2입니다. 두 번째 예시에서는 합이 11 이상이 되는 부분 배열이 존재하지 않으므로 0을 반환합니다.
</aside>
def solution(data): **#1 함수 정의**
nums, s = data **#2 데이터 분리**
min_length = float("inf") **#3 최소 길이 초기화**
window_sum = 0 **#4 윈도우 합계 초기화**
window_start = 0 **#5 윈도우 시작점 초기화**
for window_end in range(len(nums)): **#6 탐색 범위 정의**
window_sum += nums[window_end] **#7 윈도우 합계 갱신**
while window_sum >= s: **#8 탐색 조건 정의**
min_length = min(min_length, window_end - window_start + 1) **#9 최소 길이 갱신**
window_sum -= nums[window_start] **#10 윈도우 합계 갱신**
window_start += 1 **#11 윈도우 시작점 갱신**
return min_length if min_length != float("inf") else 0 **#12 최소 길이 반환**
함수 정의
코드의 첫 부분에서 solution
이라는 함수를 정의합니다. 이 함수는 하나의 인자 data
를 받습니다. data
는 배열과 타겟 합입니다.
데이터 분리
data
의 배열과 타겟 합을 nums
, s
로 언패킹합니다.
최소 길이 초기화
타겟 합 s
이상이 되는 가장 작은 배열의 길이를 양의 무한대 float(”inf”)
로 초기화합니다.
윈도우 합계 초기화
window_sum
에 0을 할당하여 윈도우 합계의 초깃값을 지정합니다.
윈도우 시작점 초기화
window_start
에 0을 할당하여 윈도우 시작점의 초깃값을 지정합니다.
탐색 범위 정의
for window_end in range(len(nums)):
에서 nums
의 길이만큼 숫자를 탐색하는 데, 그때 나오는 숫자는 윈도우 종료점 window_end
에 할당됩니다.
윈도우 합계 갱신
배열 nums
에서 window_end
번째 원소를 구하고 그 값을 기존 윈도우 합계 windows_sum
에 더합니다.
탐색 조건 정의
갱신된 윈도우 합계 window_sum
은 반복문의 조건에 이용됩니다. 만일 window_sum
이 타겟 합 s
보다 큰 경우 반복문을 실행하면서 최소 길이 탐색을 진행합니다.
최소 길이 갱신
이전 과정들에서 이미 윈도우 시작점 window_start
와 윈도우 종료점 window_end
가 갱신되었습니다. 현재 윈도우의 길이는 ‘window_end
- window_start
+ 1’로 정의할 수 있습니다. 구한 윈도우의 길이는 min
함수를 통해 기존 최소 길이 min_length
와 비교되어 최솟값이 나오게 됩니다. 이때 나온 최솟값은 min_length
에 할당되어 최소 길이가 갱신됩니다.
윈도우 합계 갱신
윈도우가 슬라이딩 되면서 윈도우 시작점은 제거되기 때문에, 기존 윈도우 합계 window_sum
에서 배열 nums
의 window_start
번째 원소를 뺍니다.
윈도우 시작점 갱신
그리고 윈도우가 슬라이딩 되면서 시작점은 1 증가하게 됩니다. 그러므로 윈도우 시작점 window_start
에 1을 더해 윈도우 시작점을 갱신합니다. 이후 반복문이 다시 시작되면 갱신된 윈도우 시작점을 기준으로 윈도우 길이 또한 변화하며, 최소 길이 min_length
와 윈도우 합계 window_sum
이 갱신됩니다.
최소 길이 반환
return min_length if min_length != float("inf") else 0
과 같이 삼항 연산자를 사용하여 배열 nums
내 연속된 부분의 배열 합이 타겟 합 s
보다 큰 경우 최소 거리 min_length
를 반환하고 그렇지 않은 경우에는 최소 길이가 float("inf")
로 고정되기 때문에 0을 반환합니다.
무한대
float(’inf’)
또는 float(’-inf’)