본문 바로가기
나의 개발일지/알고리즘 테스트

[프로그래머스 - Level 1] 콜라츠 추측 (JS)

by stella_gu 2022. 7. 20.

[문제]

입력된 수가 짝수:  나누기 2

입력된 수가 홀수: *3 +1

결과값이 1이 될 때까지 반복한다.

단, 주어진 수가 1인 경우 0을, 500번 반복할 때까지 1이 되지 않는다면 -1을 반환한다

 

[로직]

1. num이 1인 경우, 바로 0을 리턴해준다

2. 반복문을 돌며 짝수일 경우 /2 (이때 2로 나눠준 값이 1이면 바로 횟수를 리턴), 홀수일 경우 *3+1을 해준다. 

3. 반복 횟수가 500번이 넘어갈 경우 -1을 리턴해준다.

 

[코드]

const n = 6;



function solution(num) {
  if (num === 1) {
    return 0;
  }
  for (let i = 0; i < 500; i++) {
    if (num % 2 ===0) {
      num = num/2;
      if (num === 1) {
        return i+1;
      }
    } else {
      num = (num*3)+1;
    }
  }
  return -1;
}

console.log(solution(n));	// 결과 값 : 8

1. num이 1인 경우, 바로 0을 리턴해준다

if (num === 1) {
    return 0;
  }

 

2. 반복문을 돌며 짝수일 경우 /2 (이때 2로 나눠준 값이 1이면 바로 횟수를 리턴), 홀수일 경우 *3+1을 해준다. 

if (num === 1) {
    return 0;
  }
  for (let i = 0; i < 500; i++) {
    if (num % 2 === 0) {
      num = num/2;
      if (num === 1) {
        return i+1       // i를 0부터 시작했으므로, 실제 횟수는 +1을 해줘야함.
      }
    } else {
      num = (num*3)+1;
    }
  }

 

3. 반복 횟수가 500번이 넘어갈 경우 -1을 리턴해준다.

if (num === 1) {
    return 0;
  }
  for (let i = 0; i < 500; i++) {
    if (num % 2 ===0) {
      num = num/2;
      if (num === 1) {
        return i+1;
      }
    } else {
      num = (num*3)+1;
    }
  }
  return -1;
}

 

 

 

 

다른 사람들은 어떻게 풀었나

function collatz(num) {
  var answer = 0;
  while(num !=1 && answer !=500){
      num%2==0 ? num = num/2 : num = num*3 +1;
  answer++;
}
  return num == 1 ? answer : -1;
}

console.log( collatz(6) );