본문 바로가기
알고리즘

[Swift] 백준 1654번 랜선 자르기

by 고고 2022. 3. 17.

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

 

1654번: 랜선 자르기

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

www.acmicpc.net

 

 

2805번 나무 자르기와 거의 비슷하게 이분탐색으로 풀었습니다.

start = 1로 하는 것을 주의해주시면 됩니다. 0으로 하면 0으로 나누는 바람에 런타임 에러가 발생합니다.

import Foundation

let arr = readLine()!.split(separator: " ").map { Int(String($0))! }
let N = arr[0]
let M = arr[1]
var lans = [Int]()

for _ in 0..<N {
    lans.append(Int(readLine()!)!)
}

var length = 0
var start = 1
var end = lans.max()! // // 가장 긴 경우

while start <= end {
    let mid = (start + end) / 2 // 최대 길이
    var count = 0
    
    for lan in lans {
        count += lan / mid // 자른 갯수만큼 더하기
    }
    
    if count >= M {
        start = mid + 1
        length = max(length, mid)
    } else {
        end = mid - 1
    }
}

print(length)

댓글