백준 16401 : 과자 나눠주기 (Python)

liliili·2022년 10월 15일

백준

목록 보기
4/214

본문 링크

import sys
input=sys.stdin.readline

M,N=map(int,input().split()) #M은 조카의 수 , N은 과자의 수

L=sorted(list(map(int,input().split())))  #과자 리스트


start=1
end=max(L)

while start<=end:

    count=0
    mid=(start+end)//2

    for i in range(len(L)):
        count+=L[i]//mid

    if count>=M:
        start=mid+1
    else:
        end=mid-1

print(end)

📌 시작점과 끝점을 어떻게 잡을것인가?


  • 처음에는 1 ≤ L1, L2, ..., LN ≤ 1,000,000,000 범위를 따라서
    1부터 1,000,000,000로 정했으나 , 최대값은 리스트의 max값으로 설정해도 충분하다.

📌 어떻게 탐색할 것인가?


  • start=1 , end=max(L)로 잡은뒤 , count 변수를 선언해서 모든 리스트에 대해 막대길이를 mid값으로 나눈 몫을 더해준다.

  • 막대길이가 mid값보다 작으면 0이 더해지므로 모든 조카에게 같은 길이의 막대과자를 나눠줄 수 없다면, 0을 알아서 출력한다.

  • 막대길이가 mid값보다 크면 그 몫을 더해주고 count 값이 조카수보다 클때는 막대길이를 너무 작게 짤랐기 때문에 start 값을 증가시킨다.

  • 나눠줄수있는 막대길이의 최대값을 구하기 때문에 end 변수를 출력한다.

0개의 댓글