주어진 숫자 중 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을 만들 수 있습니다.
function solution(nums){
let answers = 0;
for(let i = 0; i< nums.length-2; i++){
for(let j = i+1; j < nums.length-1; j++){
for(let k = j+1; k < nums.length; k++){
let sums = nums[i]+nums[j]+nums[k];
if(isPrime(sums))
answers += 1;
}
}
}
return answers;
}
function isPrime(num){
for(let j = 2; j <= Math.sqrt(num); j++){
if(num % j === 0)
return false;
}
return true;
}
처음에는 set()
을 이용해서 중복제거를 해줬는데, 문제를 다시 읽어 보니 합은 같아도 조합이 다르면 다른 case로 생각해 갯수를 따로 세줘야 했다. 그래서 그냥 for 반복문을 이용해서 풀어 줬다.
함수 안에서 함수를 호출하고 싶지 않아서 다른 방법을 계속 고심했는데, 아무리 해도 함수를 호출하는 게 제일 간결할 것 같아서 결국 함수를 두 개 만들었다.
조합의 갯수를 구해야 하는 것이기 때문에 맨 첫번째 고르는 값을 고정한 다음, 두번째 값도 고정, 세번째는 남는 것 중 하나를 골라 준다. 그리고 다음으로는 두 번쨰 값을 다른 값으로 고정한 다음 고른 값 뒤쪽에 있는 값 중에서 골라 준다. 이런식으로 조합을 구성하였고, 만약 이 합계가 소수라면 개수를 세주어야 한다. 그래서 isPrime()이라는 함수를 만든 후에, 2 이상 값으로 나누어 봤을 때 나누어 떨어진다면 소수가 아니므로 거짓을, 전체 검사를 해봤을 때 나누어 떨어지지 않는다면 소수이므로 참을 리턴해 줬다.
생각보다 엄청 헤맨 문제였는데, 함수를 두번 쓰지 않으려고 고심하다보니 엄청 헤맸던 것 같다.