문제는 제목 그대로다. 만약 그 자연수가 500번째 콜라프 작업으로도 1이 되지 않는다면 함수는 -1을 반환해야 한다.
자세한 문제는 아래와 같다.
https://school.programmers.co.kr/learn/courses/30/lessons/12943
재귀함수를 써야 할 거 같아서 1.5시간 이상 고생했으나 실패했다. 여기 while문으로 해결한 사례가 있어서 주석으로 파보았다.
코드는 거의 외운거 같다.
function collatz(num) {
var answer = 0 ;
while(num !== 1 && answer < 500) {
// answer <= 500 이 아니라 < 인 이유는 <= 을 쓰면
// 콜라프 작업 500번을 하고도 while 문이 끝나지 않아
// 501번째 콜라프 작업에서 1이 되는 숫자가 존재한다면 return 값이 501이 될 수도 있기 때문이다.
num % 2 ===0 ? num = num / 2 : num = num * 3 + 1
answer ++
}
return num === 1 ? answer : -1
// 최대 500번까지 콜라프 작업을 반복하다가 num이 1이 되면 해당 반복횟수(answer)를 반환한다.
// 반복문이 끝났는데 num===1 이 아니라면 그것은 반복횟수가 500회를 채웠기 때문이다. 따라서 -1 반환.
}
// 아래는 테스트로 출력해 보기 위한 코드입니다.
console.log( collatz(6) );
이번 문제에서 특별히 기억할 점은
1) while 문의 기본문법. 내 brain 메모리에 들어가 있어야 바로바로 꺼내올 수 있을 것이다.
2) 작업을 반복해야 하는 함수를 작성할 땐, 그 반복조건에 &&을 써서 여러가지 반복조건을 넣을 수 있다는 점이다.
작성해 주신 분께 감사하다.
'알고리즘 코딩' 카테고리의 다른 글
최소직사각형 알고리즘 feat. apply() 메서드 (0) | 2023.04.18 |
---|---|
자연수가 하샤드 수인지 판별하는 알고리즘 (0) | 2023.04.18 |
단어별로 짝수번째 index의 문자만 대문자로 만들기 알고리즘 (2) | 2023.04.16 |
정규 표현식으로 숫자만 들어가는지 확인하기 (0) | 2023.04.16 |
배열 2개의 내적 구하는 알고리즘 feat. reduce(acc, _, i) (0) | 2023.04.16 |