상세 컨텐츠

본문 제목

Four Squares(백준)

코딩테스트

by dofury 2023. 7. 20. 23:13

본문

728x90

package com.dofury.kotlin

import kotlin.math.min

fun main() {
    val n = readLine()!!.toInt()
    val dp = IntArray(n + 1) { Int.MAX_VALUE }
    dp[0] = 0
    for (i in 1..n) {
        var j = 1
        while (j * j <= i) {
            dp[i] = min(dp[i], dp[i - j * j] + 1)
            j += 1
        }
    }
    println(dp[n])
}

문제를 안풀려 찾아보니 다이나믹 프로그래밍을 해야했다.

dp 인트배열을 최소값을 구해야하니 int에서 가장큰값으로 초기화한다.

그다음 1부터 n까지 반복해서

j의제곱이 i보다 같거나 작을때만 최소값을 대입하는 반복문을 돌린다.

dp[i]는 dp[i- j*j] + 1과 비교해서 더 작은 값을 가진다.

 

이를 이해하기위해서 예시를 들자면

11339 = 105^2 + 15^2 + 8^2 + 5^2 이므로 이 는

105^2 + 15^2 + 8^ 2 에서 + 1을 더한 갯수와 같다.

 

그래서 이 점을 이용해 비교해서 더작은 값을 대입하게 된다.

 

 

그다음  문제에서 요구하는 dp[n]을 출력한다.

728x90

'코딩테스트' 카테고리의 다른 글

큐(백준)  (0) 2023.07.23
패션왕 신해빈(백준)  (0) 2023.07.21
ATM(백준)  (0) 2023.07.20
비밀번호 찾기(백준)  (0) 2023.07.18
이장님 초대(백준)  (0) 2023.07.14

관련글 더보기

댓글 영역