공부하기/백준

[Python] 백준 풀기 1654 - 랜선 자르기

XEV 2022. 10. 31. 23:25

파이썬 백준 1654번

실버2

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

 

1654번: 랜선 자르기

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

www.acmicpc.net

 

 

 

 

문제 보기

분류: 이분 탐색, 매개 변수 탐색

 

 

 

문제 풀기

입력 받은 다양한 랜선중 가장 긴 선을 기준으로 하여 mid 값을 지속적으로 찾아 나간다.

이분할 하여 나온 mid 로 모든 랜선을 나누어 목표 개수 N 이 되도록 찾고,

N 의 개수가 충족이 되면 최대 길이를 찾기 위한 분할이 계속 일어난다.

start 와 end 가 만날때까지..

 

 

 

코드 보기

import sys
inputdata = sys.stdin.readline

def fnCutTheLan(K, N, lan_ls):
    start = 1
    end = max(lan_ls)
    
    while (start <= end):
        mid = (start + end) // 2
        count = 0
        for i in range(K):
            count += lan_ls[i] // mid
            
        if N <= count:
            start = mid + 1
        else:
            end = mid - 1
            
        print(f'count: {count}   start: {start}   end: {end}')           # test print
    
    return end


if __name__ == "__main__":
    K, N = map(int, inputdata().split())
    lan_ls = []
    for _ in range(K):
        lan_ls.append(int(inputdata().strip()))
    
    result = fnCutTheLan(K, N, lan_ls)
    print(result)



# 4 11
# 802
# 743
# 457
# 539

# count: 5   start: 1   end: 400
# count: 11   start: 201   end: 400
# count: 6   start: 201   end: 299
# count: 8   start: 201   end: 249
# count: 10   start: 201   end: 224
# count: 10   start: 201   end: 211
# count: 10   start: 201   end: 205
# count: 10   start: 201   end: 202
# count: 10   start: 201   end: 200

# 200