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

조건호·2023년 8월 26일
0

코딩 테스트

목록 보기
7/9

1. 문제 설명

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

2. 문제를 풀기 위한 생각

  1. 빈 배열 만들기
  2. 1이 되기 전까지 조건식을 돌려야함
  3. 조건식에 나온 숫자들을 배열에 넣기

3. 코드

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

입력값 〉 10
기댓값 〉 [10, 5, 16, 8, 4, 2, 1]
실행 결과 〉 실행한 결괏값 [ 5 ,16 ,8 ,4 ,2 ,1 ]이 기댓값 [10, 5, 16, 8, 4, 2, 1]과 다릅니다.

이렇게 해주니까 가장 큰 n의 값이 들어가지 않아서 아래와 같이 바꿔주었습니다.

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

여기서 궁금했던 거는 다른 분들의 코드를 봤는데 저의 코드랑 다른 점이 하나 있었는데 n을 푸쉬하는 지점이 다른 것이 였습니다.

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

입력값 〉 10
기댓값 〉 [10, 5, 16, 8, 4, 2, 1]
실행 결과 〉 실행한 결괏값 [ 10, 5 ,16 ,8 ,4 ,2 ]이 기댓값 [ 10 ,5 ,16 ,8 ,4 ,2 ,1 ]과 다릅니다.

4. push를 하는 지점에 따라 답이 달라지는 이유?

result.push(n)에 위치에 따라서 답이 달라지는 이유는 무엇일까?

조건식 if(n%2===0) 위에 result.result(n) 를 써주면 식이 발동되기 전부터 기존의 n값이 제일 먼저 들어가기 때문에 그렇습니다.

저처럼 처음이 아닌 마지막에 쓰게 되면 조건식이 발동한 후부터 push가 되기 때문에 기존 값 n값이 들어가지 않게 됩니다.

profile
주니어 프론트엔드 개발자입니다.

0개의 댓글