프로그래머스 콜라츠 수열 만들기

KIMYEONGJUN·2026년 5월 20일
post-thumbnail

문제

내가 생각했을때 문제에서 원하는부분

모든 자연수 x에 대해서 현재 값이 x이면 x가 짝수일 때는 2로 나누고, x가 홀수일 때는 3 * x + 1로 바꾸는 계산을 계속해서 반복하면 언젠가는 반드시 x가 1이 되는지 묻는 문제를 콜라츠 문제라고 부릅니다.
그리고 위 과정에서 거쳐간 모든 수를 기록한 수열을 콜라츠 수열이라고 부릅니다.
계산 결과 1,000 보다 작거나 같은 수에 대해서는 전부 언젠가 1에 도달한다는 것이 알려져 있습니다.
임의의 1,000 보다 작거나 같은 양의 정수 n이 주어질 때 초기값이 n인 콜라츠 수열을 return 하는 solution 함수를 완성해 주세요.

내가 이 문제를 보고 생각해본 부분

콜라츠 수열을 저장하기 위해 ArrayList<Integer>를 사용하였다.
주어진 시작 값 n을 변수 x에 할당하고, 리스트에 첫 값을 추가하였다.
while (x != 1) 조건으로 x가 1이 될 때까지 아래 규칙대로 값을 갱신하였다.
x가 짝수일 때는 2로 나누었고, 홀수일 때는 3 * x + 1로 변경하였다.
매번 새로 계산된 값을 리스트에 추가하였다.
모든 값이 추가되면 리스트를 int[] 배열로 변환하여 반환하였다.
main 메서드에서 solution(10) 실행 시, 배열을 [10, 5, 16, 8, 4, 2, 1] 형태로 콘솔에 출력하도록 Arrays.toString()을 사용하였다.

코드로 구현

import java.util.ArrayList;

class Solution {
    public int[] solution(int n) {
        ArrayList<Integer> sequence = new ArrayList<>();
        int x = n;
        sequence.add(x);

        while (x != 1) {
            if (x % 2 == 0) {
                x = x / 2;
            } else {
                x = 3 * x + 1;
            }
            sequence.add(x);
        }

        int[] answer = new int[sequence.size()];
        for (int i = 0; i < sequence.size(); i++) {
            answer[i] = sequence.get(i);
        }

        return answer;
    }
}

프로그래머스 코드

package programmers;

import java.util.ArrayList;
import java.util.Arrays;

// 프로그래머스 콜라츠 수열 만들기
public class Main26 {
    public static int[] solution(int n) {
        ArrayList<Integer> sequence = new ArrayList<>();
        int x = n;
        sequence.add(x);

        while (x != 1) {
            if (x % 2 == 0) {
                x = x / 2;
            } else {
                x = 3 * x + 1;
            }
            sequence.add(x);
        }

        // 출력용 배열을 바로 만들어서 출력할 수 있도록 변경하였다.
        int[] answer = new int[sequence.size()];
        for (int i = 0; i < sequence.size(); i++) {
            answer[i] = sequence.get(i);
        }

        // 원하는 배열 형태 문자열를 출력하기 위해 Arrays.toString()을 사용하였다.
        System.out.println(Arrays.toString(answer));

        return answer;
    }

    public static void main(String[] args) {
        solution(10);  // [10, 5, 16, 8, 4, 2, 1] 형식으로 콘솔 출력된다.
    }
}

위에 있는 코드를 변경한 코드

마무리

코드와 설명이 부족할수 있습니다. 코드를 보시고 문제가 있거나 코드 개선이 필요한 부분이 있다면 댓글로 말해주시면 감사한 마음으로 참고해 코드를 수정 하겠습니다.

profile
Junior backend developer

0개의 댓글