문제 : https://www.acmicpc.net/problem/12869
12869번: 뮤탈리스크
1, 3, 2 순서대로 공격을 하면, 남은 체력은 (12-9, 10-1, 4-3) = (3, 9, 1)이다. 2, 1, 3 순서대로 공격을 하면, 남은 체력은 (0, 0, 0)이다.
www.acmicpc.net
import java.util.*
import kotlin.math.min
val dp = Array(61) {Array(61) {Array(61) {0} }}
fun main() = with(Scanner(System.`in`)){
var n = nextInt()
val health = arrayListOf(0,0,0)
for(i in 0 until n){
health[i] = nextInt()
}
println(attack(health[0],health[1],health[2]))
}
fun attack(h1:Int, h2:Int, h3:Int) : Int{
// 0보다 작은 값이라면 0으로 만들어줌
if(h1<0) return attack(0,h2,h3)
if(h2<0) return attack(h1,0,h3)
if(h3<0) return attack(h1,h2,0)
// SCV 가 전부 죽었다면 리턴
if(h1 == 0 && h2 ==0 && h3 == 0){
return 0
}
// 동일한 연산을 했을 경우 리턴
if(dp[h1][h2][h3] != 0) return dp[h1][h2][h3]
// 모든 경우의 수 탐색
dp[h1][h2][h3] = 100000
dp[h1][h2][h3] = min(dp[h1][h2][h3],attack(h1-9,h2-3,h3-1)+1)
dp[h1][h2][h3] = min(dp[h1][h2][h3],attack(h1-9,h2-1,h3-3)+1)
dp[h1][h2][h3] = min(dp[h1][h2][h3],attack(h1-3,h2-9,h3-1)+1)
dp[h1][h2][h3] = min(dp[h1][h2][h3],attack(h1-1,h2-9,h3-3)+1)
dp[h1][h2][h3] = min(dp[h1][h2][h3],attack(h1-3,h2-1,h3-9)+1)
dp[h1][h2][h3] = min(dp[h1][h2][h3],attack(h1-1,h2-3,h3-9)+1)
return dp[h1][h2][h3]
}
일반적으로 탐색하면 시간초과 되므로
DP를 이용해야 하는 문제였다.
3차원 배열을 활용하여 동일연산 처리를 해주었다.