[BOJ] 1654 랜선 자르기
이분 탐색
접근법
최대 길이부터 길이를 줄여보며 N개를 만족할 때까지 길이를 줄여보자 → 최대 길이기 2^31 - 1이라서 시간초과. 범위가 클 때는 이분탐색 등 로그스케일로 구현이 가능한 방법을 고려하자.
- 길이를 이분 탐색을 통해 반씩 줄여나갈 수 있다.
- 순차탐색을 하며 개수를 구한다.
위와 같이 구현하면 O(K*log(len(K))) 가 된다.
import sys
def get_sum(mid):
answer = 0
for length in lan:
answer += length // mid
return answer
def binary_search(n):
start = 0
end = 2**31 - 1
answer = 0
while start <= end:
mid = (start + end) // 2
count = get_sum(mid)
# 아직 모자르다면
if n > count:
end = mid - 1
else:
start = mid + 1
answer = mid
return answer
if __name__ == "__main__":
K, N = map(int, sys.stdin.readline().rstrip().split())
lan = list()
for _ in range(K):
lan.append(int(sys.stdin.readline().rstrip()))
print(binary_search(N))