Coding Test/BaekJoon_Python

백준 2003 <수들의 합 2> Python

JunOnJuly 2023. 11. 10. 21:15
728x90

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

 

2003번: 수들의 합 2

첫째 줄에 N(1 ≤ N ≤ 10,000), M(1 ≤ M ≤ 300,000,000)이 주어진다. 다음 줄에는 A[1], A[2], …, A[N]이 공백으로 분리되어 주어진다. 각각의 A[x]는 30,000을 넘지 않는 자연수이다.

www.acmicpc.net


 

 

백준 2230 <수 고르기>

https://www.acmicpc.net/problem/2230 2230번: 수 고르기 N개의 정수로 이루어진 수열 A[1], A[2], …, A[N]이 있다. 이 수열에서 두 수를 골랐을 때(같은 수일 수도 있다), 그 차이가 M 이상이면서 제일 작은 경우

dev-diary-0717.tistory.com

 

전형적인 투포인터 문제로 2230 번 문제에서 조건만 달라진 문제입니다.


def solution(N, M, data_list):
    # 누적합을 편하게 만들기 위해 0 추가
    data_list = [0] + data_list
    # 누적합 생성
    for idx in range(1, len(data_list)):
        # 누적합
        data_list[idx] += data_list[idx-1]
    # 투포인터
    start = 0
    end = 1
    # 카운트
    cnt = 0
    while True:
        # end 가 인덱스를 벗어나면
        if end >= len(data_list):
            return cnt
        # 포인터 값
        start_value = data_list[start]
        end_value = data_list[end]
        # 누적합
        subsum = end_value - start_value
        # 누적합이 목표값보다 크면
        if subsum > M:
            start += 1
            continue
        # 누적합이 목표값보다 작으면
        elif subsum < M:
            end += 1
            continue
        # 누적합이 목표값이면
        else:
            cnt += 1
            end += 1
            continue


N, M = map(int, input().split())
data_list = list(map(int, input().split()))
print(solution(N, M, data_list))

 

728x90