λ³Έλ¬Έ λ°”λ‘œκ°€κΈ°
πŸš€ Development/Problem Solving

[λ°±μ€€] 2559번 μˆ˜μ—΄ - 파이썬 Python 풀이

by Jay Din 2023. 6. 2.
728x90
λ°˜μ‘ν˜•

 

λ°˜μ‘ν˜•

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

 

2559번: μˆ˜μ—΄

첫째 μ€„μ—λŠ” 두 개의 μ •μˆ˜ Nκ³Ό Kκ°€ ν•œ 개의 곡백을 사이에 두고 μˆœμ„œλŒ€λ‘œ 주어진닀. 첫 번째 μ •μˆ˜ N은 μ˜¨λ„λ₯Ό μΈ‘μ •ν•œ 전체 λ‚ μ§œμ˜ μˆ˜μ΄λ‹€. N은 2 이상 100,000 μ΄ν•˜μ΄λ‹€. 두 번째 μ •μˆ˜ KλŠ” 합을 κ΅¬ν•˜κΈ°

www.acmicpc.net

 

1. 문제 

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

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

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

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

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

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

μž…λ ₯

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

좜λ ₯

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

2. 문제 μ ‘κ·Ό

그림의 ν˜•νƒœμ™€ μ£Όμ–΄μ§€λŠ” 쑰건을 μ‹œκ°„λ³΅μž‘λ„ 계산을 톡해 DP λ¬Έμ œλΌλŠ” 것을 μ•Œ 수 μžˆμ—ˆλ‹€.

λ•Œλ¬Έμ— O(n) μ‹œκ°„λ³΅μž‘λ„λ‘œ 문제λ₯Ό ν•΄κ²°ν•΄μ•Όν–ˆλ‹€.

 

μž…λ ₯ κ°’

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

일 λ•Œ

λˆ„μ ν•©μ„ κ΅¬ν•œλ‹€.

[0, 3, 1, -3, -12, -12, -9, -2, 11, 19, 16]

이 λ‚˜μ˜¨λ‹€. 0λ²ˆμ§ΈλŠ” 0으둜 빈 값을 두고 1λΆ€ν„° nκΉŒμ§€ κ΅¬ν•œλ‹€.

κ·Έ λ‹€μŒ 

dp[i] - dp[i-k]

점화식을 톡해 k일의 μ˜¨λ„μ˜ 합을 ꡬ할 수 μžˆλ‹€.

μœ„μ— μ˜ˆμ‹œλ‘œ λ§Œμ•½ 4일 5일의 μ˜¨λ„μ˜ 합을 κ΅¬ν•œλ‹€λ©΄ dp[5] - dp[5-2]

즉, -12--3 = -9λ₯Ό ꡬ할 수 μžˆλ‹€.

이런 λ°©μ‹μœΌλ‘œ kλΆ€ν„° n+1κΉŒμ§€ K일의 μ˜¨λ„μ˜ 합이 μ΅œλŒ€κ°€ λ˜λŠ” 값을 κ΅¬ν•œλ‹€.

 

3. ν‹€λ¦° λΆ€λΆ„

μ²˜μŒμ— μ œμΆœν•œ μ½”λ“œλ‹€.

import sys
input = sys.stdin.readline

n, k = map(int, input().split())
graph = list(map(int, input().split()))
dp = [0]*(n+1)

for i in range(1, n+1):
    dp[i]=dp[i-1]+graph[i-1]

answer = 0
for i in range(k, n+1):
    answer = max(answer, dp[i]-dp[i-k])

# print(dp)
print(answer)

예제의 닡은 제둜 λ‚˜μ™”μ§€λ§Œ ν‹€λ Έλ‹€.

μ΄μœ λŠ” 닡이 음수일 수 있기 λ•Œλ¬Έμ— answer의 μ΄ˆκΈ°κ°’μ„ 0으둜 ν•˜λ©΄ μ•ˆλ˜λ‹€.

 

λ§Œμ•½μ— μž…λ ₯이

7 6
-100 -100 -100 -100 -100 -100 -100

주어진닀면, 0을 좜λ ₯ν•œλ‹€. ν•˜μ§€λ§Œ 닡은 -600이닀.

λ•Œλ¬Έμ— answer을 음수 μ΅œμ†Œκ°’μœΌλ‘œ μ΄ˆκΈ°ν™” ν•΄μ•Όλœλ‹€. 

 

λ°˜μ‘ν˜•

 

4. μ •λ‹΅

import sys
input = sys.stdin.readline

n, k = map(int, input().split())
graph = list(map(int, input().split()))
dp = [0]*(n+1)

for i in range(1, n+1):
    dp[i]=dp[i-1]+graph[i-1]

## 핡심
answer = -sys.maxsize
for i in range(k, n+1):
    answer = max(answer, dp[i]-dp[i-k])

# print(dp)
print(answer)

 

728x90
λ°˜μ‘ν˜•