본문 바로가기
내일배움 과제/기타 과제

알고리즘 23번 콜라츠 추측

by GREEN나무 2024. 11. 27.
728x90

https://school.programmers.co.kr/learn/courses/30/lessons/12943

 

프로그래머스

SW개발자를 위한 평가, 교육, 채용까지 Total Solution을 제공하는 개발자 성장을 위한 베이스캠프

programmers.co.kr

JS

문제

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 미만인 정수입니다.


계획

wile문으로 주어진 수(num)가 1이 될 때 까지(num>1)

입력된 수가 짝수라면 2로 나눕니다.  count++
입력된 수가 홀수라면 3을 곱하고 1을 더합니다.  count++

 

return count


참고, 풀이

function solution(num) {
    let count=0
    while(num>1){
       num = (num%2===0)? num/2 : num*3+1
       count++
    }
    return count<500? count : -1;
}

점수가 높은(+7) 걸보아 나쁜 코드인것 같습니다.

 

작업 횟수가 500이 되면 계산을 끝내고 -1 반환

for문으로 500번 까지 돌리고  중간에 num이 1이 되면 작업횟수를 반환하기

부등호 안써도 값이 0이면 false로 나옴

num = num % 2 ? num * 3 + 1 : num / 2;

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

코드 간략화하기

const solution = (num) => {
  for (let i = 0; i < 500; i++, num = num % 2 ? num * 3 + 1 : num / 2)
    if (num === 1) return i;
  return -1;
};

쉼표 연산자(,)는 왼쪽에서 오른쪽으로 작업을 순차적으로 실행합니다.

단일 표현식을 요구하는 곳에 복수의 표현식을 사용하고 싶을 때 쉼표 연산자를 사용할 수 있습니다.
여러 표현식을 하나의 구문으로 묶을 수 있으며, 마지막 표현식의 결과가 반환됩니다.

가장 흔히 사용되는 곳은 for 반복문에 다수의 매개변수를 제공할 때입니다.

쉼표 연산자는 배열, 객체, 함수의 매개변수와 호출 인수에서 사용하는 쉼표와는 전혀 다릅니다.


증감식부분 (i++, num = num % 2 ? num * 3 + 1 : num / 2)
   루프의 각 반복이 끝날 때 동시에 두 가지 작업을 수행합니다

 

if위치
   for문에서 중괄호 {}가 생략된 상태에서는 루프 바로 뒤의 한 줄 코드가 본문으로 간주됩니다.


출처 

쉽표 연산자 : https://developer.mozilla.org/ko/docs/Web/JavaScript/Reference/Operators/Comma_operator