나의 코드
function solution(nums) {
let el3 = [];
for (let i = 0; i < nums.length; i++) {
for (let j = i + 1; j < nums.length; j++) {
for (let k = j + 1; k < nums.length; k++) {
el3.push([nums[i], nums[j], nums[k]]);
}
}
}
const sum = el3.map((v) => v.reduce((s, v) => s + v, 0));
let count = 0;
for (let v of sum) isPrime(v) ? count++ : null;
return count;
}
function isPrime(num) {
for (let i = 2; i <= Math.sqrt(num); i++) {
if (num % i === 0) return false;
}
return num > 1;
}
우선 3중 for문으로 nums에서 중복 없이 뽑을 수 있는 3가지 수로 이루어진 배열을 만든다.
=> reduce를 이용해 각 3가지 수의 합을 도출한다.
=> isPrime 함수를 이용해 소수인지 아닌지 판별하여 소수이면 count++
=> count 반환
그렇다면 isPrime 함수는 어떻게 생겼을까?
지금보다 더 많이 코린이였던 시절에는 for문을 이용하여 특정 수가 소수인지 판별하기 위해 해당 수를 2로 나누고, 3로 나누고, ..., 해당수 - 1로까지 전부 나눠보았다.
예를 들어 7이 소수인지 판별하려면
7%1, 7%2, 7%3, ... ,7%6 까지 전부 다 하는 for문을 짰었다.
..멈춰!
for문에서 7까지 전부 돌리는 게 아니라 Math.sqrt(7) 이하까지만 돌리면 된다.
Math.sqrt(7) ≒ 2.645이므로
7을 2까지만 나눠보고 약수가 0이 아니면 7은 소수인 것이다.
그럼 10이라면?
Math.sqrt(10) ≒ 3.162이므로
3까지 돌려보되,
10을 2로 나누면 나머지가 0이므로 함수 종료! return false!
10은 소수가 아니게 되는 것이다.
이 논리를 적용해서 기사단원의 무기도 통과!
function solution(number, limit, power) {
const nums = [...Array(number - 1)].map((_,i)=> isPrime(i+2) ? 2 : divCount(i+2));
return nums.map((v)=> v > limit ? power : v).reduce((s,v)=> s + v,1)
}
function divCount(n){
let arr = [];
for (let i=1 ; i<=n/2;i++){
if( n % i === 0 ) arr.push(i);
}
return(arr.length + 1);
}
function isPrime(n){
for(let i=2;i<=Math.sqrt(n) ; i++){
if( n % i === 0) return false;
}
return true;
}
소수인지 먼저 신속하게 판단하여, 소수이면 약수의 개수 구하지 않고 무쟉권 2를 부여하는 방식!
근데 n의 범위를 2이상 1000000이하의 자연수로 두는 프로그래머스 1레벨 소수 찾기 문제에서는 이 논리를 적용해도 효율성 테스트는 통과하지 못한다. ㅠㅠ
좀 더 수련하고 오겠슴돠 촤하하
adios!
++풀었다!!!!!
function solution(n) {
let arr = [];
let count = 2;
while(count <= n){
isPrime(count) ? arr.push(count) : null;
count += 1;
}
return arr.length ;
}
function isPrime(v){
for (let i=2; i<= Math.sqrt(v) ; i++){
if( v % i === 0 ) return false
}
return true;
}