알고리즘 문제풀이

부분합[백준 1806]

wiojfe 2024. 5. 17. 15:18

https://www.acmicpc.net/problem/1806

 

배열 첫 번째 숫자부터 계속 오른쪽으로 window를 늘려가지만, 목표 합 s보다 큰 경우는 window 사이즈를 줄이기 위해 앞 부분인 start를 한 칸 이동한다. 

 

def min_subarray_length(n, s, arr):
    start, end = 0, 0
    current_sum = 0
    min_length = float('inf')
    
    while end < n:
        # 윈도우 확장
        current_sum += arr[end]
        end += 1
        
        # 조건 만족 시 윈도우 축소
        while current_sum >= s:
            min_length = min(min_length, end - start)
            current_sum -= arr[start]
            start += 1
    
    return min_length if min_length != float('inf') else 0

# 예제 입력
n,s=map(int,input().split())
arr=list(map(int,input().split()))


# 함수 호출
result = min_subarray_length(n, s, arr)
print(result)  # 출력: 2