[Python] 백준 1806 부분합

    n, s = map(int, input().split())
    lst = list(map(int, input().split()))
    
    # 1. 누적합을 구해놓는다
    sum_lst = [0]
    total = 0
    for l in lst:
        total += l
        sum_lst.append(total)
    
    # 누적합 배열이 0부터 시작하기 때문에 
    # start = 1, end = 2 부터 시작하기
    # m은 n+1로 최대값으로 만들어 놓기
    start = 1
    end = 2
    m = n + 1
    
    # 만약 누적합 배열의 첫번째에 내가 찾고자하는 값이 있으면 -> 길이가 1인게 있다는 뜻!
    if sum_lst[1] == s:
        m = 1
    
    # 그런게 없다면
    else:
        # 투포인터로 계속 탐색하기
        while end <= n:
            temp = sum_lst[end] - sum_lst[start-1]
    
            if temp < s:
                end += 1
            
            elif temp >= s:
                m = min(m, end - start + 1)
                start += 1
    
    # 만약 투포인터로 만들 수 있는게 없다면 0 출력하고, 그렇지 않으면 최소길이  출력
    if m == n + 1:
        print(0)
    else:   
        print(m)

    'Algorithm > two pointer' 카테고리의 다른 글

    [Python] BOJ 13422 도둑  (0) 2023.12.06
    [BOJ] 2003번 수들의 합2 - 구간합, 투포인터  (0) 2023.09.22
    [Python] 백준 1806 부분합  (0) 2022.06.06
    [Python] 백준 2230 수 고르기  (0) 2022.06.06

    댓글