알고리즘, CS

[프로그래머스 Lv. 1] 콜라츠 추측

차돌박이츄베릅 2023. 7. 28. 09:57

1. 문제

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

 

프로그래머스

코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요.

programmers.co.kr

 

 

2. 나의 풀이

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

 

 

3. 다른 사람 풀이

프로그래머스의 다른 사람의 풀이를 분석함

 

case 1) 비슷한 접근법인데 더 깔끔

while의 조건에서 num과 answer 둘다 체크하고

return문에서 삼항연산자로 예외 answer값을 처리해주었다.

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;
}

 

case 2) 재귀함수

function collatz(num, count = 0) {
    return (num == 1) ? ((count >= 500) ? -1 : count) : collatz((num % 2 == 0) ? num / 2 : (num * 3) + 1, ++count);
}

// 조건: num이 1이면
(num == 1) ? 

// 조건: count가 500이상인지 체크해서 -1반환하거나 count값 반환
((count >= 500) ? -1 : count) :
 
// 조건: num이 1이 아닐때 재귀함수 호출
collatz(
    // 첫번째 매개변수(num값 받아야함)에 num값 계산해서 넘겨줌 
    (num % 2 == 0) ? num / 2 : (num * 3) + 1, 

    // 두번째 매개변수(count값 받아야함)에 count값 세서 넘겨줌
    ++count
)

 

 

case 3) 같은 재귀함수인데 함수를 기능별로 잘 쪼갠듯 하다 ! 함수 쪼개는거 참고해야지

const solution = (num) => collatzGuessCount(num, 0);

const collatzGuessCount = (num, acc) => 
  (num === 1) ? ((acc > 500) ? -1 : acc) : collatzGuessCount(processCollatz(num), acc + 1);

const processCollatz = (num) => (num % 2 === 0) ? (num / 2) : (num * 3 + 1);

 

4. 배운 점

  • return은 '함수' 종료하고 탈주
  • break 반복문 탈출
  • continue 반복문의 현재단계에서 탈출하고 다음단계로 감