[JavaScript] 콜라츠 추측 (Collatz conjecture)

문제 설명

  • 1937년 Collatz란 사람에 의해 제기된 이 추측은, 주어진 수가 1이 될 때까지 다음 작업을 반복하면, 모든 수를 1로 만들 수 있다는 추측입니다. 작업은 다음과 같습니다.

1-1. 입력된 수가 짝수라면 2로 나눕니다.

1-2. 입력된 수가 홀수라면 3을 곱하고 1을 더합니다.

2. 결과로 나온 수에 같은 작업을 1이 될 때까지 반복합니다.

  • 예를 들어, 주어진 수가 6이라면 6 → 3 → 10 → 5 → 16 → 8 → 4 → 2 → 1 이 되어 총 8번 만에 1이 됩니다. 위 작업을 몇 번이나 반복해야 하는지 반환하는 함수, solution을 완성해 주세요. 단, 주어진 수가 1인 경우에는 0을, 작업을 500번 반복할 때까지 1이 되지 않는다면 –1을 반환해 주세요.

제한 사항

  • 입력된 수, num은 1 이상 8,000,000 미만인 정수입니다.

    입출력 예

    nresult
    68
    164
    626331-1

n result 6 8 16 4 626331 -1

입출력 예 설명

  • 입출력 예 #1

    • 문제의 설명과 같습니다.
  • 입출력 예 #2

    • 16 → 8 → 4 → 2 → 1 이 되어 총 4번 만에 1이 됩니다.
  • 입출력 예 #3

    • 626331은 500번을 시도해도 1이 되지 못하므로 -1을 리턴해야 합니다.

(25.Sept.2022) 오랜만에 어려운 문제에 봉착했따... 🥲 30분을 넘겨버렸고 문제는 풀지 못했다. 반복문/ 조건문을 어떻게 잘 사용하면 될것 같은데 문제가 풀리지 않는다. 일단 아래는 내가 생각해 본 답. num이 1이 나올 때 까지 반복재생하는 로직인데 .. 뭐가 잘못된건지 오류가 뜬다 ㅠㅠ

const num = 6

function solution(num){
  let count = 0;
  while(num===1){
    if(num%2 === 0) {
    num = num/2
    count++;
  } else {
   num = num*3+1
   count++;
  }
  return count;
  }

console.log(solution(num))

결국 어제 답을 보고 오늘 아침에 다시 풀어봤다. 인간은 역시 망각의 동물인지 다시 또 기억이 나지 않는다. 이것저것 해보다가 우연히 맞췄고 그다음 나의 답이 해석이 됬다 😅 해석하고나서 'wow'했다.

나의 풀이

function solution(num) {
    count = 0;
    while(count <= 500){
        if(num===1){return count}
        num = num%2 ? num*3+1 : num/2
        count++
    }
    return -1
}

일단 count를 return 해야하니 count=0;을 선언. while에 500번까지 반복을 설정해 놓고, 만약 num이 1이면 count를 return 하게 설정. 초기 count 가 0이라 처음부터 1이 나온 경우 바로 count 초기값 즉 1이 return 된다. 그다음 num 이 1이 아니면 짝수 홀수를 판단해서 그에 상응하는 식을 대입해주고 한번 지나칠때마다 count++로 count를 하나씩 늘려준다. 결국 num 이 1이 되면 count를 return해주는 구조! 처음에 return count가 아닌 return 0으로 설정해 놔서 조금 해멨지만 다행히 방법을 찾았다! 😁