기록

백준_1654_랜선 자르기 본문

코딩테스트/python

백준_1654_랜선 자르기

youngyin 2021. 1. 18. 20:30

문제

 

1654번: 랜선 자르기

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

www.acmicpc.net

풀이

해당 문제는 이분 탐색으로 해결할 수 있다. 

1. 계산한 랜선의 개수 number필요한 랜선의 개수 N보다 크거나 N과 같다면 랜선의 길이가 속하는 구간 [start, end]를 [(start, end)/2, end]로 줄인다.

2. 계산한 랜선의 개수 number필요한 랜선의 개수 N보다 작다면 랜선의 길이가 속하는 구간 [start, end]를 [start, (start, end)/2]로 줄인다.

 

구간의 크기가 1이 될 때까지 이분 탐색을 계속하여 충분히 작은 범위을 구한다. 

end일 때 계산한 랜선의 개수 number필요한 랜선의 개수 N와 같거나 크다면 end가 답이 되며, 그 이외의 경우 start가 답이 된다.

코드

K, N = map(int, input().split())
arr = [int(input()) for i in range(K)]

# 이분 탐색
start, end = 1, max(arr) # 랜선의 길이
while end-start>1 :
    p = int((start+end)/2)
    number = sum([int(arr[i]/p) for i in range(K)]) # 랜선의 개수
    if number>=N : start = p
    else : end = p

# 답 찾기
number = sum([int(arr[i]/end) for i in range(K)])
if number>=N : print(end)
else : print(start)

'코딩테스트 > python' 카테고리의 다른 글

백준_1149_RGB거리  (0) 2021.02.05
백준_2166_다각형의 면적  (0) 2021.02.02
백준_1920_수 찾기  (0) 2021.01.18
백준_2467_용액  (0) 2021.01.15
백준_1806_부분합  (0) 2021.01.15
Comments