콜라츠 수열 만들기

문제설명

숫자가 주어졌을 때, 콜라츠 수열 규칙에 따라서 변환하는 과정을 거치며 얻은 수열을 반환하는 함수를 작성한다.

콜라츠 수열의 규칙

숫자가 짝수일 때: 2로 나눈다.
숫자가 홀수일 때: 3을 곱하고 1을 더한다.

이 규칙을 계속 적용하면, 언젠가는 숫자 1에 도달하게 된다.

반복문의 활용

주어진 숫자가 1에 도달할 때까지 콜라츠 수열의 규칙을 반복적으로 적용해야 한다.

풀이

반복문

반복문 1

function solution(n) {
  let answer = [];
  	
  // n이 1이 아닐때까지만 반복 
  while(n !== 1) {
    answer.push(n); // 현재 n값을 answer 배열에 추가
    if(n % 2 === 0){
      n = n / 2;
    } else {
      n = 3 * n + 1;
    }
  }
  answer.push(1); // 1이 아닐때까지만 반복했기 때문에 마지막에 1을 추가
  return answer;
}

반복문 2

function solution(n){
  let answer = [];
  
  // n이 1이 될 때까지 포함하여 반영
  while(n){
    answer.push(n);
    if(n === 1) break; // n이 1이면 루프 종료
    
    if(n % 2 === 0){
      n = n / 2;
    } else {
      n = 3 * n +1;
    }
  }
  return answer;
}

두 코드의 차이

  1. 가독성 :

    • 첫 번째 코드while(n !== 1)이라는 조건을 사용해 1에 도달하지 않았을 때의 동작만을 반복문 안에 표현하고, 1에 도달하면 반복문 밖에서 처리한다.
      이는 반복문의 조건과 그 조건에 따른 동작이 명확하게 구분되어 이해하기 쉽다.
    • 두 번째 코드는 반복문 내에서 n이 1인 경우를 확인하고 바로 break로 루프를 종료한다.
      이는 코드의 흐름을 중간에 끊을 수 있기 때문에, 일부 개발자들은 이런 방식을 선호하지 않을 수 있다.
  2. 확장성 :

    • 첫 번째 코드는 1에 도달했을 때의 추가적인 동작이 필요하면 while문 바깥에 코드를 추가하기 쉽다.
    • 두 번째 코드break문 사용으로 인해 로직을 변경하거나 추가하는 것이 약간 더 복잡할 수 있다.
  3. 성능 :

    • 두 코드 모두 성능상 큰 차이는 없다.

재귀함수

function solution(n, arr = []){
  arr.push(n); // 현재 숫자 n을 배열에 넣는다.
  if (n === 1) return arr; // n이 1이면, 더 이상 변환할 필요가 없으니 배열을 반환한다.
  if (n % 2 === 0) return solution(n / 2, arr); // n이 짝수면, 2로 나눈 값으로 함수를 다시 호출 (재귀 호출)
  return solution(3 * n + 1, arr) // n이 홀수면, 3을 곱하고 1을 더한 값으로 함수를 다시 호출
}

코드 분석 (재귀 방식)

이 함수는 주어진 숫자 n에 대하여 콜라츠 수열 규칙을 재귀적으로 적용하여 수열을 생성한다.
각 숫자는 해당 숫자가 1이 될 때까지의 변호나 과정을 거친 후 arr배열에 추가된다.

기저 조건

if (n === 1) return arr;

n이 1이면 콜라츠 수열 생성을 종료하고 현재까지 생성된 수열 arr을 반환한다.

짝수 판별 및 재귀 호출

if (n % 2 === 0) return solution(n / 2, arr);

n이 짝수일 경우, n을 2로 나눈 값을 새로운 n값으로 하여 재귀적으로 solution함수를 호출한다.

홀수일 경우의 재귀 호출

return solution(3 * n + 1, arr);

n이 홀수일 경우, 3 * n + 1값을 새로운 n값으로 하여 재귀적으로 solution 함수를 호출한다.

profile
해내는 사람

0개의 댓글

Powered by GraphCDN, the GraphQL CDN