오늘은 프로그래머스에 있는 콜라츠 추측 문제를 풀었습니다.
제가 문제를 풀다가 막힌 부분이 있어 이번에 리뷰를 하면서 다시 공부를 해보려고 합니다.
콜라츠 추측의 문제는 다음과 같습니다.
1937년 Collatz란 사람에 의해 제기된 이 추측은, 주어진 수가 1이 될때까지 다음 작업을 반복하면, 모든 수를 1로 만들 수 있다는 추측입니다. 작업은 다음과 같습니다.
1-1. 입력된 수가 짝수라면 2로 나눕니다.
1-2. 입력된 수가 홀수라면 3을 곱하고 1을 더합니다.
2. 결과로 나온 수에 같은 작업을 1이 될 때까지 반복합니다.
저는 처음에 이 문제를 do...while로 풀고자 했습니다. 그래서 다음과 같이 코드를 적었는데요.
function solution(num) {
let answer = 0
do {
num % 2 === 0 ? num /= 2 : num = num * 3 +1
answer += 1
if (answer >= 500) {
return -1
}
} while(num !== 1)
return answer
}
계속해서 테스트10 중 1개의 케이스에서 틀렸다고 나왔습니다. 그러다가 do...while의 작동 원리에 대해 고민하기 시작했고 do...while은 조건문과 상관없이 무조건 한 번은 작동한다는 것을 깨달았습니다.
위의 코드는 'num === 1'일 때에도 무조건 한 번 실행되기 때문에 결과 answer는 3이 나오게 되지만 사실은 'num === 1'일 때에는 바로 0이 retrun되게 해야한다는 점을 이해하게 되었고 결국 do...while이 아닌 while문으로 해당 문제를 풀 수 있었습니다.
해당 문제의 코드는 다음과 같이 작성했습니다.
function solution( num ) {
var answer = 0;
while ( num !== 1 ) {
if (answer > 500){
return -1
}
num % 2 === 0 ? num = num / 2 : num = num * 3 + 1
answer++;
}
return answer;
}
문법에 대한 이해를 한층 높일 수 있었던 계기가 되었습니다....ㅎ