[프로그래머스 1레벨] 소수 만들기, 기사 단원의 무기, 소수 찾기

이민선(Jasmine)·2023년 1월 18일
0

나의 코드

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;
}

참고:
https://mine-it-record.tistory.com/509

profile
기록에 진심인 개발자 🌿

0개의 댓글