문제 설명
- 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 미만인 정수입니다.
입출력 예
n result 6 8 16 4 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으로 설정해 놔서 조금 해멨지만 다행히 방법을 찾았다! 😁