[LeetCode] 209. Minimum Size Subarray Sum

Yunju·2024년 10월 14일
0

첫접근

내가 요전에 풀었던 [LeetCode] Two Integer Sum과 비슷한 풀이과정일것이라고 생각했다.
그러나 천지차이.. 이 문제는 슬라이딩 윈도우로 접근해야한다.
그래서 내가 접근한 방법은 left인덱스를 0으로 선언하고, total값을 0으로 선언하고, res값을 최대 수인 infinite로 먼저 선언해서 min 값으로 res를 비교할때 최소값이 선택되겠끔 했다.
다음으로 range(len(nums))를 사용해서 계속해서 돌면서 total에 nums[r]를 계속해서 더해가면서 target 값이 total값이랑 같을때, result를 비교해서 그 문자열의 길이를 구해야한다.
만약에 total이 target보다 크다면 left포인터를 옆으로 하나씩 옮긴다. (그때 tota에 저장되었던 [l]의 값은 지움

class Solution:
    def minSubArrayLen(self, target: int, nums: List[int]) -> int:
        l=0
        total = 0
        res = float('inf') 
        # 최소값을 구할때 result 값을 float('inf') - 가장 큰 숫자로 저장해줘야 하는 이유 : 나중에 res = min(res, r-l+1)로 최솟값을 구할건데, 0이거나 다른 숫자면 그 숫자가 가장 작은 숫자로 계속해서 나올 수 있음...
        for r in range(len(nums)):
            total += nums[r]
            if target == total:
                res = min(res, r - l + 1) 
            elif total >= target:
                total -= nums[l]
                l += 1 
        return res
        

그렇게 나온게 이런 코드인데,, 에러남...ㅋㅋㅋㅋㅋ

자, 에러를 보니까 return type에서 integer로 예상되어 있고, inf는 float타입이니까 안된다...
오키 그럼 어떻게 해야되는지 GPT한테 물어봄

그래서 밑에

 # 최소 길이가 갱신되지 않았으면 0을 반환
 return res if res != float('inf') else 0

이 코드를 추가함..

그럼에도 불구하고 wrong answer.. 그냥 최소 부분 배열을 찾지 못한거였음.
그럼 어떻게 해야되는가?
--> while문으로 바꾸란다.

class Solution:
    def minSubArrayLen(self, target: int, nums: List[int]) -> int:
        l=0
        total = 0
        res = float('inf') 
        # 최소값을 구할때 result 값을 float('inf') - 가장 큰 숫자로 저장해줘야 하는 이유 : 나중에 res = min(res, r-l+1)로 최솟값을 구할건데, 0이거나 다른 숫자면 그 숫자가 가장 작은 숫자로 계속해서 나올 수 있음...
        for r in range(len(nums)):
            total += nums[r]
            while total >= target:
                res = min(res, r-l+1)
                total -= nums[l]
                l += 1
        
         # 최소 길이가 갱신되지 않았으면 0을 반환
        return res if res != float('inf') else 0

나는 total == target일때만 갱신하는게 아니라 이상!!! 이었다.
(영어가 안되니 겉넘게 되네..)
그런데 , example을 보면 total==target으로 둬도 말이되긴하는데..
그때는

class Solution:
    def minSubArrayLen(self, target: int, nums: List[int]) -> int:
        l = 0  # 왼쪽 포인터
        total = 0  # 현재 부분 배열의 합
        res = float('inf')  # 최소 길이 저장

        for r in range(len(nums)):  # 오른쪽 포인터를 이동하며 배열 탐색
            total += nums[r]  # 합에 현재 값을 추가

            # 합이 정확히 target과 같으면 최소 길이를 갱신
            while total >= target:
                if total == target:  # target과 정확히 같은 경우만 최소 길이를 갱신
                    res = min(res, r - l + 1)  # 최소 길이 갱신
                total -= nums[l]  # 왼쪽 포인터 값을 합에서 빼고
                l += 1  # 왼쪽 포인터 이동

        # 만약 최소 길이가 갱신되지 않았으면 0을 반환
        return res if res != float('inf') else 0

이렇게 if문을 주면 부분배열을 구할 수 있다.

0개의 댓글