업데이트:

최대 1 분 소요

문제

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

boj2792

풀이

문제는 모든 보석을 학생들에게 나눠줄 때 그 최대값을 가장 낮추면 된다.

탐색할 수 는 나눠줄 보석의 수 이다.
그에 따라서 보석의 개수를 나누어 가면서 탐색해주면 되는데,
이 때 math.ceil을 사용해 해당 수가 홀수인지 짝수인지 고려할 필요 없게 한다.

import sys, math
input = sys.stdin.readline
N, M = map(int, input().split())#학생 수, 색상의 수
gems = [int(input()) for _ in range(M)]#색상별 보석의 수
l,r = 1,max(gems)
flat = sys.maxsize
while True:
    if l > r:
        break

    m = (l+r)//2
    tmp = 0
    for i in gems:
        tmp += math.ceil(i/m)
    if tmp > N:
        l = m+1
    else:
        r = m-1
        flat = min(flat, m)

print(flat)

생각 & 정리

ceil을 생각보다 이용할 경우가 많은데, 앞으로 애용할 것 같다.
ceil은 나머지가 있을 경우 몫에 1을 더해 준다.
소수점 처리 함수에는 ceil 말고도 round, floor이 있는데, 이들은 각각 반올림, 소수점아래 무시로 소수점을 처리한다.

댓글남기기