[프로그래머스-기초] 콜라츠 수열 만들기

JiEun·2023년 12월 18일
0

코테/코플릿

목록 보기
33/56

콜라츠 수열 만들기

문제 설명

모든 자연수 x에 대해서 현재 값이 x이면 x가 짝수일 때는 2로 나누고, x가 홀수일 때는 3 * x + 1로 바꾸는 계산을 계속해서 반복하면 언젠가는 반드시 x가 1이 되는지 묻는 문제를 콜라츠 문제라고 부릅니다.

그리고 위 과정에서 거쳐간 모든 수를 기록한 수열을 콜라츠 수열이라고 부릅니다.

계산 결과 1,000 보다 작거나 같은 수에 대해서는 전부 언젠가 1에 도달한다는 것이 알려져 있습니다.

임의의 1,000 보다 작거나 같은 양의 정수 n이 주어질 때 초기값이 n인 콜라츠 수열을 return 하는 solution 함수를 완성해 주세요.

제한사항

1 ≤ n ≤ 1,000

입출력 예

nresult
10[10, 5, 16, 8, 4, 2, 1]

입출력 예 설명

입출력 예 #1
순서대로 연산한 결과를 표로 만들면 다음과 같습니다.

연산 횟수x홀짝 여부
010짝수
15홀수
216짝수
38짝수
44짝수
52짝수
61홀수

따라서 [10, 5, 16, 8, 4, 2, 1]을 return 합니다.

💻 내가 작성한 코드

function solution(n) {
    let result = [n];
    while(n !== 1){
        if(n % 2 === 0){
            n = n / 2;
            result.push(n);            
        } else {
            n = (3 * n) + 1;
            result.push(n);
        }
    }
    return result
}

처음에는 for문으로 작성했다.
그러니 n번째 까지 반복하는 문제가 있었다.

반복문은 for문, while문이 존재한다.
이번 문제는 while문으로 작성해서 푸는 문제인 것 같았다.

while 문

  • 조건문이 참일 때 실행되는 반복문이다.
  • 조건은 문장안이 실행되기 전에 참, 거짓을 판단한다.

출처 - mdn

조건이 만족 할 때 까지 진행한다.

n !== 1 n이 1이 아닐 경우 true이고 맞으면 false가 된다.
즉, n이 1이 아닐 경우 while문 내부를 계속 순환한다.

result라는 배열을 만들고 반복문 전의 값인 n을 미리 넣어 주었다.
조건이 맞을 때마다 n을 재할당하고 재할당 된 n을 result에 push해 주었다.

그렇게 순환하다 n이 1이 되는 경우 false가 되어 반복문을 빠져 나온다.

💻 다른 사람이 작성한 코드

function solution(n, arr = []) {
    arr.push(n)
    if (n === 1) return arr
    if (n % 2 === 0) return solution(n / 2, arr)
    return solution(3 * n + 1, arr)
}

이분은 재귀 함수를 활용해 작성하셨다.
이렇게 하나 더 배워간다.


✏️ 마치며

사실 이번 문제를 통해 while문을 제대로 알게 되었다.
항상 반복문은 for문만 사용해 while문을 제대로 사용한 적이 없었다.

조반에 while문을 작성할 때 let num = n n이라는 값을 num이라는 변수에 할당해 주면서 진행하다 보니 값이 꼬이는 문제가 있었다.

쓸데없는 변수는 만들지 말자.

라는 말이 생각나 num 변수는 지웠다.

또한 if-else가 아닌 if-if로 나눠 짝수일 때, 홀수 일 때를 나눠 작업했는데
if문으로 이미 짝수인지 아닌지 나눠 졌기 때문에 if문으로 또 조건을 작성할 필요가 없었다.

profile
💻 프론트엔드를 목표로 성장 중! (알아봤던 내용 등을 정리하기)

0개의 댓글