728x90
문제
https://www.acmicpc.net/problem/2110
풀이
- 최소거리가 d일 때 몇 개의 공유기를 설치할 수 있는지를 체크해서 최소거리의 최대를 찾기
// 백준 - 공유기 설치(2110)
import java.io.BufferedReader
import java.io.InputStreamReader
import java.util.StringTokenizer
var house: Array<Int> = arrayOf()
fun main() {
val br = BufferedReader(InputStreamReader(System.`in`))
val st = StringTokenizer(br.readLine())
val N = st.nextToken().toInt()
val C = st.nextToken().toInt()
house = Array(N, {0})
for(i: Int in 0..N-1) {
house[i] = br.readLine().toInt()
}
// 오름차순 정렬
house.sort()
var low = 1 // 최소거리의 최소
var high = house[N-1] - house[0] + 1 // 최소거리의 최대
var answer = 1
while(low < high) {
val mid = (low + high) / 2
// 설치 가능한 공유기 개수가 C보다 작으면, 거리 좁히기
if(wifi(mid) < C) {
high = mid
}
// 설치 가능한 공유기 개수가 C보다 크거나 같으면, 거리 넓히기
else {
low = mid + 1
answer = mid // 일단 거리가 mid일 때 공유기 C개 설치 가능하므로 체크
}
}
print(answer)
}
// 최소거리가 d일 때 설치할 수 있는 와이파이 공유기
fun wifi(d: Int): Int {
var cnt = 1
var preHouse = house[0] // 제일 가까운 곳에 설치한 공유기
for(i: Int in 1..house.size - 1) {
// 거리가 d 이상
if(house[i] - preHouse >= d) {
cnt++
preHouse = house[i]
}
}
return cnt
}
728x90
'Programming > Kotlin' 카테고리의 다른 글
[백준/Kotlin] 경사로(14890) (0) | 2024.05.17 |
---|---|
[백준/Kotlin] 여왕벌(10836) - 서브태스크4 해결 못함 (0) | 2024.05.17 |
[백준/Kotlin] 내려가기(2096) (0) | 2024.05.15 |
[백준/Kotlin] 자두나무(2240) (0) | 2024.05.14 |
[백준/Kotlin] 다이어트(1484) (0) | 2024.05.14 |