문제 - 우박수열 정적분
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;
}
}