JAVA/Coding Test

[JAVA] 프로그래머스 우박수열 정적분_누적합

오늘도개발 2024. 9. 3. 19:50

 

문제 : https://school.programmers.co.kr/learn/courses/30/lessons/134239

 

프로그래머스

코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요.

programmers.co.kr

 

 

접근 : 

 

  - 주어진 조건 대로 연산을 수행한다.

1-1. 입력된 수가 짝수라면 2로 나눕니다.
1-2. 입력된 수가 홀수라면 3을 곱하고 1을 더합니다.
2.결과로 나온 수가 1보다 크다면 1번 작업을 반복합니다.

 

 

  - 각 인덱스에 해당하는 정적분을 계산하여 저장한다.

 

  - 0 ~ 끝까지 누적합을 계산하여 저장한다.

 

  - range 입력에 따라서 누적합을 이용하여 해당범위의 넓이를 구한다.

 

 

 코드 구현 : 

 

import java.util.*;

class Solution {
    public double[] solution(int k, int[][] ranges) {

        List<Integer> res = new ArrayList<>();
        res.add(k);
        while(k > 1){
            if(k%2 == 0) k = k/2;
            else k = 3*k + 1;
            res.add(k);
        }

        double[] answer = new double[ranges.length];
        double[] temp_sum = new double[res.size()];
        int a,b;
        temp_sum[0] = 0;

        for(int i = 1 ; i < res.size() ; i++){
            if(res.get(i-1) < res.get(i)){
                a = i;
                b = i-1;
            }else{
                a = i-1;
                b = i;
            }
            temp_sum[i] = temp_sum[i-1] + (double) (res.get(a) - res.get(b))/2 + res.get(b);
        }

        double before, after;
        for(int i = 0 ; i < ranges.length ; i++){
            if(temp_sum.length + ranges[i][1] < 1 || ranges[i][0] >= temp_sum.length ){
                answer[i] = -1;
                continue;
            }
            before = temp_sum[ranges[i][0]];
            after = temp_sum[temp_sum.length + ranges[i][1] - 1];

            answer[i] = after - before;
            answer[i] = answer[i] < 0 ? -1 : answer[i];
        }
        return answer;
    }
 }