본문 바로가기

알고리즘

백준 1915 코틀린

반응형

일반적인 dp 문제와 다르게 점화식을 세워 푸는 풀이보다는 메모 라이징 특성을 이용하여 푸는 문제이다.

현재 좌표에 값이 1일 때 좌표의 왼쪽, 왼쪽 위, 위에 값이의 최솟값이 1이라면 2x2의 정사각형을 만들 수 있고 1의 값을 2로 대체해 주면(메모 라이징) 해당 좌표의 왼쪽, 왼쪽 위, 위에 값이 1이라는 사실을 알 수 있다.

이런 식으로 왼쪽, 왼쪽 위, 위에 값이의 최솟값이 2이라면 3x3의 정사각형을 만들 수 있다.

ex)
0111
0122
0123

ex)
0011
0112
0122

따라서, 현재 좌표의 값이 1일 때 왼쪽, 왼쪽 위, 위에 값의 최솟값에 1을 더한 값이 현재 좌표에서 만들 수 있는 최대 크기의 정사각형이므로 좌표들의 값들 중 최댓값을 출력하면 정답이 된다.

 

import kotlin.math.min

fun main() {
    val input = readLine()!!.toString().split(" ")

    val n = input[0].toInt()
    val m = input[1].toInt()

    val dp = Array(n + 1) { IntArray(m + 1) }

    var max = 0

    for (i in 1 until n + 1) {
        val line = readLine()!!
        for (j in 1 until m + 1) {
            val value = line[j - 1].toString().toInt()

            if (value > 0 && max == 0) {
                max = 1
            }

            dp[i][j] = value
        }
    }

    for (i in 1 until n + 1) {
        for (j in 1 until m + 1) {
            val min = min(dp[i - 1][j - 1], min(dp[i - 1][j], dp[i][j - 1]))

            if (min != 0 && dp[i][j] == 1) {
                dp[i][j] = min + 1

                if (max < min + 1) {
                    max = min + 1
                }
            }
        }
    }

    println(max * max)
}

 

반응형

'알고리즘' 카테고리의 다른 글

백준 9663 백 트래킹 코틀린  (0) 2022.05.28
백준 5582번 공통 부분 문자열 코틀린  (0) 2022.05.19
백준 2579 계단 오르기 코틀린  (0) 2022.04.02
백준 1005 코틀린  (0) 2021.08.14
백준 1202 코틀린  (0) 2021.06.15