백준 #1113 #Kotlin #수영장만들기

HighMoon·2023년 5월 28일

[수영장 만들기 문제]

높이가 1인 땅에서부터 높이가 9인 땅까지 차례대로 확인해준다.
현재 높이가 num일 경우,
높이가 같은 땅을 지나다니면서
주변 지형에서 num보다 큰 땅 중 가장 작은 높이를 minN으로 저장해준다.
그다음 지나온 땅들을 minN으로 높이를 바꿔준다.
위 행위를 반복하면 바꿔준 총 량이 답이된다.

import java.lang.Integer.min

fun main() {

    val br = System.`in`.bufferedReader()
    val (n, m) = br.readLine().split(" ").map { it.toInt() }
    val board = Array(n) { Array(m) { 0 } }

    (0 until n).forEach { r ->
        val line = br.readLine()
        (0 until m).forEach { c ->
            board[r][c] = line[c].toString().toInt()
        }
    }

    val dr = listOf(0, 1, 0, -1)
    val dc = listOf(1, 0, -1, 0)

    var visit = Array(n) { Array(m) { false } }
    var minN = 10
    var num = 1
    var countArray = arrayListOf<Pair<Int, Int>>()

    fun dfs(row: Int, col: Int) {
        if (visit[row][col]) return

        visit[row][col] = true
        countArray.add(row to col)

        (0..3).forEach {
            val nr = row + dr[it]
            val nc = col + dc[it]
            if (nr in 0 until n && nc in 0 until m) {
                if (board[nr][nc] == num) {
                    dfs(nr, nc)
                } else if (board[nr][nc] > num) {
                    minN = min(minN, board[nr][nc])
                } else if (board[nr][nc] < num) {
                    minN = -1
                }
            } else {
                minN = -1
            }
        }
    }

    var ans = 0

    (1..9).forEach {
        num = it
        visit = Array(n) { Array(m) { false } }

        (0 until n).forEach { r ->
            (0 until m).forEach { c ->
                if (board[r][c] == num && !visit[r][c]) {
                    minN = 10
                    countArray = arrayListOf()
                    
                    dfs(r, c)

                    if (minN > num) {
                        countArray.forEach { (row, col) ->
                            board[row][col] = minN
                        }
                        ans += countArray.size * (minN - num)
                    }
                }
            }
        }
    }
    println(ans)
}
profile
안드 개발자

0개의 댓글