본문 바로가기
알고리즘/DP

[java 백준] 실버 3/1699번 제곱수의 합

by Meaning_ 2021. 8. 7.
728x90
반응형

https://www.acmicpc.net/problem/1699

 

1699번: 제곱수의 합

어떤 자연수 N은 그보다 작거나 같은 제곱수들의 합으로 나타낼 수 있다. 예를 들어 11=32+12+12(3개 항)이다. 이런 표현방법은 여러 가지가 될 수 있는데, 11의 경우 11=22+22+12+12+12(5개 항)도 가능하다

www.acmicpc.net

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
import java.util.Scanner;
 
public class Main {
 
    public static int n;
 
    public static int[] arr;
    public static int[] dp;
 
    public static void main(String[] args) {
 
        Scanner sc = new Scanner(System.in);
        n = sc.nextInt();
        dp = new int[n + 2];
        dp[1= 1;
 
        for (int i = 2; i <= n; i++) {
            dp[i] = i;
            for (int j = 1; j * j <= i; j++) {
                dp[i] = Math.min(dp[i], dp[i - j * j] + 1);
            }
        }
        System.out.println(dp[n]);
    }
 
}
cs

 

18번째 줄 처럼 dp[i]=i로 초기화시켜준다. <--정말 중요

 

dp[2]=Math.min(dp[2],dp[2-1]+1)  즉 min(2,2)이므로 2

 

dp[3]=Math.min(dp[3],dp[3-1]+1) 즉 min(3,3)이므로 3

 

dp[4]는 i가 1일 때

Math.min(dp[4],dp[4-1]+1) => min(4,4) 이므로dp[4]=4

 

i가 2일때

 

Math.min(dp[4],dp[4-4]+1) =>min(4,1) 이므로 dp[4]=1이다.

 

dp[4]는 2의 제곱 한개만으로 만들 수 있기 때문에 

 

for (int j = 1; j * j <= i; j++) {

                dp[i] = Math.min(dp[i], dp[i - j * j] + 1);

 

위의 코드를 통해 제곱수 판별이 된 것을 알 수 있다. 

 

문제를 풀면서 틀린부분


dp[i]=Math.min(dp[i],dp[i-j]+1)의 점화식을 생각해봤지만, 제곱수를 어떻게 다뤄야할지 도저히 감이 안왔다. 그래서 아래 링크에 있는 글을 봤는데,

https://www.acmicpc.net/board/view/13407

 

글 읽기 - 문제 1699 질문

댓글을 작성하려면 로그인해야 합니다.

www.acmicpc.net

 

 답글을 보면 동전교환 알고리즘을 이용해서 풀어보라고 해서 동전교환 알고리즘을 찾아보았다.

 

 

https://withhamit.tistory.com/333

 

동전 교환(CC: Coin Change)

동전 교환(CC: Coin Change)은 다이나믹 알고리즘 중 하나입니다. CC는 동전의 종류들로 특정 금액을 만드는 경우의 수를 구하는 알고리즘입니다. 예를 들어서 1원, 2원, 5원, 10원 4가지 종류의 동전으

withhamit.tistory.com

 

--> 위 블로그 글이 설명을 잘 해주셨다. 

d[i][j] = d[i-1][j] (0 <= j < cost[i])
          = d[i][j-cost[i]] + d[i-1][j]

 

https://do-rang.tistory.com/9

 

[알고리즘] Dynamic Programming (동적 계획법)

알고리즘의 꽃(이라고 생각합니다) 동적 계획법! 흔히 줄여서 DP라고 부르죠. 저는 개인적으로 이게 제일 어렵습니다 ㅠㅠ 그래서 오늘 한 번 뿌셔보려고 합니다 ** 이번 파트는 코드그라운드의 C

do-rang.tistory.com

이 글도 보면서 참고해봤다!

728x90
반응형

댓글