ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • #AIL_23.11.28 // Programmers_콜라츠 추측
    AIL( Algorithm I Learned) 2023. 11. 28. 09:48

    ## AIL_콜라츠 추측

    ***문제 설명
    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

    ***입출력 예 설명
    입출력 예 #1문제의 설명과 같습니다.
    입출력 예 #216 → 8 → 4 → 2 → 1 이 되어 총 4번 만에 1이 됩니다.
    입출력 예 #3626331은 500번을 시도해도 1이 되지 못하므로 -1을 리턴해야 합니다.

    ## solution.JavaScript

    1. 문제의 접근 방식

    주어진 문제는 Collatz 추측을 따라 주어진 수가 1이 될 때까지 작업을 반복하며, 작업을 반복한 횟수를 반환하는 것입니다. 작업 규칙은 주어진 수가 짝수인 경우에는 2로 나누고, 홀수인 경우에는 3을 곱하고 1을 더하는 것입니다. 주어진 수가 1인 경우에는 0을 반환하며, 작업을 500번 반복하여도 1이 되지 않는 경우에는 -1을 반환해야 합니다. 해당 문제는 주어진 수에 대해 반복적으로 작업을 수행하는 것이며, 이 작업을 수행하면서 작업 횟수를 증가시키면 됩니다.


    2. 문제풀이

    function solution(num) {
        let answer = 0;  // 작업 횟수를 기록할 변수
    
        while (num !== 1) {
            if (answer >= 500) {  // 500번 이상 반복하여도 1이 되지 않는 경우
                return -1;
            }
    
            if (num % 2 === 0) {  // 주어진 수가 짝수인 경우
                num /= 2;
            } else {  // 주어진 수가 홀수인 경우
                num = num * 3 + 1;
            }
    
            answer++;  // 작업 횟수 증가
        }
    
        return answer;  // 작업을 반복한 횟수 반환
    }
    /*
    테스트 1
    입력값 〉	6
    기댓값 〉	8
    실행 결과 〉	테스트를 통과하였습니다.
    테스트 2
    입력값 〉	16
    기댓값 〉	4
    실행 결과 〉	테스트를 통과하였습니다.
    테스트 3
    입력값 〉	626331
    기댓값 〉	-1
    실행 결과 〉	테스트를 통과하였습니다.
    */

     

    1. `solution()` 함수는 주어진 수 num을 입력으로 받습니다.

     

    2. ` answer` 변수는 작업을 반복한 횟수를 기록하기 위한 변수입니다. 

     

    3. ` while` 루프는 num이 1이 아닌 동안 계속해서 반복 작업을 수행합니다.

     

    4. `if (answer >= 500)` 구문은 500번 이상의 반복 작업으로도 주어진 수가 1이 되지 않을 경우 -1을 반환합니다.

     

    5. if (num % 2 === 0)는 주어진 수가 짝수인지 확인하여 짝수인 경우에는 2로 나눠주고, 홀수인 경우에는 3을 곱하고 1을 더해줍니다.

     

    6. `answer++`를 통 작업 횟수를 1 증가시킵니다.

     

    7. `while` 루프가 종료되면, 주어진 수가 1이 되었으므로 작업을 반복한 횟수인 answer를 반환합니다.


    3. 다른사람의 문제풀이 및 접근방식 분석

    function solution(num) {
        var answer = 0;  // 작업 횟수를 기록할 변수
    
        // 주어진 수가 1이 아니고 작업 횟수가 500 미만인 경우에 반복
        while(num != 1 && answer != 500){
            // 주어진 수가 짝수인지를 확인하고, 짝수면 2로 나누고 홀수면 3을 곱하고 1을 더함
            num % 2 == 0 ? num = num / 2 : num = num * 3 + 1;
            answer++;  // 작업 횟수 증가
        }
    
        // 주어진 수가 1인 경우에는 작업을 반복한 횟수를, 그렇지 않은 경우에는 -1을 반환
        return num == 1 ? answer : -1;
    }
    
    /*
    테스트 1
    입력값 〉	6
    기댓값 〉	8
    실행 결과 〉	테스트를 통과하였습니다.
    테스트 2
    입력값 〉	16
    기댓값 〉	4
    실행 결과 〉	테스트를 통과하였습니다.
    테스트 3
    입력값 〉	626331
    기댓값 〉	-1
    실행 결과 〉	테스트를 통과하였습니다.
    */

     

    1. `solution()` 함수는 주어진 수 num을 입력으로 받습니다.

     

    2. ` answer` 변수는 작업을 반복한 횟수를 기록하기 위한 변수입니다.

     

    3. `while` 루프는 `num`이 1이 아니고, 작업 횟수가 500 미만인 동안 계속해서 반복 작업을 수행합니다.

     

    4. `num % 2 == 0 ? num = num / 2 : num = num * 3 + 1;`은 주어진 수가 짝수인지 확인하여 짝수인 경우에는 2로 나눠주고, 홀수인 경우에는 3을 곱하고 1을 더해줍니다.

     

    5. `answer++`는 작업 횟수를 1 증가시킵니다.

     

    6. `while` 루프가 종료되면, 주어진 수가 1이 되었거나 500번의 반복을 마친 것이므로, 주어진 수가 1이면 작업을 반복한 횟수인 `answer`를 반환하고, 그렇지 않으면 -1을 반환합니다.


    while문 내에 조건문을 사용하면 더 가독성 좋은 코드를 작성할 수 있다.

Designed by Tistory.