숫자가 주어졌을 때, 콜라츠 수열 규칙에 따라서 변환하는 과정을 거치며 얻은 수열을 반환하는 함수를 작성한다.
콜라츠 수열의 규칙
숫자가 짝수일 때: 2로 나눈다.
숫자가 홀수일 때: 3을 곱하고 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;
}
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;
}
가독성 :
while(n !== 1)
이라는 조건을 사용해 1에 도달하지 않았을 때의 동작만을 반복문 안에 표현하고, 1에 도달하면 반복문 밖에서 처리한다.n
이 1인 경우를 확인하고 바로 break
로 루프를 종료한다.확장성 :
while
문 바깥에 코드를 추가하기 쉽다.break
문 사용으로 인해 로직을 변경하거나 추가하는 것이 약간 더 복잡할 수 있다.성능 :
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
함수를 호출한다.