728x90
๋ฐ์ํ

๐ป ๋ฌธ์ ์ ์

๊ทธ๋ฆผ๊ณผ ๊ฐ์ด ๊ตฌ์ฌ์ ๊ทธ๋ฃน์ง์ด์ ์ซ์์ ํฉ์ ์ต๋๊ฐ์ ๊ตฌํ ๋, ์ฌ๋ฌ๊ฐ์ง ๊ฒฝ์ฐ์์ ์ต๋๊ฐ์ด ์ต์๊ฐ ๋๋ ๊ฒฝ์ฐ๋ 17์ด๋ค.
๊ฐ ๊ทธ๋ฃน์ ํฉ ์ค ์ต๋๊ฐ์ด ์ต์๊ฐ ๋๋๋ก M๊ฐ์ ๊ทธ๋ฃน์ผ๋ก ๋๋์์ ๋, ๊ทธ ์ต๋๊ฐ๊ณผ ๊ฐ ๊ทธ๋ฃน์ ๊ตฌ์ฑํ๋ ๊ตฌ์ฌ์ ๊ฐ์๋ฅผ ์ฐพ์ ์ถ๋ ฅํ๋ ํ๋ก๊ทธ๋จ์ ์์ฑํ์์ค.
๐๏ธ ์ต์ข ์ ์ถ ์ฝ๋
# 2613 ์ซ์๊ตฌ์ฌ
# "๊ฐ ๊ทธ๋ฃน ํฉ์ด mid ์ดํ๊ฐ ๋๋๋ก M๊ฐ ์ดํ ๊ทธ๋ฃน์ผ๋ก ๋๋ ์ ์๋์ง" ํ์ธ
def check(mid):
count = 1 # ํ์ฌ ๊ทธ๋ฃน์ ๊ฐฏ์
s = 0 # ํ์ฌ ๊ทธ๋ฃน์ ํฉ
for num in numbers:
# ํ์ฌ ๊ทธ๋ฃน์ num์ ๋ํ๋ฉด mid๊ฐ ์ด๊ณผ -> ๊ทธ๋ฃน ์ ์ฆ๊ฐ
if s + num > mid:
count += 1
s = num
# ํ์ฌ ๊ทธ๋ฃน์ ์ซ์ ์ถ๊ฐ
else:
s += num
# ๊ทธ๋ฃน ๊ฐฏ์๊ฐ M๊ฐ ๋ฏธ๋ง์ด๋ฉด True -> ๊ฐ๋ฅํ ์กฐํฉ
return count <= M
N, M = map(int, input().split())
numbers = list(map(int, input().split()))
left = max(numbers)
right = sum(numbers)
while left <= right:
mid = (left+right) // 2
# ํ์ฌ์ ์ค์๊ฐ์ผ๋ก M๊ฐ์ ๊ทธ๋ฃน์ ์์ฑํ ์ ์๋ค๋ฉด, ๋ ์์ ๊ฐ์ผ๋ก๋ ๊ฐ๋ฅํ์ง ํ์ธ
if check(mid):
right = mid - 1
# ์๋๋ฉด ๊ฐ์ ํค์ด๋ค.
else:
left = mid + 1
# ์ด๋ถํ์ ์ข
๋ฃ ํ left์ ๊ฐ = ์ต์ ์ ๊ฐ
answer = left
print(answer)
groups = []
s = 0 # ํ์ฌ ๊ทธ๋ฃน ํฉ
cnt = 0 # ํ์ฌ ๊ทธ๋ฃน ๊ตฌ์ฌ ๊ฐ์
for num in numbers:
# ํ์ฌ ๊ทธ๋ฃน์ num์ ๋ํ์ ๋,
if s + num > answer:
# answer๋ฅผ ๋๋๋ค๋ฉด ์ง๊ธ๊น์ง์ ๊ทธ๋ฃน์ ํ์
groups.append(cnt)
# ์๋ก์ด ๊ทธ๋ฃน ์์ฑ
s = num
cnt = 1
# answer๋ณด๋ค ์๋ค๋ฉด ํ์ฌ ๊ทธ๋ฃน์ ๊ณ์ ๋ํด์ค
else:
s += num
cnt += 1
# ๋ง์ง๋ง ๊ทธ๋ฃน ์ถ๊ฐ
groups.append(cnt)
# ํ์ฌ ๊ทธ๋ฃน์ ๊ฐ์๊ฐ M๊ฐ ๋ณด๋ค ์๋ค๋ฉด, ๊ตฌ์ฌ์ด 2๊ฐ ์ด์์ธ ๊ทธ๋ฃน์์ ๋ถํ ํ์ฌ ๊ทธ๋ฃน์ ๊ฐ์๋ฅผ M๊ฐ๋ก ๋ง์ถฐ์ค
while len(groups) < M:
for i in range(len(groups)):
if groups[i] > 1:
# ๊ทธ๋ฃน์ ํ๋ ๋ถ๋ฆฌ
groups[i] -= 1
# ์์ ์๋ก์ด ๊ทธ๋ฃน ์ถ๊ฐ
groups.insert(i, 1)
break
print(*groups)
๐ญ ์ค๋์ ํ๊ณ
728x90
๋ฐ์ํ
'Coding-Test > ๋ฐฑ์ค' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
| [Python] 11049 ํ๋ ฌ ๊ณฑ์ ์์ (0) | 2026.03.20 |
|---|---|
| [Python] 16947 ์์ธ ์งํ์ฒ 2ํธ์ (0) | 2026.03.19 |
| [Python] 16946 ๋ฒฝ ๋ถ์๊ณ ์ด๋ํ๊ธฐ 4 (0) | 2026.03.17 |
| [Python] 1765 ๋ญ์ธ์ ํ ์ ํ๊ธฐ (0) | 2026.03.03 |
| [Python] 2636 ์น์ฆ (0) | 2026.03.03 |