STUDY/Algorithm

[백준] 1654 랜선자르기 python

sinawi95 2021. 4. 28. 21:03
728x90

www.acmicpc.net/problem/1654

 

1654번: 랜선 자르기

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

www.acmicpc.net

K, N = map(int, input().split())
N_list = [int(input()) for _ in range(K)]
result = 0
s, e = 1, max(N_list)
while s <= e:
    m = (s + e) // 2
    key = sum([num // m for num in N_list])
    if key < N: # => m의 값이 큰경우 => m을 줄이는 방향
        e = m - 1
    else:
        s = m + 1
        result = max(result, m) # 랜선의 최대 길이를 찾아야 하므로
print(result)

 이분탐색을 하면서 가장 큰 크기를 탐색하는 문제이다.

처음에 문제를 이해하기 힘들어서 이게 왜 이분 탐색이지 하는 생각이 들었다.

머리로는 이해는 가는데 뭔가 설명하긴 어려운 문제다...


s = 0로 초기화하면 zerodivisionError가 발생한다.