[programmers] 콜라츠 수열 만들기

J-Cheol·2023년 11월 14일
0

프로그래머스

목록 보기
18/27
post-thumbnail

문제


프로그래머스 문제링크

풀이 코드


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. 1이상 1000이하의 정수를 콜라츠 수열로 반환하는 문제입니다.
  2. 콜라츠 수열에서 1000이하인 경우 871이 제일 긴 과정을 거치게 됩니다.(179회)
    2-1. 배열의 크기를 200으로 넉넉하게 잡아주었습니다.
    2-2. answer 배열에 n의 콜라츠 수열을 담아주었습니다.
    2-3. n = 1이 되게 된다면 콜라츠 수열이 종료되었다는 것을 의미하며 반복문을 탈출해줍니다.
  3. 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;
    }
}
profile
신입 백엔드 개발자(JAVA, Spring Boot, MYSQL)

0개의 댓글