프로그래머스 | 우박수열 정적분 (Java)

mul·2024년 10월 10일
0

알고리즘

목록 보기
64/65
post-custom-banner

🔒문제

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

🔑해결

우박수열의 초항 k와, 정적분을 구하는 구간들의 목록 ranges가 주어졌을 때 정적분의 결과 목록을 return 하도록 solution함수를 작성하는 문제이다.

구간 [a,b]가 주어졌을 때, 정적분 넓이는 [a, n+b]로 둘러쌓인 공간의 면적을 구해야 한다. 우박수열을 구하는 작업을 수행할 때마다 높이가 1인 사다리꼴의 넓이를 구하여 ArrayList에 저장하고, 주어진 범위에 맞춰 구한 넓이를 더해주는 방법을 사용했다.

🔓코드

import java.util.ArrayList;
class Solution {
    public double[] solution(int k, int[][] ranges) {
    double[] answer = new double[ranges.length];

    // 우박수열 계산
    ArrayList<Double> areas = calculateArea(k);
    int n = areas.size() - 1;

    // 주어진 범위의 넓이 계산
    for (int i = 0; i < ranges.length; i++) {
      int s = ranges[i][0];
      int e = n + ranges[i][1];

      if (s > e) {
        answer[i] = -1.0;
      } else {

        for (int j = s+1; j <= e; j++) {
          answer[i] += areas.get(j);
        }

      }
    }

    return answer;
  }

  private ArrayList<Double> calculateArea(int k) {
    int before = k;
    ArrayList<Double> areas = new ArrayList<>();
    areas.add(0.0);

    while (k > 1) {
      if (k % 2 == 0) {
        k = k / 2;
      } else {
        k = k * 3 + 1;
      }

      double area = (k + before) / 2.0;
      areas.add(area);

      before = k;
    }

    return areas;
  }
}
post-custom-banner

0개의 댓글