알고리즘 문제풀이/프로그래머스 Lv.1

[프로그래머스 JS] - 소수 만들기 (Feat. 조합, 재귀함수)

위르겐 2024. 1. 29. 19:07

 

정말 오랜만에 블로그를 재가동시키려고 한다.

 

근무를 하는 동안 많은 일이 있었고
조금의 회복할 시간도 필요해서 휴식을 취했는데

다시 공부시작합니다..!!

빠이팅

 

그 시작은 프로그래머스 레벨1 문제 전부 풀기 !

 

현재 79문제 중 60문제 풀었고 

그 과정에서 재귀함수를 꽤나 유용하게 사용하고 있어서 

공유해볼까 한다.

 

 

 

 

 

 

    const handleCombinations = (arr, start) => {
        if (arr.length === 3) {
            const resultNumber = arr[0] + arr[1] + arr[2]
            if(getResult(resultNumber)) answer++;
            return;
        }
        
        for (let i = start; i < nums.length; i++) {
            handleCombinations([...arr, nums[i]], i + 1)
        }
    }

 

handleCombinations 함수는 for문 안에서 본인(함수)을 반복하여 호출한다.

 

이렇게 호출할 경우 

arr이 빈배열에서 시작하여 하나의 값을 고정 후
그 외의 값을 추가로 삽입하여 모든 경우의 수를 만든다.

 

[1, 2, 3, 4]라는 배열이 nums로 받아지는 경우

 

위와 같은 형태로 모든 경우의 수를 확인할 수 있다.

우리가 원하는 배열의 길이는 3이므로

배열의 길이가 3일 때 해당 배열의 합을 구하여 

 

소수를 구하는 getResult()함수를 호출하고 그 값이 소수일 때 true로 반환받는다.

 

const getResult = (number) => {
    for(let i = 2; i <= Math.sqrt(number); i++){
        if(number % i === 0){
            return false;
        }
    }
    return true;
}

 

위 코드는 에라토스테네스의 체라는 알고리즘을 이용하여 소수 여부를 확인한다.

 

매개변수 number를 받은 후 해당 매개변수가 소수인지 아닌지 판별하는데

매개변수의 제곱근까지만 반복문을 돌아도 소수여부를 확인할 수 있기 때문에

반복되는 횟수가 급감한다.

 

당연히 런타임도 줄어들게 된다.

 

 

재귀함수는 무슨 개념인지만 알고 사용해보진 못했는데

경우의 수를 구할 때 정말 유용하게 사용될 것 같다.

 

반응형