시배's Android
Algorithm | Kotlin 백준 17144 미세먼지 안녕! 본문
17144번: 미세먼지 안녕!
미세먼지를 제거하기 위해 구사과는 공기청정기를 설치하려고 한다. 공기청정기의 성능을 테스트하기 위해 구사과는 집을 크기가 R×C인 격자판으로 나타냈고, 1×1 크기의 칸으로 나눴다. 구사
www.acmicpc.net
fun spread(room: List<MutableList<Int>>, r: Int, c: Int) {
val tmp = List(r) { MutableList(c) { 0 } }
for (i in 0 until r) {
for (j in 0 until c) {
val amount = room[i][j] / 5
val calc = { I: Int, J: Int ->
if (room[I][J] != -1) {
tmp[I][J] += amount
room[i][j] -= amount
}
}
if (i > 0) calc(i - 1, j)
if (i < r - 1) calc(i + 1, j)
if (j > 0) calc(i, j - 1)
if (j < c - 1) calc(i, j + 1)
}
}
for (i in 0 until r) for (j in 0 until c) room[i][j] += tmp[i][j]
}
fun rotate(room: List<MutableList<Int>>, R: Int, C: Int) {
val left = { r: Int, c1: Int, c2: Int ->
for (j in c1 + 1..c2) {
room[r][j - 1] = room[r][j]
}
}
val right = { r: Int, c1: Int, c2: Int ->
for (j in c2 - 1 downTo c1) {
if (room[r][j] == -1) room[r][j + 1] = 0 else room[r][j + 1] = room[r][j]
}
}
val up = { r1: Int, r2: Int, c: Int ->
for (i in r1 + 1..r2) {
if (room[i - 1][c] != -1) room[i - 1][c] = room[i][c]
}
}
val down = { r1: Int, r2: Int, c: Int ->
for (i in r2 - 1 downTo r1) {
if (room[i + 1][c] != -1) room[i + 1][c] = room[i][c]
}
}
val t = room.indexOfFirst { it[0] == -1 }
down(0, t, 0)
left(0, 0, C - 1)
up(0, t, C - 1)
right(t, 0, C - 1)
up(t + 1, R - 1, 0)
left(R - 1, 0, C - 1)
down(t + 1, R - 1, C - 1)
right(t + 1, 0, C - 1)
}
private fun main() {
val (r, c, t) = readLine()!!.split(" ").map { it.toInt() }
val room = List(r) { readLine()!!.split(" ").map { it.toInt() }.toMutableList() }
repeat(t) {
spread(room, r, c)
rotate(room, r, c)
}
println(room.sumOf { it.sum() } + 2)
}
'Algorithm' 카테고리의 다른 글
Algorithm | 백준 Kotlin 15664 N과 M (10) (0) | 2023.09.16 |
---|---|
Algorithm | 백준 Kotlin 2776 암기왕 (0) | 2023.09.16 |
Algorithm | Kotlin 백준 16918 봄버맨 (0) | 2023.09.11 |
Algorithm | Kotlin 백준 1059 좋은 구간 (0) | 2023.09.11 |
Algorithm | Kotlin 백준 9613 GCD 합 (0) | 2023.09.04 |