πŸ“‹Β λ¬Έμ œ 정보

문제 μš”μ•½

길이가 K인 κ΅¬κ°„μ˜ ν•© 쀑 κ°€μž₯ 큰 값을 좜λ ₯

πŸ€”Β μ•„μ΄λ””μ–΄

핡심 μ•Œκ³ λ¦¬μ¦˜

7개의 μˆ«μžκ°€ μžˆμ„ λ•Œ κ΅¬κ°„μ˜ 크기가 5인 경우 ꡬ간은 λ‹€μŒκ³Ό κ°™λ‹€.

  • 1, 2, 3, 4, 5
  • 2, 3, 4, 5, 6
  • 3, 4, 5, 6, 7

μ΄λ•Œ λ³Όλ“œμ²΄λ‘œ ν‘œμ‹œλœ λΆ€λΆ„μ˜ κ³„μ‚°μ˜ 쀑볡을 λˆ„μ ν•©μœΌλ‘œ κ°œμ„ ν•  수 μžˆλ‹€.

μ˜μ‚¬ μ½”λ“œ

# λˆ„μ ν•©: sums[i] = nums[0] + ... + nums[i]
sums = [0] * (n + 1)
nums = [0] + nums # index νŒ¨λ”©

# λˆ„μ ν•© 계산
for idx in range(1, n + 1):
	sums[idx] = sums[idx - 1] + nums[idx]

# λͺ¨λ“  ꡬ간 쀑 κ°€μž₯ 큰 κ°’ κ΅¬ν•˜κΈ°
for start in ꡬ간이 κ°€λŠ₯ν•œ κ³³:
	# startλΆ€ν„° k개의 ꡬ간합: sums[start + k - 1] - sums[start - 1]

μ‹œκ°„ λ³΅μž‘λ„

  • λˆ„μ ν•© 계산: $O(n)$
  • κ°€μž₯ 큰 ꡬ간 계산: $O(n)$

μ΅œμ’… μ‹œκ°„ λ³΅μž‘λ„: $O(n)$

πŸ–¨οΈΒ μž…μΆœλ ₯ 뢄석

μ‹œκ°„ λ³΅μž‘λ„ 뢄석

  • μˆ˜μ—΄μ˜ μ›μ†Œ κ°œμˆ˜κ°€ μ΅œλŒ€ 10λ§Œκ°œμ΄λ―€λ‘œ $O(nlogn)$μ΄ν•˜μ˜ μ•Œκ³ λ¦¬μ¦˜ μ‚¬μš©

μœ μ˜μ‚¬ν•­

  • k = 3이고 κ΅¬κ°„μ˜ μ‹œμž‘μ€ start이면 κ΅¬κ°„μ˜ 끝은 start + 3 - 1이닀. start + 3이 μ•„λ‹ˆλ‹€.

μΆ”κ°€ ν…ŒμŠ€νŠΈ μΌ€μ΄μŠ€

5 3
1 2 3 4 5
-> 12

πŸ’­Β μƒκ° 정리

λˆ„μ ν•©μ„ ꡬ할 λ•Œ μ•žμ— 0을 νŒ¨λ”©ν•˜λŠ” 이유

λˆ„μ ν•©μ˜ μ •μ˜λŠ” λ‹€μŒκ³Ό κ°™λ‹€.

sums[i] = nums[0] + ... + nums[i]

λˆ„μ ν•©μœΌλ‘œ ꡬ간합을 κ΅¬ν•˜λ €λ©΄ λ‹€μŒκ³Ό κ°™λ‹€.

section(start, end) = sums[end] - sums[start - 1]

μ΄λ•Œ, sumsλ₯Ό 0λΆ€ν„° μ‹œμž‘ν•˜λ©΄ sums[0 - 1] = sums[-1]이 λ°œμƒν•œλ‹€.

μ΄λŸ¬ν•œ 상황을 μ‰½κ²Œ μ²˜λ¦¬ν•˜κΈ° μœ„ν•΄ μ•žμ— 0을 ν•˜λ‚˜ νŒ¨λ”©ν•œλ‹€.

ꡬ간이 κ°€λŠ₯ν•œ 곳의 λ²”μœ„

1번째 μˆ˜λΆ€ν„° n번째 μˆ˜λŠ” range(1, n + 1)둜 ν‘œν˜„ν•  수 μžˆλ‹€.

μ΄λ•Œ, k개의 μ›μ†Œλ₯Ό κ°€μ§ˆ 수 μžˆλŠ” start의 λ²”μœ„λŠ” range(1, n + 1 - (k - 1))이 λœλ‹€.

range(1, n + 1 - k)λŠ” startλ‘œλΆ€ν„° k개 λ–¨μ–΄μ§„ κ³³λ“€μ˜ λͺ¨μŒμ„ λ‚˜νƒ€λ‚΄λ―€λ‘œ λ‹€λ₯΄λ‹€.

πŸ“„Β μ†ŒμŠ€ μ½”λ“œ

import sys

input = sys.stdin.readline
n, k = map(int, input().split())
nums = list(map(int, input().split()))

def solution(n, k, nums):
    nums = [0] + nums
    sums = [0 for _ in range(n + 1)]

    # λˆ„μ ν•© κ΅¬ν•˜κΈ°
    for idx in range(1, n + 1):
        sums[idx] = sums[idx - 1] + nums[idx]

    # λͺ¨λ“  ꡬ간 쀑 κ°€μž₯ 큰 κ°’ κ΅¬ν•˜κΈ°
		answer = float("-inf")
    for idx in range(1, n + 1 - (k - 1)):
        result = sums[idx + k - 1] - sums[idx - 1]
        answer = max(result, answer)

    return answer

print(solution(n, k, nums))