ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • BOJ) 제곱수의 합
    알고리즘/백준 2020. 7. 22. 15:25
    반응형

    제곱수의 합

     

    1699번: 제곱수의 합

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

    www.acmicpc.net

    풀이

     

    푸는데 꽤나 많은 시간이 소요됐다.

    처음에는 50%에서, 다음에는 99%에서 런타임 에러가 떠가지고 아리송했다.

    for(int i=2; i<=n; i++) {
    	for(int j=2; j*j <=i; j++) { dp[i] = dp[i] ==0 ? dp[i-j*j] +1 : Math.min(dp[i],dp[i-j*j] +1); }
    }

    이 코드가 처음에 작성했던 코든데, j*j가 i 이하까지 증가하니까 i-j*j에서 범위를 초과하지 않을 거라고 생각했다.

    그게, 인덱스의 범위든 int 의 범위든.

    하지만, 런타임 에러가 떴고 질문 게시판을 참고하니까 int의 범위 초과란다.

     

    long으로 바꿔서 다시 int로 parsing을 해야하나 하다가 위의 방법을 포기하고 로직 조금 바꿨다.기존에 dp[1] =1, dp[2] = 2, dp[3] =3 을 저장해놓고, dp의 i인덱스가 0이 아닌 경우 값을 저장하는게 아니라, dp[i]에 i를 저장하고 최소값을 구하는 식으로 바꿨다.

    dp[1] =1;
    
    for(int i=2; i<=n; i++) {
    	dp[i] = i;
    	for(int j=2; j*j <=i; j++) { dp[i] = Math.min(dp[i], dp[i-j*j]+1); }
    }

    위와 같이 dp[1]에만 초기 값을 저장해주고, 2부터 증가하면서 가장 최소 조합의 수를 저장해 나간다.이 코드는 통과를 했는데, 삼항 연산자의 인덱스를 불러오는 부분에서 왜 런타임에러가 떴는지 모르겠다...

     

    코드

     

    import java.io.BufferedReader;
    import java.io.IOException;
    import java.io.InputStreamReader;
    
    public class Main {
        public static void main(String[] args) throws IOException {
            BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
            int n = Integer.parseInt(br.readLine());
            br.close();
            solution(n);
        }
    
        private static void solution(int n) {
            int[] dp = new int[n+1];
            dp[1] =1;
    
            for(int i=2; i<=n; i++) {
                dp[i] = i;
                for(int j=2; j*j <=i; j++) { dp[i] = Math.min(dp[i], dp[i-j*j]+1); }
            }
            System.out.println(dp[n]);
        }
    }
    반응형

    '알고리즘 > 백준' 카테고리의 다른 글

    BOJ) 벽 부수고 이동하기  (0) 2020.07.23
    BOJ) LCS  (0) 2020.07.23
    BOJ) 기타줄  (0) 2020.07.22
    BOJ) 문자열  (0) 2020.07.21
    BOJ) 신기한 소수  (0) 2020.07.21

    댓글

Designed by Tistory.