알고리즘/프로그래머스 Level2

[프로그래머스,Java] Level2: 우박수열 정적분

류창 2022. 11. 25. 17:44

 

문제분석:

문제가 꽤나 난해한 문제다.

 

해야할일 3줄요약:

1. 콜라츠 추측으로 수열 만들기

2. 수열의 구간마다 넓이 구하기

3. 주어진 ranges로 정적분 구하기

 

1. 콜라츠 추측으로 수열만들기 + 2. 수열의 구간마다 넓이구하기

 

콜라츠 추측으로  점을 하나찍고,  이전의 점 current와 비교하여 넓이를 찍어 저장한다.

 

 

3. 주어진  ranges로 정적분구하기

 

여기서 정적분은 쉽게 말하자면 구간의 넓이다. 

<설명을 이해하기 본인도 좀 걸렸다.>

 

EX)  [1,-3]  ->  1부터  마지막수열 -3까지의 넓이

        [3,-2] ->    3부터  마지막수열 -2까지의 넓이

 

단,  시작점이 끝점보다 크면, 고정적으로 -1를 반환해야한다.

 

문제풀이

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
import java.util.*;
class Solution {
    public double[] solution(int k, int[][] ranges) {
        double[] answer = {};
        
        List<Double> list = new ArrayList<>();
        
        int current=0;     
        while(k!=1){
            
            current=k;
            if(k%2==0){
                k/=2;
            }
            else{
                k=k*3+1;
            }
            
            if(Math.max(current,k)==k){
                list.add((k-current)/2.0+current);
            }
            else{
                list.add((current-k)/2.0+k);
            }
            
        }      
        double[] arr=list.stream().mapToDouble(i->i).toArray();
        
        List<Double> list2 = new ArrayList<>();
        
        for(int i=0;i<ranges.length;i++){
            
            double total=0;
            int[] temp = ranges[i];
            
            
            for(int j=temp[0];j<arr.length+temp[1];j++){
                total+=arr[j];
            }
            
            if((arr.length+temp[1])-temp[0]<0){
              total=-1;   
            }
            
            list2.add(total);
            
        }
        
        
        return list2.stream().mapToDouble(i->i).toArray();
    }
}
cs