본문 바로가기
알고리즘 스터디/프로그래머스 스킬체크 레벨 1(끝)

[프로그래머스 스킬체크 레벨 1] 콜라츠추측 문제 풀이 및 설명 - 자바스크립트[JavaScript]

by 레일라오리덕 2021. 4. 17.
728x90

programmers.co.kr/learn/courses/30/lessons/12943

 

코딩테스트 연습 - 콜라츠 추측

1937년 Collatz란 사람에 의해 제기된 이 추측은, 주어진 수가 1이 될때까지 다음 작업을 반복하면, 모든 수를 1로 만들 수 있다는 추측입니다. 작업은 다음과 같습니다. 1-1. 입력된 수가 짝수라면 2

programmers.co.kr

문제

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을 완성해 주세요. 단, 작업을 500번을 반복해도 1이 되지 않는다면 –1을 반환해 주세요.

 

 

제한 사항

  • 입력된 수, num은 1 이상 8000000 미만인 정수입니다.

 

결괏값 예시

 

n result
6 8
16 4
626331 -1

 

기본 제공 틀

 

function solution(num) {
    var answer = 0;
    return answer;
}

 

풀이 [JavaScript]

 

안녕하세요, 오늘은 콜라츠 추측문제를 풀이해보도록 하겠습니다.

이번 문제에서는 4가지 포인트를 명심해야하는데요.

문제설명에서 주어진 1-1, 1-2, 2 그리고 작업이 500번을 반복해도 1이 되지 않는다면 -1을 반환해달라는 부분입니다.

 

우선 1-1과 1-2에 주어진 조건을 만족하기 위해 들어오는 값인 num 이 홀수인지 짝수인지 구분을 해주어야합니다.

그러기위해서 num 값을 2로 나누었을 때 나머지가 0인지 아닌지를 확인하기 위해 if - else문을 사용해주었습니다.

 

[num이 홀수인 경우]

num = num * 3 + 1;

 

[num이 짝수인 경우]

num = num / 2;

 

이렇게 num이 홀수인 경우와 짝수인 경우를 판별하는 if - else문을 완성했습니다.

 

다음으로 2번 구문을 보면 이 num값이 1이 될때까지 작업을 반복하라고 명시해두었습니다.

이 구문에서 중요한 힌트를 얻을 수 있었습니다. 

어떤 값이 될때까지 반복하는 구문인 while문을 사용하면 되겠다는 생각을 할 수 있습니다.

 

그래서 while문으로 num 값이 1이 아닐때까지 작업을 반복할 수 있게 구문을 감싸주었습니다.

 

그리고 가장 중요한 포인트인 작업이 500번을 반복해도 1이 되지 않는다면 -1을 반환할 수 있도록 코드를 설계해보겠습니다.

 

결국 우리가 찾고자 하는 값을 과연 이 작업을 몇번 반복해야 1이라는 값이 반환되느냐 이기 때문에 1-1, 1-2 조건을 만족하는 if - else구문에서 코드가 한번 돌때마다 answer값을 1씩 더해주기 위해 answer++이라는 코드를 넣어주었습니다.

 

이 answer값이 500번을 넘는다면 -1을 반환할 수 있게 해주기위해 1-1, 1-2 구문이 실행되기 전에  answer값이 500이 넘는지 체크해주는 if- else 구문을 한 번 더 사용해주었습니다.그래서 결국 answer값이 500번이 넘는다면 -1을 리턴해주고 500번이 넘지 않는다면 1-1, 1-2 구문에 맞게 코드를 돌도록 설계를 했습니다. 

 

728x90
function solution(num) {
    var answer = 0;
    while (num !== 1) {
        if (answer > 500) {
            return -1;
        } else {
            if (num % 2 == 0) {
                num = num / 2;
                answer++;
            } else {
                num = num * 3 + 1; 
                answer++;
            }
        }  
    }
    return answer;
}

 

채점 결과 [JavaScript]

 

728x90

댓글