chldkato

백준 1654 랜선 자르기 (파이썬) 본문

백준

백준 1654 랜선 자르기 (파이썬)

chldkato 2020. 6. 5. 22:08

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

 

1654번: 랜선 자르기

첫째 줄에는 오영식이 이미 가지고 있는 랜선의 개수 K, 그리고 필요한 랜선의 개수 N이 입력된다. K는 1이상 10,000이하의 정수이고, N은 1이상 1,000,000이하의 정수이다. 그리고 항상 K ≦ N 이다. 그

www.acmicpc.net

1. 이분탐색을 위해 left를 0, right를 입력받은 랜선 길이의 최대값으로 설정한다

2. 만일 mid가 0이면 (left가 0, right가 1일 때) 길이 1로 자르는 경우밖에 없으므로 답을 1로 저장하고 break한다

3. 각 랜선을 mid로 나눴을 때의 몫이 mid 길이로 자를 때 얻을 수 있는 랜선의 개수가 된다

   개수가 n보다 크거나 같으면 ans를 갱신한다

import sys

input = sys.stdin.readline

def f(mid):
    cnt = 0
    for i in range(len(a)):
        cnt += a[i] // mid
    return cnt


k, n = map(int, input().split())

a = []
for _ in range(k):
    a.append(int(input()))

left, right, ans = 0, max(a), 0
while left <= right:
    mid = (left + right) // 2
    if mid == 0:
        ans = 1
        break

    cnt = f(mid)
    if cnt >= n:
        ans = max(ans, mid)
        left = mid + 1
    else:
        right = mid - 1

print(ans)

Comments