[백준/코틀린] 15686번: 치킨 배달
골드 5
링크
풀이
N과 M의 범위가 작기 때문에 브루트포스로 해결할 수 있습니다.
치킨집들 중에서 M개를 선택하는 모든 경우를 백트래킹으로 탐색하며,
각 조합에 대해 도시의 치킨 거리 최솟값을 계산합니다.
코드
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
import kotlin.math.abs
lateinit var town: List<List<Int>>
lateinit var selected: IntArray
val houses = mutableListOf<Pair<Int, Int>>()
val chickens = mutableListOf<Pair<Int, Int>>()
var ans = Int.MAX_VALUE
fun Pair<Int, Int>.distance(other: Pair<Int, Int>): Int {
return abs(this.first - other.first) + abs(this.second - other.second)
}
fun backtrack(n: Int, m: Int, d: Int, s: Int) {
if (m == d) {
val sum = houses.sumOf { house ->
selected.map { chickens[it] }.minOf { chicken ->
chicken.distance(house)
}
}
return run { ans = minOf(ans, sum) }
}
(s until n).forEach {
selected[d] = it
backtrack(n, m, d + 1, it + 1)
}
}
fun main() {
val (n, m) = readln().split(" ").map { it.toInt() }
town = List(n) { readln().split(" ").map { it.toInt() } }
selected = IntArray(m)
for (i in 0 until n) {
for (j in 0 until n) {
when (town[i][j]) {
1 -> houses += i to j
2 -> chickens += i to j
}
}
}
backtrack(chickens.size, m, 0, 0)
println(ans)
}
This post is licensed under CC BY 4.0 by the author.