알고리즘(python)/탐색

[Python]이분탐색 백준 1654

개발일기 2020. 1. 31. 19:40
반응형

   문제

   https://www.acmicpc.net/problem/1654


길이를 기준으로 생각해야한다.

길이에 따라 나오는 랜선의 갯수가 N보다 많은것중에 가장 긴것을 구하기 위해선 가능한

 랜선의 범위를 정하고 이분탐색을 통해 그 범위를 좁혀나가면 된다.

길이의 후보군은 1~가장긴랜선이 될것이다.

그 중간값을 기준으로 랜선들을 잘랐을때 N개 이상의 랜선이 나온다면 랜선의 길이를 

늘리고 N개가 나오지 않는다면 줄여야한다. 여기서 랜선의 길이를 이분법을 통해 늘리고

줄여주면된다.코드를 보면 이해가 빠를것이다.


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
import sys
K,N=map(int,sys.stdin.readline().split())
lanline=[]
for i in range(K):#영식이가 들고있는 전선들
    lanline.append(int(sys.stdin.readline()))
 
 
 
min_value=1
max_value=max(lanline)
result=0
while min_value<=max_value:
    mid = (min_value + max_value) // 2
    lan_count=0
    for i in range(K):
        lan_count+=lanline[i]//mid
 
    if lan_count>=N:#원하는 랜선의 갯수보다 많이나왔으면 길이를 늘려야됨
        min_value=mid+1
        result = mid#길이저장
    elif lan_count<N:
        max_value=mid-1
 
print(result)

cs



반응형