
- dp로 10분만에 해결한 문제이다. 2중포문을 돌면서 각 지점에 도달할 수 있는 최솟값의 에너지를 저장하면 끝
import java.lang.Math.min
fun main() = with(System.`in`.bufferedReader()) {
val n = readLine().toInt()
val board = readLine()
val dp = IntArray(n){ Int.MAX_VALUE}
dp[0] = 0
for(i in 0 until n){
for(j in i+1 until n){
if(dp[i]!=Int.MAX_VALUE) {
when (board[i]) {
'B' -> {
if (board[j] == 'O') {
dp[j] = min(dp[j], dp[i] + ((j - i) * (j - i)))
}
}
'O' -> {
if (board[j] == 'J') {
dp[j] = min(dp[j], dp[i] + ((j - i) * (j - i)))
}
}
'J' -> {
if (board[j] == 'B') {
dp[j] = min(dp[j], dp[i] + ((j - i) * (j - i)))
}
}
}
}
}
}
if(dp[n-1]==Int.MAX_VALUE){
println(-1)
}
else println(dp[n-1])
}