μ•Œκ³ λ¦¬μ¦˜/μˆ˜ν•™

[λ°±μ€€ 2559 πŸ₯ˆ] μˆ˜μ—΄

1eehyunji 2023. 7. 31. 22:23

문제

맀일 μ•„μΉ¨ 9μ‹œμ— ν•™κ΅μ—μ„œ μΈ‘μ •ν•œ μ˜¨λ„κ°€ μ–΄λ–€ μ •μˆ˜μ˜ μˆ˜μ—΄λ‘œ μ£Όμ–΄μ‘Œμ„ λ•Œ, 연속적인 λ©°μΉ  λ™μ•ˆμ˜ μ˜¨λ„μ˜ 합이 κ°€μž₯ 큰 값을 μ•Œμ•„λ³΄κ³ μž ν•œλ‹€.

예λ₯Ό λ“€μ–΄, μ•„λž˜μ™€ 같이 10일 κ°„μ˜ μ˜¨λ„κ°€ μ£Όμ–΄μ‘Œμ„ λ•Œ,

3 -2 -4 -9 0 3 7 13 8 -3

λͺ¨λ“  연속적인 μ΄ν‹€κ°„μ˜ μ˜¨λ„μ˜ 합은 μ•„λž˜μ™€ κ°™λ‹€.

 

μ΄λ•Œ, μ˜¨λ„μ˜ 합이 κ°€μž₯ 큰 값은 21이닀.

또 λ‹€λ₯Έ 예둜 μœ„μ™€ 같은 μ˜¨λ„κ°€ μ£Όμ–΄μ‘Œμ„ λ•Œ, λͺ¨λ“  연속적인 5일 κ°„μ˜ μ˜¨λ„μ˜ 합은 μ•„λž˜μ™€ κ°™μœΌλ©°,

 

μ΄λ•Œ, μ˜¨λ„μ˜ 합이 κ°€μž₯ 큰 값은 31이닀.

맀일 μΈ‘μ •ν•œ μ˜¨λ„κ°€ μ •μˆ˜μ˜ μˆ˜μ—΄λ‘œ μ£Όμ–΄μ‘Œμ„ λ•Œ, 연속적인 λ©°μΉ  λ™μ•ˆμ˜ μ˜¨λ„μ˜ 합이 κ°€μž₯ 큰 값을 κ³„μ‚°ν•˜λŠ” ν”„λ‘œκ·Έλž¨μ„ μž‘μ„±ν•˜μ‹œμ˜€.

μž…λ ₯

첫째 μ€„μ—λŠ” 두 개의 μ •μˆ˜ Nκ³Ό Kκ°€ ν•œ 개의 곡백을 사이에 두고 μˆœμ„œλŒ€λ‘œ μ£Όμ–΄μ§„λ‹€. 첫 번째 μ •μˆ˜ N은 μ˜¨λ„λ₯Ό μΈ‘μ •ν•œ 전체 λ‚ μ§œμ˜ μˆ˜μ΄λ‹€. N은 2 이상 100,000 μ΄ν•˜μ΄λ‹€. 두 번째 μ •μˆ˜ KλŠ” 합을 κ΅¬ν•˜κΈ° μœ„ν•œ 연속적인 λ‚ μ§œμ˜ μˆ˜μ΄λ‹€. KλŠ” 1κ³Ό N μ‚¬μ΄μ˜ μ •μˆ˜μ΄λ‹€. λ‘˜μ§Έ μ€„μ—λŠ” 맀일 μΈ‘μ •ν•œ μ˜¨λ„λ₯Ό λ‚˜νƒ€λ‚΄λŠ” N개의 μ •μˆ˜κ°€ λΉˆμΉΈμ„ 사이에 두고 μ£Όμ–΄μ§„λ‹€. 이 μˆ˜λ“€μ€ λͺ¨λ‘ -100 이상 100 μ΄ν•˜μ΄λ‹€.

좜λ ₯

첫째 μ€„μ—λŠ” μž…λ ₯λ˜λŠ” μ˜¨λ„μ˜ μˆ˜μ—΄μ—μ„œ 연속적인 K일의 μ˜¨λ„μ˜ 합이 μ΅œλŒ€κ°€ λ˜λŠ” 값을 좜λ ₯ν•œλ‹€.

예제 μž…λ ₯ 1

10 2
3 -2 -4 -9 0 3 7 13 8 -3

예제 좜λ ₯ 1 

21

예제 μž…λ ₯ 2

10 5
3 -2 -4 -9 0 3 7 13 8 -3

예제 좜λ ₯ 2

31

 

λ¬Έμ œν’€μ΄

import sys
from collections import deque

n,k=map(int, sys.stdin.readline().split(' '))
numbers=list(map(int, sys.stdin.readline().split(' ')))

# init
knumbers=deque(numbers[:k])
cur_sum=sum(knumbers)
max_value=cur_sum
for i in range(k, n):
    cur_sum-=knumbers.popleft()
    cur_sum+=numbers[i]
    knumbers.append(numbers[i])
    max_value=max(max_value, cur_sum)

print(max_value)

λ‹¨μˆœνžˆ λͺ¨λ“  k개의 연속 μˆ˜μ—΄μ„ νƒμƒ‰ν•˜κΈ° μœ„ν•΄ μŠ¬λΌμ΄μ‹±ν•˜λŠ” 방식은 N이 μ΅œλŒ€ 100,000개이고 

list[a:b]λ₯Ό κ΅¬ν•˜λŠ” 경우 μ‹œκ°„λ³΅μž‘λ„κ°€ O(b-a)만큼 λ“€κΈ° λ•Œλ¬Έμ— μ‹œκ°„ μ΄ˆκ³Όκ°€ λ°œμƒν•  거라고 μƒκ°ν–ˆλ‹€. 

 

κ·Έλž˜μ„œ knumbers에 μ²˜μŒλΆ€ν„° k개의 μ›μ†Œλ₯Ό 넣어두고, for문을 λŒλ©΄μ„œ 제일 μ•ž λ°μ΄ν„°λŠ” λΉΌμ£Όκ³ , 제일 뒀에 λ‹€μŒ 데이터λ₯Ό λ„£μ–΄μ£Όλ©΄μ„œ max_valueλ₯Ό 더 큰 κ°’μœΌλ‘œ μ—…λ°μ΄νŠΈν•˜λŠ” 방식을 μ‚¬μš©ν–ˆλ‹€.