[백준] 랜선 자르기 1654번

나의 풀이

import sys
N, K = map(int, sys.stdin.readline().split())
nums = []
for i in range(N):
    nums.append(int(sys.stdin.readline()))
def binary_search(start, end):
    while start <= end:
        total = 0
        mid = (start + end) // 2
        for x in nums:
            total += x // mid
        if total >= K:
            start = mid + 1
        elif total < K:
            end = mid - 1
    return end

print(binary_search(1, max(nums)))
  • 입력받은 숫자들 중에서 가장 큰 숫자를 끝으로 잡고 이분 탐색을 돌린다.
  • 중간 값으로 잘랐을 경우 랜선의 개수를 계산해준다.
  • 랜선의 개수가 K 보다 많거나 같다면 start 를 mid + 1 해준다. 같다면 조건을 넣어줘야 최대값을 구할 수 있다.
  • 랜선의 개수가 K 보다 적다면 end 를 mid - 1 해준다.
  • 랜선의 개수가 많다는 것은 랜선의 길이를 짧게 잡았다는 뜻이고, 랜선의 개수가 적다는 것은 랜선의 길이를 길게 잡았다는 의미이다.
  • 그렇게 해서 start 가 end 보다 커지면 반복이 종료되는데 이 때 end 가 만족하는 값 중 최대값이 된다.

0개의 댓글