본문 바로가기

알고리즘 공부 및 문제 풀이/프로그래머스(PRO)

[pro] 프로그래머스 level2 134239 우박수열 정적분 (Java) - 시뮬레이션

[문제]

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

 

프로그래머스

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

programmers.co.kr

 

[풀이]

단순 구현. 모든 x좌표에 대해서 우박수열의 꺾은 선 그래프에 의해 생기는 사다리꼴의 넓이를 구해서 저장해 준 후 사용하였다. 

 

[코드]

 

import java.util.*;

class Solution {
    public double[] solution(int k, int[][] ranges) {
        double[] answer = {};
        //정적분의 결과 목록을 return 
        List<Integer> list = new ArrayList<>();
        list.add(k);
        while(k>1){
            if(k%2==1){
                k = k*3 + 1;
                list.add(k);
            }
            else{
                k /= 2;
                list.add(k);
            }
        }
        
        //너비 구하기
        List<Double> area = new ArrayList<>();
        for(int i=0; i<list.size()-1; i++){
            double a = (list.get(i) + list.get(i+1))/2.0;
            area.add(a);
        }
        
        int idx = 0;
        answer = new double[ranges.length];
        for(int[] r:ranges){
            int x1 = r[0];
            int x2 = list.size()-1 + r[1];
            
            if(x1>x2){
                answer[idx++] = -1;
                continue;
            }
            
            double sum = 0;
            for(int i=x1; i<x2; i++){
                sum += area.get(i);
            }
            
            answer[idx++] = sum;
        }
        
        return answer;
    }
}