๐ก ์กฐ๊ฑด
- ํ์ฐ๋ ์์ผ๋ก N์ผ ๋์ ์์ ์ด ์ฌ์ฉํ ๊ธ์ก์ ๊ณ์ฐํ์๊ณ , ๋์ ํํ ์ฐ์ง ์๊ธฐ ์ํด ์ ํํ M๋ฒ๋ง ํต์ฅ์์ ๋์ ๋นผ์ ์ฐ๊ธฐ๋ก ํ์๋ค.
- ํ์ฐ๋ ํต์ฅ์์ K์์ ์ธ์ถํ๋ฉฐ, ํต์ฅ์์ ๋บ ๋์ผ๋ก ํ๋ฃจ๋ฅผ ๋ณด๋ผ ์ ์์ผ๋ฉด ๊ทธ๋๋ก ์ฌ์ฉํ๊ณ ,
๋ชจ์๋ผ๊ฒ ๋๋ฉด ๋จ์ ๊ธ์ก์ ํต์ฅ์ ์ง์ด๋ฃ๊ณ ๋ค์ K์์ ์ธ์ถํ๋ค.
- ๋ค๋ง ํ์ฐ๋ M์ด๋ผ๋ ์ซ์๋ฅผ ์ข์ํ๊ธฐ ๋๋ฌธ์, ์ ํํ M๋ฒ์ ๋ง์ถ๊ธฐ ์ํด์ ๋จ์ ๊ธ์ก์ด ๊ทธ๋ ์ฌ์ฉํ ๊ธ์ก๋ณด๋ค
๋ง๋๋ผ๋ ๋จ์ ๊ธ์ก์ ํต์ฅ์ ์ง์ด๋ฃ๊ณ ๋ค์ K์์ ์ธ์ถํ ์ ์๋ค.
- ํ์ฐ๋ ๋์ ์๋ผ๊ธฐ ์ํด ์ธ์ถ ๊ธ์ก K๋ฅผ ์ต์ํํ๊ธฐ๋ก ํ์๋ค. ํ์ฐ๊ฐ ํ์ํ ์ต์ ๊ธ์ก K๋ฅผ ๊ณ์ฐํ๋ ๋ฌธ์ .
- 1๋ฒ์งธ ์ค์๋ N๊ณผ M์ด ๊ณต๋ฐฑ์ผ๋ก ์ฃผ์ด์ง๋ค. (1 โค N โค 100,000, 1 โค M โค N)
2๋ฒ์งธ ์ค๋ถํฐ ์ด N๊ฐ์ ์ค์๋ ํ์ฐ๊ฐ i๋ฒ์งธ ๋ ์ ์ด์ฉํ ๊ธ์ก์ด ์ฃผ์ด์ง๋ค. (1 โค ๊ธ์ก โค 10000)
์ฒซ ๋ฒ์งธ ์ค์ ํ์ฐ๊ฐ ํต์ฅ์์ ์ธ์ถํด์ผ ํ ์ต์ ๊ธ์ก K๋ฅผ ์ถ๋ ฅํ๋ค.
- ์ด๋ถํ์ ์ ํ์ ๋ฌธ์
๐ฅ ์์ค ์ฝ๋
from sys import stdin
n, m = map(int, stdin.readline().split())
arr = []
for _ in range(n):
arr.append(int(stdin.readline()))
start = min(arr)
end = sum(arr)
while start <= end:
mid = (start + end) // 2
money = mid
cnt = 1
for i in arr:
if money - i < 0:
money = mid
cnt += 1
money -= i
if cnt > m or mid < max(arr):
start = mid + 1
else:
end = mid - 1
ans = mid
print(ans)
๐ ์์ ๋ฐ ์คํ๊ฒฐ๊ณผ
์์
7 5
100
400
300
100
500
101
400
์คํ๊ฒฐ๊ณผ
500
โจ๏ธ ๋ฌธ์ ํ์ด
- i๋ฒ์งธ ๋ ์ ์ด์ฉํ ๊ธ์ก์ ๋ฆฌ์คํธ์ ์ ์ฅํด์ฃผ๊ณ ๊ฐ์ฅ ์์ ๊ฐ์ start, ๊ฐ์ฅ ํฐ ๊ฐ์ end๋ก ์ค์ ํด์ค๋ค.
- ๊ตฌํ ์ธ์ถ๊ธ์ก์ mid = (start + end) // 2๋ก ์ ํด์ฃผ๊ณ , ์ธ์ถํ ํ์ cnt๋ฅผ 1๋ก ์ค์ ํ๋ค.
- ๋ฆฌ์คํธ๋ฅผ ์ํํ๋ฉด์(x : ํ์ฌ ์ํํ๋ ๋ฆฌ์คํธ์ ์ธ๋ฑ์ค์ ํด๋นํ๋ ๊ธ์ก) ์ต์ ์ธ์ถ๊ธ์ก - x ์ ๊ฐ์ด 0๋ณด๋ค ์์ผ๋ฉด
์ธ์ถ๊ธ์ก money๋ฅผ mid ๋ก ์ ์ฅํ๋ค.
๋ง์ฝ ์ด ์กฐ๊ฑด์ ํด๋นํ์ง ์๋๋ค๋ฉด money - i ๊ฐ์ผ๋ก money๋ฅผ ๊ฐฑ์ ํ๋ค.
- arr ๋ฆฌ์คํธ๋ฅผ ๋ชจ๋ ์ํํ ํ, ์ถ๊ธ ํ์๊ฐ m ์ ๋์ด์ ๊ฒฝ์ฐ ํน์ mid ๊ฐ์ด arr์ ๊ฐ๋ณด๋ค ์์ ๊ฒฝ์ฐ๋
start ๋ฅผ mid + 1 ๊ฐ์ผ๋ก ๊ฐฑ์ ํ๋ค.
- (4)๋ฒ์ ์กฐ๊ฑด์ ํด๋นํ์ง ์๋๋ค๋ฉด, end ๊ฐ์ end - 1 ๋ก ๊ฐฑ์ ํ๋ค.
๋ํ ans์ ๊ฐ์ mid ๋ก ๊ฐฑ์ ํ๋ค.
- ์ด๋ถํ์์ด ๋๋๋ฉด ans ์ ๊ฐ์ ์ถ๋ ฅํ๋ค.