본문 바로가기

Programmers

[프로그래머스][JAVA]Lv. 2 - 우박수열 정적분

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

 

프로그래머스

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

programmers.co.kr

1-1. 입력된 수가 짝수라면 2로 나눕니다.
1-2. 입력된 수가 홀수라면 3을 곱하고 1을 더합니다.
2.결과로 나온 수가 1보다 크다면 1번 작업을 반복합니다.
private void Collatz(int k, ArrayList<Integer> list) {
	list.add(k);
        while(k > 1) {
            if (k % 2 == 0) k = k / 2;
            else k = k * 3 + 1;
            list.add(k);
        }
    }

list에 해당 작업의 결과를 저장.

 

그래프를 보면 꺾이는 부분을 기준으로 그전 부분을 삼각형과 사각형으로 넓이를 구할 수 있음.

for (int i = 0; i < list.size()-1; i++) {
            float triangle = (float) (list.get(i+1) - list.get(i)) / 2;
            float rectangle = list.get(i);
            list2.add(triangle + rectangle);
        }

list2에 꺽이는 점의 이전 부분의 넓이(삼각형 + 사각형)를 저장.

for (int i = 0; i < ranges.length; i++) {
            int x1 = ranges[i][0];
            int x2 = list2.size() + ranges[i][1];
            float result = 0;
            if (x2 < x1) ans.add((float) -1.0);
            else if (x2 == x1) ans.add(result);
            else {
                for (int j = x1; j <= x2 - 1; j++) {
                    result += list2.get(j);
                }
                ans.add(result);
            }
        }

시작하는 지점을 x1, 끝나는 지점을 x2로 지정.

x2가 x1보다 큰 값이라면 x1 -> x2까지의 넓이의 합을 각 부분의 넓이인 list2를 이용하여 구함.

import java.util.ArrayList;
class Solution {
    public double[] solution(int k, int[][] ranges) {
        ArrayList<Integer> list = new ArrayList<>();
        ArrayList<Float> list2 = new ArrayList<>();
        ArrayList<Float> ans = new ArrayList<>();
        
        Collatz(k, list);
        
        for (int i = 0; i < list.size()-1; i++) {
            float triangle = (float) (list.get(i+1) - list.get(i)) / 2;
            float rectangle = list.get(i);
            list2.add(triangle + rectangle);
        }
        
        for (int i = 0; i < ranges.length; i++) {
            int x1 = ranges[i][0];
            int x2 = list2.size() + ranges[i][1];
            float result = 0;
            if (x2 < x1) ans.add((float) -1.0);
            else if (x2 == x1) ans.add(result);
            else {
                for (int j = x1; j <= x2 - 1; j++) {
                    result += list2.get(j);
                }
                ans.add(result);
            }
        }
        
        double[] answer = new double[ans.size()];
        for (int i = 0; i < ans.size(); i++) {
            answer[i] = ans.get(i);
        }
        return answer;
    }

    private void Collatz(int k, ArrayList<Integer> list) {
    	list.add(k);
        while(k > 1) {
            if (k % 2 == 0) k = k / 2;
            else k = k * 3 + 1;
            list.add(k);
        }
    }
}