본문 바로가기

알고리즘 코딩

자연수가 몇 번째 콜라프 작업에서 1이 되는지 파악하는 알고리즘

문제는 제목 그대로다. 만약 그 자연수가 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) 작업을 반복해야 하는 함수를 작성할 땐, 그 반복조건에 &&을 써서 여러가지 반복조건을 넣을 수 있다는 점이다.

 

작성해 주신 분께 감사하다.