study
우박수열 정적분[프로그래머스]
Date: 2026-05-29 07:14
Update: 2026-05-29 07:16


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

접근법:

  1. 콜라츠 수열을 계산한다
  2. 범위 내의 정적분을 계산한다.
    1. 콜라츠 수열 사이의 넓이 = (y1 + y2) * 1 / 2
    2. 범위내에서 반복한다.
    3. 합계를 구해 정답에 채워넣는다
#include <string>
#include <vector>
using namespace std;


vector<int> calculateCollatz(int n)
{
    vector<int> result;
    result.push_back(n);
    while(n > 1)
    {
        if(n & 1) n = n * 3 + 1;
        else n /= 2;
        result.push_back(n);
    }
    return result;
}

vector<double> solution(int k, vector<vector<int>> ranges) {
    vector<double> answer;
    vector<int> collatz = calculateCollatz(k);
    int n = ranges.size(); 
    for(int i = 0; i < n; ++i)
    {
        int start = ranges[i][0];
        int end = collatz.size() - 1 + ranges[i][1];
        if(start > end)
        {
            answer.push_back(-1.0);
            continue;
        } else if(start == end)
        {
            answer.push_back(0);
            continue;
        }
        double sum = 0;
        for(int j = start; j < end; ++j)
        {
            double area = (collatz[j] + collatz[j + 1]) / 2.f;
            sum += area;
        }
        answer.push_back(sum);
    }
    return answer;
}