import java.util.Arrays; class Solution { public int[] solution(int n) { int[] answer = new int[200]; answer[0] = n; int i = 1; while(i < 200) { if (n % 2 == 0) n = n / 2; else n = (3 * n) + 1; answer[i] = n; if (n == 1) break; i++; } int[] result = new int[i+1]; result = Arrays.copyOf(answer, i+1); return result; } }
- 1이상 1000이하의 정수를 콜라츠 수열로 반환하는 문제입니다.
- 콜라츠 수열에서 1000이하인 경우 871이 제일 긴 과정을 거치게 됩니다.(179회)
2-1. 배열의 크기를 200으로 넉넉하게 잡아주었습니다.
2-2. answer 배열에 n의 콜라츠 수열을 담아주었습니다.
2-3. n = 1이 되게 된다면 콜라츠 수열이 종료되었다는 것을 의미하며 반복문을 탈출해줍니다.2-1
에서 넉넉하게 잡아준 배열의 크기때문에 생긴 빈 공간을 result 배열을 선언해주며 배열의 크기는 위에 연산된 i의 크기 + 1 만큼으로 잡아줍니다.
3-1. answer에 담겨져있는 콜라츠 수열을 result에 복사하여줍니다.
3-2. 이때 Arrays.copyOf를 사용하여 원하는 범위만큼만 복사를 진행합니다.
아래는 ArrayList를 사용하여 배열의 크기를 동적으로 할당하여 풀었습니다.
import java.util.Arrays; import java.util.ArrayList; class Solution { public int[] solution(int n) { ArrayList<Integer> answer = new ArrayList<>(); answer.add(n); int i = 1; while(i < 179) { if (n % 2 == 0) n = n / 2; else n = (3 * n) + 1; answer.add(n); if (n == 1) break; i++; } i = 0; int[] result = new int[answer.size()]; // int[] result 선언과 초기화 while (i < answer.size()) // ArrayList<Integer> -> int[]로 변환 { result[i]= answer.get(i); i++; } return result; } }