[๋ฐฑ์ค€-2343] ๊ธฐํƒ€ ๋ ˆ์Šจ / Python

๐Ÿ“š Problem Solving/Baekjoon

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

 

2343๋ฒˆ: ๊ธฐํƒ€ ๋ ˆ์Šจ

๊ฐ•ํ† ๋Š” ์ž์‹ ์˜ ๊ธฐํƒ€ ๋ ˆ์Šจ ๋™์˜์ƒ์„ ๋ธ”๋ฃจ๋ ˆ์ด๋กœ ๋งŒ๋“ค์–ด ํŒ๋งคํ•˜๋ ค๊ณ  ํ•œ๋‹ค. ๋ธ”๋ฃจ๋ ˆ์ด์—๋Š” ์ด N๊ฐœ์˜ ๋ ˆ์Šจ์ด ๋“ค์–ด๊ฐ€๋Š”๋ฐ, ๋ธ”๋ฃจ๋ ˆ์ด๋ฅผ ๋…นํ™”ํ•  ๋•Œ, ๋ ˆ์Šจ์˜ ์ˆœ์„œ๊ฐ€ ๋ฐ”๋€Œ๋ฉด ์•ˆ ๋œ๋‹ค. ์ˆœ์„œ๊ฐ€ ๋’ค๋ฐ”๋€Œ๋Š” ๊ฒฝ

www.acmicpc.net

n, m = map(int, input().split())
data = list(map(int, input().split()))
left, right = max(data), sum(data)

while left <= right:
    mid = (left + right) // 2
    cnt = 0
    temp = 0
    for i in range(n):
        if temp + data[i] > mid:
            cnt += 1
            temp = 0
        temp += data[i]

    cnt += 1 if temp else 0

    if cnt <= m:
        right = mid - 1
    else:
        left = mid + 1

print(left)

 

ํ•ด์„ค

์˜ค๋žœ๋งŒ์— ์ด๋ถ„ํƒ์ƒ‰ ๋ฌธ์ œ๋ฅผ ํ’€์—ˆ๋Š”๋ฐ ์ด ๋ฌธ์ œ์— ๊ฝค๋‚˜ ์‹œ๊ฐ„์„ ์Ÿ์•˜๋‹ค..๐Ÿ˜ฑ

๋‹ค๋ฅธ ๋ฌธ์ œ๋“ค์— ๋น„ํ•ด ์‹œ๊ฐ„์„ ๋” ์“ด๋งŒํผ ํ™•์‹คํžˆ ์•Œ์•„๊ฐ”๋‹ค.

 

๋ธ”๋ฃจ๋ ˆ์ด์˜ ์ตœ๋Œ€ ๊ธธ์ด๋Š” ๋ฆฌ์ŠคํŠธ์˜ ํ•ฉ, ์ตœ์†Œ ๊ธธ์ด๋Š” ๋ฆฌ์ŠคํŠธ์˜ ์ตœ๋Œ“๊ฐ’์ด๋‹ค.

๋ฆฌ์ŠคํŠธ์— 1 ~ 9๊นŒ์ง€ ์ €์žฅ๋˜์–ด์žˆ๋‹ค๋ฉด ๊ฐ๊ฐ ์ตœ๋Œ€, ์ตœ์†Œ ๊ธธ์ด๋Š” 45์™€ 9๊ฐ€ ๋œ๋‹ค.

์ด ๋•Œ ๋ธ”๋ฃจ๋ ˆ์ด์— ๋“ค์–ด๊ฐˆ ์ˆ˜ ์žˆ๋Š” ๋ ˆ์Šจ์€ 1๊ฐœ, 9๊ฐœ๊ฐ€ ๋  ์ˆ˜ ์žˆ๋‹ค.

 

์œ„์—์„œ ์–ธ๊ธ‰ํ•œ ๋Œ€๋กœ left์™€ right๋ฅผ ์„ค์ •ํ•ด์ฃผ๊ณ  ๋ฐ˜๋ณต๋ฌธ์„ ํ†ตํ•ด ์–ป์–ด์ง„ ๋ฆฌ์ŠคํŠธ์˜ ํ•ฉ์ด mid๋ณด๋‹ค ์ปค์ง€๋ฉด cnt(๋ธ”๋ฃจ๋ ˆ์ด ๊ฐœ์ˆ˜)๋ฅผ 1์”ฉ ์ฆ๊ฐ€์‹œํ‚จ๋‹ค. ์ด๋ ‡๊ฒŒ ์–ป์€ ๋ธ”๋ฃจ๋ ˆ์ด ๊ฐœ์ˆ˜๊ฐ€ m๋ณด๋‹ค ์ž‘์œผ๋ฉด right๋ฅผ ์ค„์—ฌ์ฃผ๊ณ , m๋ณด๋‹ค ํฌ๋‹ค๋ฉด left๋ฅผ ๋Š˜๋ ค์ค€๋‹ค.