[백준/BOJ][Python] 25916번 싫은데요

Eunding·2024년 11월 15일
0

algorithm

목록 보기
32/107

25916번 싫은데요

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


아이디어

처음에 부분합을 구할 때

temp = sum(ham[start:end+1])

이런 식으로 구했다가 매번 합을 처리해줘야해서 시간 초과가 났다.

투포인터 알고리즘으로 합이 m보다 크면 start + 1하고 작으면 end + 1하면 된다.
다음은 투포인터의 기본 알고리즘 구조이다.

# start를 차례대로 증가시키며 반복
for start in range(n):
    # end만큼 이동시키기
    while interval_sum < m and end < n:
        interval_sum += data[end]
        end += 1
    # 부분합이 m일 때 카운트 증가
    if interval_sum == m:
        count += 1
    interval_sum -= data[start]

코드

n, m = map(int, input().split())
ham = list(map(int, input().split()))

end = 0
answer = 0
temp = 0

for i in range(n):
    while temp < m and end < n:
        temp += ham[end]
        end += 1

    if temp == m:
        answer = m
        break
    elif temp > m and end <= n:
        answer = max(answer, temp - ham[end-1])
    else:
        answer = max(answer, temp)

    temp -= ham[i]

print(answer)

0개의 댓글