<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>

😺 풀이 1. 무한대, min

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 최소 길이 반환**

단계별 풀이 전략

  1. 함수 정의

    코드의 첫 부분에서 solution이라는 함수를 정의합니다. 이 함수는 하나의 인자 data를 받습니다. data는 배열과 타겟 합입니다.

  2. 데이터 분리

    data의 배열과 타겟 합을 nums, s로 언패킹합니다.

  3. 최소 길이 초기화

    타겟 합 s 이상이 되는 가장 작은 배열의 길이를 양의 무한대 float(”inf”)로 초기화합니다.

  4. 윈도우 합계 초기화

    window_sum에 0을 할당하여 윈도우 합계의 초깃값을 지정합니다.

  5. 윈도우 시작점 초기화

    window_start에 0을 할당하여 윈도우 시작점의 초깃값을 지정합니다.

  6. 탐색 범위 정의

    for window_end in range(len(nums)):에서 nums 의 길이만큼 숫자를 탐색하는 데, 그때 나오는 숫자는 윈도우 종료점 window_end에 할당됩니다.

  7. 윈도우 합계 갱신

    배열 nums에서 window_end 번째 원소를 구하고 그 값을 기존 윈도우 합계 windows_sum에 더합니다.

  8. 탐색 조건 정의

    갱신된 윈도우 합계 window_sum은 반복문의 조건에 이용됩니다. 만일 window_sum이 타겟 합 s보다 큰 경우 반복문을 실행하면서 최소 길이 탐색을 진행합니다.

  9. 최소 길이 갱신

    이전 과정들에서 이미 윈도우 시작점 window_start와 윈도우 종료점 window_end가 갱신되었습니다. 현재 윈도우의 길이는 ‘window_end - window_start + 1’로 정의할 수 있습니다. 구한 윈도우의 길이는 min 함수를 통해 기존 최소 길이 min_length와 비교되어 최솟값이 나오게 됩니다. 이때 나온 최솟값은 min_length에 할당되어 최소 길이가 갱신됩니다.

  10. 윈도우 합계 갱신

    윈도우가 슬라이딩 되면서 윈도우 시작점은 제거되기 때문에, 기존 윈도우 합계 window_sum에서 배열 numswindow_start 번째 원소를 뺍니다.

  11. 윈도우 시작점 갱신

    그리고 윈도우가 슬라이딩 되면서 시작점은 1 증가하게 됩니다. 그러므로 윈도우 시작점 window_start에 1을 더해 윈도우 시작점을 갱신합니다. 이후 반복문이 다시 시작되면 갱신된 윈도우 시작점을 기준으로 윈도우 길이 또한 변화하며, 최소 길이 min_length와 윈도우 합계 window_sum이 갱신됩니다.

  12. 최소 길이 반환

    return min_length if min_length != float("inf") else 0과 같이 삼항 연산자를 사용하여 배열 nums 내 연속된 부분의 배열 합이 타겟 합 s보다 큰 경우 최소 거리 min_length를 반환하고 그렇지 않은 경우에는 최소 길이가 float("inf")로 고정되기 때문에 0을 반환합니다.

알아둬야 할 개념

무한대