소수 만들기

hyuri·2023년 9월 27일
0

코딩테스트 연습

목록 보기
44/70

내가 작성한 답

function num(number) {
    if (number % 2 ===0 || number % 3 === 0) return false;

     for (let i = 5; i * i <= number; i += 6) {
    if (number % i === 0 || number % (i + 2) === 0) return false;
  }
  return true;
}

function solution(nums) {
    let answer = 0;
    let number = [];
    for(let i = 0; i < nums.length ; i++){
        for(let j = i+1; j < nums.length; j++){
            for(let z = j+1 ; z< nums.length; z++){
               number.push(nums[i]+nums[j]+nums[z]);

            }
        }
    }
    number.map(a => {
        if (num(a)) answer++;
    })
    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++){
                   

                    if(primecheck(nums[i]+nums[j]+nums[w])){
                      
                        cnt++;
                    }
            }
        }
    }
    return cnt;
}

해석

다른 답과 내 답의 차이점은 Math.sqrt와 에라토스테네스의 체 사용 유무이다.

에라토스테네스의 체는 주어진 범위 내의 모든 소수를 찾기 위한 알고리즘이다.
근데 가독성은 다른 답이 좋다...

내가 쓴 답을 해석하자면

function num(number) {
    if (number % 2 ===0 || number % 3 === 0) return false;

     for (let i = 5; i * i <= number; i += 6) {
    if (number % i === 0 || number % (i + 2) === 0) return false;
  }
  return true;
}

이 부분이 왜 쓰였는지가 가장 의문일 것 같다.

한 줄씩 설명하자면
우선 2와 3으로 나눠지면 소수가 아니다.
반복문을 통해서 소수인지 아닌지를 판별했는데
5부터 시작인 이유는 2,3 다음 소수는 5이기 때문이다.

i * i <= number 이부분은 number가 제곱근보다 큰 약수를 찾을 필요가 없기 때문이다
이걸 다르게 작성하면 i <= Math.sqrt(number) 가 된다.
i에 6씩 더하는 이유는 6의 배수는 2, 3으로 나누어 떨어지기 때문에 소수가 아닌 수로 판명할 수 있다.

if문에서 i+2를 하는 이유는 에라토스테네스의 체에서는 6n-1와 6n+1의 숫자를 확인해야하기 때문에 i로 나누어 떨어질 때랑 i+2로 나누어 떨어질 때를 계산한다. (if문이 true일 경우에는 소수가 아니다.)

profile
개발자가 되고 싶은 지망생

0개의 댓글