본문 바로가기
개발/알고리즘

[프로그래머스][LEVEL1]소수 만들기

by ISA(류) 2021. 8. 11.

# 문제 원문

 

주어진 숫자 중 3개의 수를 더했을 때 소수가 되는 경우의 개수를 구하려고 합니다. 숫자들이 들어있는 배열 nums가 매개변수로 주어질 때, nums에 있는 숫자들 중 서로 다른 3개를 골라 더했을 때 소수가 되는 경우의 개수를 return 하도록 solution 함수를 완성해주세요.제한사항

  • nums에 들어있는 숫자의 개수는 3개 이상 50개 이하입니다.
  • nums의 각 원소는 1 이상 1,000 이하의 자연수이며, 중복된 숫자가 들어있지 않습니다.

입출력 예

nums / result

[1,2,3,4] 1
[1,2,7,6,4] 4

입출력 예 설명

입출력 예 #1
[1,2,4]를 이용해서 7을 만들 수 있습니다.

입출력 예 #2
[1,2,4]를 이용해서 7을 만들 수 있습니다.
[1,4,6]을 이용해서 11을 만들 수 있습니다.
[2,4,7]을 이용해서 13을 만들 수 있습니다.
[4,6,7]을 이용해서 17을 만들 수 있습니다.

 

# 문제 풀이

 

주어진 입력값 배열에서 3가지 요소를 골라서 합한 값을 구한다. 그리고 그 값이 소수인가를 확인하고 소수인 경우의 갯수를 모아서 반환해준다. 반복문이나 재귀함수를 이용해서 3수의 합을 구하고, 그걸 소수인지 검증해주는 간단한 로직을 수행하면 된다. 다만 소수라는 개념에 대한 이해도(흐릿한 기억)에 따라서 문제 난이도가 달라질 수 있을거 같다.

그리고 효율성에 따라서 많이 달라질거 같다. 어지간한 범위라면 소수가 그리 많지 않으니 미니 뜰채를 만들어서 필터링하는게 더 빠를거라 본다.

 

# 솔루션 플로우

1. 입력 받은 nums 배열에서 3자리를 구한다.

2. 3수 중 첫 수는 모든 경우를 순회하므로 배열에서 꺼내온다. shift보다 pop연산이 배열 특성상 조금이라도 효율적이니 pop으로 끄집어내 준다.

3. 3수 중 두번째 수를 구하고, 그 수를 제외한 수들을 순회하면서 3수의 합을 구한다

4. 그렇게 구해진 3수의 합이 소수인지 검증하고 맞다면 result를 1올려준다.

5 위의 과정을 반복한다.(아무 생각 없이 nums.length를 0 까지 반복시켰는데 사실 그럴 필요는 없다.)

1. 풀이 타이틀

function solution(nums) {
    let result = 0;

    while (nums.length > 0) { // 반복문을 안쓰고 재귀 함수로 해도 상관없긴하다.
        let state = nums.pop();
        nums.forEach((num, idx) => {
            state += num;
            for (let int = idx + 1; int < nums.length; int++) {
                state += nums[int];
                if(checkPrime(state)) result++;
                state -= nums[int];
            }
            state -= num;
        })
    }

    return result;

    function checkPrime(num) {
        for(let int = 2; int * int <= num; int++){
            if(num % int === 0) return false;
        }
        return true;
    }
}

 

 

반응형