반응형
문제
주어진 숫자 중 3개의 수를 더했을 때 소수가 되는 경우의 개수를 구하려고 합니다. 숫자들이 들어있는 배열 nums가 매개변수로 주어질 때, nums에 있는 숫자들 중 서로 다른 3개를 골라 더했을 때 소수가 되는 경우의 개수를 return 하도록 solution 함수를 완성해주세요.
나의 풀이
- sort를 통해서 가장 큰 수 3개를 얻는다.
- 가장 큰 수 기준으로 나올 수 있는 소수를 모두 구한다.
- 주어진 배열에서 나올수 있는 3개의 합을 다 구한다.
- 겹치는걸 찾는다.
function solution(nums) {
var answer = -1;
const arange = nums.sort((a,b)=>a-b).slice(nums.length-3,nums.length+1).reduce((acc,cur)=> acc += cur);
let arr = [];
for(let i =0; i<= arange; i++){
arr.push(i);
}
for(let j = 2; j*j <=arange;j++){
if(arr[j]){
let val = arr[j]
for( let q = val*val; q<=arange;q += val){
arr[q] = 0
}
}
}
let arr1 = arr.filter((el)=>el);
let arr2 = [];
for(let a = 0; a < nums.length-2; a++){
let tmp1 = nums[a];
for(let b = a+1; b < nums.length-1; b++){
let tmp2 = nums[b];
for(let c = b+1; c < nums.length; c++){
arr2.push(tmp1+tmp2+nums[c]);
}
}
}
answer = arr2.filter((el)=> arr1.find(element => element == el)).length
return answer;
}
다른이들의 풀이
function primecheck(n){
for(var i=2;i<=Math.sqrt(n);i++){
if(n%i == 0){
return false;
}
}
return true;
}
function solution(nums){
var cnt = 0;
for(var i=0;i<nums.length-2;i++){
for(var j=i+1;j<nums.length-1;j++){
for(var w=j+1;w<nums.length;w++){
//console.log(nums[i]+"/"+nums[j]+"/"+nums[w]);
if(primecheck(nums[i]+nums[j]+nums[w])){
//console.log(nums[i]+nums[j]+nums[w]);
cnt++;
}
}
}
}
return cnt;
}
위에 했던 1,2번은 뻘짓이였다. 그냥 3개의 합을 구한다음에 그 중에 소수가 있는지 찾으면 되는거였다..
소수 찾는게 어려울줄 알았는데 전혀 그렇지 않았다.
sqrt : square root (제곱근)
반응형
'코딩테스트' 카테고리의 다른 글
[프로그래머스] level1. 키패드 누르기 (javascript) (0) | 2021.04.20 |
---|---|
[프로그래머스] level1. 음양 더하기 (javascript) (0) | 2021.04.20 |
[프로그래머스] level1. 제일 작은 수 제거하기 (javascript) (0) | 2021.04.16 |
[프로그래머스] level1. 직사각형 별찍기 ( javascript) (0) | 2021.04.16 |
[프로그래머스] level1. 자릿수 더하기 (javascript) (0) | 2021.04.16 |