문제 설명은 길지만 이 문제는 결국 그래프를 그리고 어떤 구간에 대한 그래프의 넓이를 구하면 되는 간단한 문제이다.
이 문제를 풀기 위해서는 먼저 그래프를 그리고 각 영역이 어느정도 넓이를 가졌는지 구한 다음 제시된 구간마다 그 넓이를 더해주기만 하면 된다.
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를 이용하면 쉽게 어떤 구간을 의미하는지 찾을 수 있었다.
이렇게 해석이 끝나면 원하는 결과값을 제출해주기만 하면 된다.