import Foundation
let line = readLine()!.components(separatedBy: " ").map { Int($0)! }
let k = line[0]
let n = line[1]
var array:[Int] = []
for i in 1...k {
let line2 = Int(readLine()!)!
array.append(line2)
}
func binarySearch(_ arr: [Int], _ target: Int) -> Int? {
var start = 1
var end = arr.max()!
while start <= end {
let mid = (start + end) / 2
let count = arr.reduce(0, { $0 + $1 / mid })
if count >= target {
start = mid + 1
} else {
end = mid - 1
}
}
return end
}
print(binarySearch(array,n)!)
left
로, 끝 인덱스를 right
로 설정합니다. 이진 탐색은 각 단계마다 탐색 범위를 반으로 줄여가면서 찾고자 하는 값을 찾아내는 알고리즘인데, 이를 위해서는 주어진 배열이 정렬되어 있어야 합니다. 따라서, 주어진 배열을 오름차순으로 정렬합니다.mid
를 구합니다. 이 때, mid
는 탐색 범위의 중간에 위치한 값으로, 배열의 길이가 홀수일 때는 가운데 값, 짝수일 때는 가운데 두 값 중 작은 값을 선택합니다.mid
값을 기준으로 배열을 두 부분으로 나누어서, 왼쪽 부분에는 mid
보다 작은 값들만, 오른쪽 부분에는 mid
보다 큰 값들만 남도록 분할합니다. 이 때, 배열이 오름차순으로 정렬되어 있으므로, 왼쪽 부분의 최대 값은 mid
보다 작고, 오른쪽 부분의 최소 값은 mid
보다 크게 됩니다.arr[mid]
가 왼쪽 부분의 최대 값보다 작은 경우에는, 왼쪽 부분에서 최소값을 찾아야 하므로 right
값을 mid - 1
로 설정합니다. 반대로, arr[mid]
가 오른쪽 부분의 최소 값보다 큰 경우에는, 오른쪽 부분에서 최소값을 찾아야 하므로 left
값을 mid + 1
로 설정합니다. 만약 arr[mid]
가 왼쪽 부분의 최대 값이거나 오른쪽 부분의 최소 값과 같은 경우에는, 이 값이 배열의 최소값이므로 mid
값을 반환합니다.func binarySearch(_ arr: [Int], _ target: Int) -> Int {
var start = 1
var end = arr.max()!
while start <= end {
let mid = (start + end) / 2
let sum = arr.filter { $0 >= mid }.reduce(0, { $0 + $1 - mid })
if sum >= target {
start = mid + 1
} else {
end = mid - 1
}
}
return end
}
let n = 7
let m = 20
let woods = [20, 15, 10, 17, 19, 18, 13]
print(binarySearch(woods, m) // Output: 15
제가 학습한 내용을 요약하여 정리한 것입니다. 내용에 오류가 있을 수 있으며, 어떠한 피드백도 감사히 받겠습니다.
감사합니다.