오류가 계속 나서 알고리즘 스터디들 하는 30분 동안 해결책을 찾았다. 이번 문제는 조건이 많이 제시되어 있어서 이것을 어떻게 효율적으로 풀 수 있을지에 대해 고민했던 것 같다.
주어진 수가 1이면 0을 반환한다.
주어진 수가 0이 아닐 시
500번을 반복할 때까지 1이 되지 않으면 -1을 반환한다.
먼저 주어진 수가 1이었을 때 0을 반환하는 함수를 먼저 실행해주고, 1이 아니었을 때에만 for문을 돌린다. for문에서 돌리는 횟수를 1부터 500 이하로 설정하고, 삼항연산자를 통해 짝수일 때와 홀수일 때의 식을 세우고, num가 1이 되면 i(돌린 횟수)를 리턴하고, 그렇지 않으면 -1을 리턴하도록 코드를 짰다.
function solution(num) {
if (num === 1) {
return 0;
}
for (i = 1; i <= 500; i++) {
num % 2 === 0 ? num / 2 : num * 3 + 1;
if (num === 1) {
return i;
} else {
return -1;
}
}
}
💡내가 한 실수 첫 번째
1. for문 안에서 삼항연산자를 사용할 때 해당 식을 num 값에 할당을 해주지 않았다.
너무 기초적인 실수라 오류를 찾고 나서 살짝 허무한 느낌이...
num % 2 === 0 ? num / 2 : num * 3 + 1;
->num % 2 === 0 ? num = num / 2 : num = num * 3 + 1;
- 제일 앞에 num를 한 번만 할당해도 된다.
->num = num % 2 === 0 ? num / 2 : num * 3 + 1;
💡내가 한 실수 두 번째
num가 1이 되면 i를 리턴하고, 아니면 -1을 리턴하는 부분에서 for문이 한 번만 돌아도 num가 1이 되지 않으면 -1을 리턴하기 때문에, 처음에 모든 수를 console.log로 찍어봐도 -1만 리턴이 되었다. 그래서 리턴문을 for문 밖으로 빼주었더니 정상적으로 실행되었다. for문을 돌릴 때에는 return이 언제 실행되는지 고민하며 풀어야겠다.
for (i = 1; i <= 500; i++) {
num = num % 2 === 0 ? num / 2 : num * 3 + 1;
if (num === 1) {
return i;
}
}
return -1;
}