๐ ๋ฌธ์
๐ง ์์ด๋์ด
๋ฌธ์ ๋ฅผ ์ฝ์๋ง์ ๋ต๋ ํค์๋๋ '๋ชจ๋ ์ง์์ ์นํจ ์ง ๊น์ง์ ์ต๋จ ๊ฑฐ๋ฆฌ'๋ค.
์ง์ ๊ฐ์๊ฐ ์ต๋ 100๊ฐ, ์นํจ์ง ๊ฐ์๊ฐ ์ต๋ 13๊ฐ, ํ ์ง์์ ์นํจ ์ง๊น์ง์ ๊ฑฐ๋ฆฌ ์ต๋ ์ฐ์ฐ๋์ 100
๋ฐ๋ผ์ 100 * 13 => 1,300์ผ๋ก ๋ฐฑํธ๋ํน ํ์ด๊ฐ ์ถฉ๋ถํ ๊ฐ๋ฅํ๊ฒ ๋ค๋ ์๊ฐ์ด ๋ค์๋ค.
๊ฒฐ๊ตญ ์กฐํฉ์ด๋ค.
$$ _{13}C_{M} $$
(์ต๋ 13๊ฐ ์ซ์ ์ค ์นํจ ์ง ์ M๊ฐ๋ฅผ ์ค๋ณต ์์ด ์ ํํด์ผํ๋ค.)
- ์นํจ์ง์ ์ขํ List keep
- ๋ชจ๋ ์ง์ ์ขํ keep
- 1๊ณผ 2๋ฅผ ๋ชจ๋ ๋๋ฉด์ ์ง ์ฌ์ด์ ๊ฑฐ๋ฆฌ (๊ฐ๋ก ์ขํ ์ฐจ์ด + ์ธ๋ก ์ขํ ์ฐจ์ด) ๊ฐ ์นํจ ์ง ์ขํ๋ณ ์ง๊ณผ์ ๊ฑฐ๋ฆฌ keep
13๊ฐ์ค M ๊ฐ๋ฅผ ๊ณ ๋ฅธ ์นํจ์ง ์ขํ์๊น์ง์ ๊ฑฐ๋ฆฌ๋ฅผ ๋ชจ๋ ์ง์์๋ถํฐ ๊ตฌํ๋ค.
๋ชจ๋ ์ง์ ๋ชจ๋ ์นํจ ๊น์ง์ ๊ฑฐ๋ฆฌ๋ฅผ ๊ตฌํ๊ณ ๊ทธ์ค ๊ฐ์ฅ ๊ฐ๊น์ด ์นํจ์ง์ ๊ฑฐ๋ฆฌ๋ก ํํ๋ค.
๋ชจ๋ ์ง์๋ํ ์นํจ์ง๊น์ง์ ๊ฑฐ๋ฆฌ๋ฅผ ํฉํ๋ฉด ํด๋น ์กฐํฉ (13๊ฐ์ค M๊ฐ)์ ๋ํ ์นํจ์ง๊น์ง์ ๊ฑฐ๋ฆฌ๋ค.
$$ _{13}C_{M} $$
๊ฐ ์กฐํฉ์ ๋ํ ๋ชจ๋ ์ง์ผ๋ก๋ถํฐ ์นํจ์ง ๊น์ง์ ๊ฑฐ๋ฆฌ ์ค ์ต์ ๊ฐ์ ๋ต์ผ๋ก ํํ๋ค.
์ค์ํ๊ธฐ ์ฌ์ด ํฌ์ธํธ
M์ ๋ฒ์๊ฐ [1,13] ์ด๋ผ๊ณ ํด์ ์กฐํฉ ์ธ๋ฑ์ค ๋ฒ์๋ 0~12๋ก ์ก์ผ๋ฉด ์๋๋ค.
์ค์ ๋ก ์นํจ์ง์ ๊ฐ์๋ ์ผ๋ง๋ ๋ค์ด์ฌ์ง 'M'์ด ๊ฒฐ์ ํ๋๊ฒ ์๋๋ผ ์ขํ์ '2'์ ๊ฐ์๊ฐ ๊ฒฐ์ ํ๋ค.
๐ Kotlin Code
import java.io.BufferedReader
import java.io.InputStreamReader
import java.util.*
import kotlin.math.abs
import kotlin.math.min
// IntArray: ์ขํ ์์๋๋ก ๊ฐฏ์
private fun dfs(curIdx: Int, depth: Int, maxDepth: Int, arr: IntArray, answer: IntArray, chickenPointCombinations: LinkedList<IntArray>) {
if (depth == maxDepth) {
chickenPointCombinations.add(answer.copyOf())
return
}
for (i in curIdx until arr.size) {
answer[depth] = arr[i]
dfs(i + 1, depth + 1, maxDepth, arr, answer, chickenPointCombinations)
}
}
private fun getDistance(chickenPoint: IntArray, housePoint: IntArray): Int {
val rowDistance = abs(chickenPoint.first() - housePoint.first())
val colDistance = abs(chickenPoint.last() - housePoint.last())
return rowDistance + colDistance
}
fun main() {
val bufferedReader = BufferedReader(InputStreamReader(System.`in`))
val (N, M) = bufferedReader.readLine().split(" ").map(String::toInt)
val map = Array(N){_->
bufferedReader.readLine().split(" ").map(String::toInt)
}
// ์นํจ์ง ์ : M ~ 13,
// 13 Com M [ [], [], []] ๊ตฌํ๊ณ ๋ชจ๋ ์กฐํฉ์ ๋ํด ์ต์๊ฐ ๋์ค๋๊ฒ ์ ๋ต.
// 1๋ถํฐ M ๊น์ง ์ซ์์ ๋ํด ์กฐํฉ์ ๊ตฌํ๊ณ ๋ชจ๋ ์กฐํฉ์ ๋ํ distance ํฉ ๊ตฌํ๋ฉด ๋จ.
val chickenPointList = LinkedList<IntArray>()
val housePointList = LinkedList<IntArray>()
// ๋ชจ๋ ํฌ์ธํธ ์ด๊ธฐํ
for (row in map.indices) {
for (col in map[row].indices) {
when (map[row][col]) {
1 -> housePointList.add(intArrayOf(row, col))
2 -> chickenPointList.add(intArrayOf(row, col))
else -> {}
}
}
}
val arr = IntArray(chickenPointList.size){i-> i}
val tempCombinationArr = IntArray(M)
val chickenPointCombinations = LinkedList<IntArray>()
// checkPointCombinations ์ ๋ชจ๋ 13 C m ๊ฐ ์กฐํฉ ๋ฐฐ์ด์ด ๋ค์ด์์ (index ๋ก)
dfs(0, 0, M, arr, tempCombinationArr, chickenPointCombinations)
// index: house point index
// value: distance from house chicken
val distances = IntArray(housePointList.size){100}
var answer = Int.MAX_VALUE
// chickenPointCombinations loop
// (13 ๊ฐ์ค M ๊ฐ) ๊ณ ๋ฅด๋ ์ด M ๊ฐ์ loop ์์ ๋ต์ค ์ต์ ๊ฐ์ด ๋ฆฌํด๋๋ฉด๋จ.
for (chickenPointIndexes in chickenPointCombinations) {
// chickenPointIndexes ์๋ index ์กฐํฉ์ด ๋ด๊ฒจ์์.
// ์ด์ M๊ฐ์ ํฌ์ธํธ์ ๋ํด์ ๊ตฌํด๋ณด๋ฉด๋จ.
for (chickenPointIdx in chickenPointIndexes) {
housePointList.forEachIndexed { index, housePoint ->
// distance has same index of housePointList
// get distance house - chicken in same combination
distances[index] = min(distances[index], getDistance(chickenPointList[chickenPointIdx], housePoint))
}
}
// ํ๋์ ์กฐํฉ์ด ์๊ธธ ๋๋ง๋ค distance ๋ฅผ ๋ชจ๋ ์
๋ฐ์ดํธํ๋ฉฐ ์ฌ๊ณ์ฐ
answer = min(answer, distances.sum())
Arrays.fill(distances, 100)
}
print(answer)
}
'Algorithm > Algorithm (๋ฌธ์ ํ์ด)' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
[๋ฐฑ์ค] 11559 Puyo Puyo (2) | 2022.10.13 |
---|---|
[๋ฐฑ์ค] 10799 ์ ๋ง๋๊ธฐ (0) | 2022.10.11 |
[๋ฐฑ์ค] 1504 ํน์ ํ ์ต๋จ๊ฒฝ๋ก (0) | 2022.10.07 |
[๋ฐฑ์ค] 18808 ์คํฐ์ปค ๋ถ์ด๊ธฐ (0) | 2022.10.06 |
[๋ฐฑ์ค] 15683 ๊ฐ์ (0) | 2022.10.03 |