https://school.programmers.co.kr/learn/courses/30/lessons/134239
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);
}
}
}
'Programmers' 카테고리의 다른 글
[프로그래머스][JAVA]Lv. 2 - 캐시 (0) | 2023.03.27 |
---|---|
[프로그래머스][JAVA]Lv. 2 - 프렌즈4블록 (0) | 2023.03.27 |
[프로그래머스][JAVA]Lv. 2 - 뉴스 클러스터링 (1) | 2023.03.14 |
[프로그래머스][JAVA]Lv. 2 - 예상 대진표 (0) | 2023.03.12 |
[프로그래머스][JAVA]Lv. 2 - 영어 끝말잇기 (0) | 2023.03.06 |