연습장

34. 콜라츠 수열 만들기 본문

프로그래머스/0단계

34. 콜라츠 수열 만들기

js0616 2023. 6. 23. 23:16

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

 

제한사항

1 ≤ n ≤ 1,000


문제가 길지만 생각보다 간단한 문제이다.

x가 짝수이면 2로 나누고

x가 홀수이면 3*x+1 을 하면된다.

10 -> 짝수 -> 10 / 2 = 5

5 -> 홀수 -> 3 * 5 + 1  = 16

 

숫자가 1이 될때까지 반복하므로 -> 언제까지 반복할지 모름 -> while 문을 사용한다.

조건은 받은 숫자 n 이 1이 아니면 반복문을 실행 (1이면 종료) 


function solution(n) {
    var answer = [];
    
    answer.push(n) // 맨처음 받은 숫자 n 은 저장이 되지않아서 따로 저장함
    
    while (n!=1){
        if (n%2 ==0){ //  if 문을 통해서 n 의 홀짝 판별 후 각각 n 의 값 처리
            n = n/2
        }
        else {
            n = 3*n+1
        }  
        answer.push(n)  // while 문 마지막에 n 을 저장하고 다시 반복
    }
    
    return answer;
}

 


다른사람 풀이

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)
}

n 을 arr 에 저장 

n 이 1 이면 arr 을 리턴 하고 종료

 

n 이 짝수이면 solution (n/2 , arr) 함수를 호출

n이 1이 아니고 짝수도 아니면 return 문을 통해 (재귀함수) solution ( 3 * n + 1 , arr )  호출 

 

함수 안에서 자기자신을 다시 호출하는 재귀함수 라고 볼 수 있다.

특히 다시 호출할때 n / 2 와 같이 계산을 매개변수 자리에서 하는 점이 인상깊다. 

 

'프로그래머스 > 0단계' 카테고리의 다른 글

36. 간단한 논리 연산  (0) 2023.06.23
35. 배열 만들기 4  (0) 2023.06.23
33. 카운트 업  (0) 2023.06.23
32. 배열 만들기 2  (0) 2023.06.23
31. 수열과 구간 쿼리 4  (0) 2023.06.23