백준 - [16401] 과자 나눠주기

Dean_Kang·2021년 8월 20일
0

백준

목록 보기
27/36
post-thumbnail

문제

명절이 되면, 홍익이 집에는 조카들이 놀러 온다. 떼를 쓰는 조카들을 달래기 위해 홍익이는 막대 과자를 하나씩 나눠준다.

조카들이 과자를 먹는 동안은 떼를 쓰지 않기 때문에, 홍익이는 조카들에게 최대한 긴 과자를 나눠주려고 한다.

그런데 나눠준 과자의 길이가 하나라도 다르면 조카끼리 싸움이 일어난다. 따라서 반드시 모든 조카에게 같은 길이의 막대 과자를 나눠주어야 한다.

M명의 조카가 있고 N개의 과자가 있을 때, 조카 1명에게 줄 수 있는 막대 과자의 최대 길이를 구하라.

단, 막대 과자는 길이와 상관없이 여러 조각으로 나눠질 수 있지만, 과자를 하나로 합칠 수는 없다. 단, 막대 과자의 길이는 양의 정수여야 한다.

코드

import sys
input = sys.stdin.readline

m, n = map(int, input().split())
snacks = list(map(int, input().split()))
snacks.sort()
left = 1
right = snacks[-1]
res = 0
while left <= right:
    mid = (left + right)//2
    cnt =0
    part =0
    for snack in snacks:
        if snack >= mid:
            part = snack //mid
        cnt += part

    if cnt >=m:
        left = mid +1
        res = mid

    else:
        right = mid -1

print(res)

설명

나누어줄 과자의 길이 (1~입력된 과자 중 가장 긴 과자의 길이 )를 left, right로 지정하고 중간값을 지정해 과자를 나누어 준다. 나누어 줄 수 있는 개수를 구해서 나누어 주어야 하는 사람 수보다 크거나 같은 경우라면 res에 mid 값을 저장해주고 탐색이 종료되면 res를 출력해주었다.

profile
for the goal

0개의 댓글