[프로그래머스] 우박수열 정적분 java

Bong2·2024년 5월 8일
0

알고리즘

목록 보기
14/63

문제 - 우박수열 정적분

문제접근

  1. 문제설명대로 단순히 구현을 하면 되는 문제이다.
  2. 자연수 k를 1로 만드는 우박수열을 좌표로 저장한다. 이때 1로 만들수 있는 횟수도 같이 저장
  3. 0~1 ,1~2 의 각 구간별로 미리 넓이를 구한다.
  4. ranges의 범위대로 각 구간별 넓이를 더하여 결과에 저장한다.
import java.util.*;

class Solution {
    public ArrayList<Double> sum = new ArrayList<>();
    public ArrayList<node> nodes = new ArrayList<>();
    
    public double[] solution(int k, int[][] ranges) {
        double[] answer = new double[ranges.length];
        //자연수 k를 1로 만드는 좌표 및 횟수
        int result = 0;
        int idx = 0;
        while( k != 1)
        {
            nodes.add(new node(idx++,k));
            if(k %2 ==0 )
            {
                k = k/2;
            }else{
                k = (k * 3) + 1;
            }
            result++;
            
        }
        //마지막 구간좌표설정
        nodes.add(new node(idx,k));
        
        //각구간의 넓이구하기
        initRanges(ranges);
        
        //범위가나오면 해당 범위의 넓이의합을 구하여 저장
        for(int i =0;i<ranges.length;i++)
        {
            
            int end = result + ranges[i][1];
            //구간의 시작점이 끝점보다 큰 경우
            if(ranges[i][0] > end)
            {
                answer[i] = -1.0;
                continue;
            }

            for(int start = ranges[i][0]; start < end; start++)
            {
                answer[i] += sum.get(start);
            }
            
        }
        
        return answer;
    }
    
    
    public void initRanges(int [][]ranges)
    {
        //각 구간의 넓이구하기
        for(int i=0;i<nodes.size()-1;i++)
        {
            double a = (double)Math.min(nodes.get(i).y , nodes.get(i+1).y);
            double b = Math.abs(nodes.get(i).y - nodes.get(i+1).y)/2.0;
            sum.add(a+b);
        }
        
    }
    
    
}

class node{
    int x;
    int y;
    
    public node(int x,int y)
    {
        this.x=x;
        this.y=y;
    }
}
profile
자바 백엔드 개발자로 성장하자

0개의 댓글