본문 바로가기

알고리즘

[백준][KOTLIN] 9184 신나는 함수 실행

728x90
 

9184번: 신나는 함수 실행

입력은 세 정수 a, b, c로 이루어져 있으며, 한 줄에 하나씩 주어진다. 입력의 마지막은 -1 -1 -1로 나타내며, 세 정수가 모두 -1인 경우는 입력의 마지막을 제외하면 없다.

www.acmicpc.net

코드

import java.util.*

private val dp = Array(21) { Array(21) { IntArray(21)} }

fun main(args: Array<String>) {
    val sc = Scanner(System.`in`)

    while (true) {
        val a = sc.nextInt()
        val b = sc.nextInt()
        val c = sc.nextInt()

        if (a == -1 && b == -1 && c == -1) {
            break
        }

        val result = w(a, b, c)
        println("w($a, $b, $c) = $result")
    }
}

private fun w(a: Int, b: Int, c: Int): Int {
    when {
        a <= 0 || b <= 0 || c <= 0 -> {
            return 1
        }
        a > 20 || b > 20 || c > 20 -> {
            dp[20][20][20] = w(20, 20, 20)
            return dp[20][20][20]
        }
        b in (a + 1) until c -> {
            if (dp[a][b][c] != 0) {
                return dp[a][b][c]
            }

            dp[a][b][c] = w(a, b, c-1) + w(a, b-1, c-1) - w(a, b-1, c)
            return dp[a][b][c]
        }
        else -> {
            if (dp[a][b][c] != 0) {
                return dp[a][b][c]
            }
            dp[a][b][c] = w(a-1, b, c) + w(a-1, b-1, c) + w(a-1, b, c-1) - w(a-1, b-1, c-1)
            return dp[a][b][c]
        }
    }
}
728x90