우박수열 정적분

유성재·2022년 12월 31일
0
post-custom-banner

문제


풀이

문제 설명은 길지만 이 문제는 결국 그래프를 그리고 어떤 구간에 대한 그래프의 넓이를 구하면 되는 간단한 문제이다.

이 문제를 풀기 위해서는 먼저 그래프를 그리고 각 영역이 어느정도 넓이를 가졌는지 구한 다음 제시된 구간마다 그 넓이를 더해주기만 하면 된다.

import java.util.*;

class Solution {
    public double[] solution(int k, int[][] ranges) {
        double[] answer = new double[ranges.length];
        List<Integer> collatz = new ArrayList<>();
        List<Double> area = new ArrayList<>();
        
        //int k 우박수열을 구한다.
        //구한 우박수열을 배열에 저장한다.
        collatz.add(k);
        while(k>1){
            if(k%2==0){
                k/=2;
            }else{
                k*=3;
                k+=1;
            }
            collatz.add(k);
        }

        //구한 우박수열의 각 공간의 면적을 구함
        for(int i=0;i<collatz.size()-1;i++){
            double size = (collatz.get(i)+collatz.get(i+1))/2.0;
            area.add(size);
        }

        
        //ranges에서 시작지점과 종료지점을 받아서 결과값 출력
        for(int i=0; i<ranges.length;i++){
            int start = ranges[i][0];
            int end = area.size()+ranges[i][1];
            
            if(start == end) {
                answer[i] = 0;
            }else if(start>end) {
                answer[i] = -1;
            }else{
                double sum = 0;
                for(int j=start; j<end;j++){
                    sum += area.get(j);
                }
                answer[i] = sum;
            }
        }
        
        return answer;
    }
}

먼저 while문으로 간단하게 우박수열을 구해 arrayList collatz에 넣어주고, 구한 우박수열을 토대로 각 영역의 넓이를 구해 arrayList area에 넣어줬다.

그 다음에는 ranges를 받아 그 내용이 어떤 구간부터 어떤 구간을 원하는지 해석을 하면 되는데,

여기서 ranges는 첫번째 요소가 시작점이 첫 구간을 기준으로 0,1,2...이런 방식으로 구간을 지정하고 두번째 요소가 마지막 구간을 기준으로 0,-1,-2... 이런식으로 표현되는 방식이므로 구해둔 area의 size를 이용하면 쉽게 어떤 구간을 의미하는지 찾을 수 있었다.

이렇게 해석이 끝나면 원하는 결과값을 제출해주기만 하면 된다.

profile
열정 있는 개발자
post-custom-banner

0개의 댓글