BOJ 1654: 랜선 자르기 https://www.acmicpc.net/problem/1654
시간복잡도
를 고려하여 이분 탐색
방법을 선택했다.중간값
을 구한다.랜선 개수가 많이 나오면
mid(랜선 길이)가 짧다는 뜻이다.같아도
가장 긴 랜선을 구해야 하므로 해당 분기를 반복한다.mid + 1
로 갱신한다.랜선 개수가 적게 나오면
mid(랜선 길이)가 길다는 뜻이다.mid - 1
로 갱신한다.랜선 최소 길이(mMin) - 1
을 출력한다.K, N = map(int, input().split()) # K: 이미 가지고 있는 랜선 개수, N: 필요한 랜선 개수
lines = list()
for i in range(K):
lines.append(int(input()))
lines.sort()
mMin = 1
mMax = lines[len(lines) - 1]
cnt = 0 # 랜선 개수
while mMin <= mMax:
cnt = 0 # 랜선 개수
mid = (mMin + mMax) // 2 # 중간값
for line in lines:
cnt += line // mid
if cnt >= N: # 랜선 개수가 큼(많이 잘림) -> 랜선이 짧음 (최대 길이 찾아야 됨)
mMin = mid + 1
else: # 랜선 개수가 작음(적게 잘림) -> 랜선이 긺
mMax = mid - 1
print(mMin - 1)