우박수열의 초항 k와, 정적분을 구하는 구간들의 목록 ranges가 주어졌을 때 정적분의 결과 목록을 return 하도록 solution함수를 작성하는 문제이다.
구간 [a,b]가 주어졌을 때, 정적분 넓이는 [a, n+b]로 둘러쌓인 공간의 면적을 구해야 한다. 우박수열을 구하는 작업을 수행할 때마다 높이가 1인 사다리꼴의 넓이를 구하여 ArrayList에 저장하고, 주어진 범위에 맞춰 구한 넓이를 더해주는 방법을 사용했다.
import java.util.ArrayList;
class Solution {
public double[] solution(int k, int[][] ranges) {
double[] answer = new double[ranges.length];
// 우박수열 계산
ArrayList<Double> areas = calculateArea(k);
int n = areas.size() - 1;
// 주어진 범위의 넓이 계산
for (int i = 0; i < ranges.length; i++) {
int s = ranges[i][0];
int e = n + ranges[i][1];
if (s > e) {
answer[i] = -1.0;
} else {
for (int j = s+1; j <= e; j++) {
answer[i] += areas.get(j);
}
}
}
return answer;
}
private ArrayList<Double> calculateArea(int k) {
int before = k;
ArrayList<Double> areas = new ArrayList<>();
areas.add(0.0);
while (k > 1) {
if (k % 2 == 0) {
k = k / 2;
} else {
k = k * 3 + 1;
}
double area = (k + before) / 2.0;
areas.add(area);
before = k;
}
return areas;
}
}