
k개의 전선을 가지고 길이가 같은 n개의 전선을 만들어야 한다.cut_line(1, max(line))
1부터 시작 (무조건 최소 단위 가능, ZeroDivisionError 예외 처리)이 방식은 안전하고 단순하지만, 탐색 범위가 넓다는 단점이 있다고 생각했다.
max_length) 설정max_length = sum(line) // n
n개 를 만들수 없으면 그것은 최대 길이가 될 수 없음.n개 미만 생성 min_length) 설정min_num = n // k + 1
min_length = min(line) // min_num + 1
n // k는 최소의 길이에서 최대한을 뽑아 낸다는 가정 하에 각 전선당 최소한으로 만들어야 하는 개수+1은 정수계산으로 인한 보정 값 # 예를 들자:
n = 11, k = 4 → 11 // 4 + 1 = 3 + 1 = 4
→ 각 랜선에서 **최소 4개씩** 만들어야 전체 n개 만족
min(line) // 4 + 1은🔹 논리: “가장 짧은 전선에서 min_num 이상 잘라낸다면, 다른 전선에서도 잘라낼 수 있다”
O(log N)
import sys
input = sys.stdin.readline
k,n = map(int,input().split())
line = [int(input()) for _ in range (k)]
length = 0
def how_many_line(cut_length):
sum = 0
if cut_length == 0 :
return
for x in line :
sum += x//cut_length
if sum >= n :
return True
else :
return False
def cut_line(start,end):
global length호
if start > end :
return
mid = ( start + end ) // 2
#길이를 더 늘려야 하는 상황
if how_many_line(mid) :
length = max(length,mid)
cut_line(mid+1,end)
#길이를 더 줄여야 하는 상황
else :
cut_line(start,mid-1)
# max_length = sum(line) // n
# min_num = n//k + 1
# min_length = min(line) // min_num + 1
# cut_line(min_length,max_length)
cut_line(1,max(line))
print(length)