본문 바로가기
TIL&WIL

250120 TIL - 소수 관련 알고리즘 팁

by 나노다 2025. 1. 20.

알고리즘 회고 - 소수 관련 팁

01) 개요

최근 알고리즘 문제에 소수와 관련된 이슈들이 많아서, 한 번 정리해보기로 결심했다!!

02) 소수 초급 판별법

소수는 1과 자기 자신만을 약수로 갖는 자연수지요? 그렇기 때문에 그 수가 소수인지 알아보는 가장 직접적인 방법은 1부터 그 숫자까지 1씩 더한 수들을 전부 나누기 해보고, 나머지가 0이 나오는 경우가 1과 본인인지 보는 방법이다!!

예시 코드

const isPrime = (num) => {
  let isPrime = true;
  // 1이랑 본인은 빼고 확인
  // 하나라도 자기 약수면 즉시 중단하고 false 반환
  for (let i = 2; i < num; i++) {
    if (num % i !== 0) {
      isPrime = false;
      break;
    }
  }
  return isPrime;
}

이리 하면 거의 num만큼의 수를 다 확인해야 할 수도 있어서 썩 좋지 않음!!!

03) 소수 중급 판별법

사실 약수들은 짝꿍이 있다!! 예를 들어 8이란 수의 약수는 1, 2, 4, 8인디, (1,8)과 (2,4)로 쌍을 이루지요?? 즉 어느 한 쪽의 약수를 알게 되면 이미 다른 쪽을 볼 필요도 없이 소수가 아닌 거니까? num의 절반만 확인해도 된다는 겨!! 만약 홀수여도 똑같음!!

예시 코드

const isPrime = (num) => {
  let isPrime = true;
  // num의 절반까지만 체크하기!!
  const half = num / 2;
  for (let i = 2; i < half; i++) {
    if (num % i !== 0) {
      isPrime = false;
      break;
    }
  }
  return isPrime;
}

이러면 하수의 방법보다 딱 봐도 절반만큼 복잡도가 줄어들지요? 아주 굿이에요 하지만 더 줄일 수 있다는 거?

04) 소수 고급 판별법

약수들은 서로 쌍을 이룬다는 것의 연장 선으로, 사실 num의 제곱근까지만 봐도 된다는 거? 다시 8의 경우를 보자!! 중수으 ㅣ방법을 쓰면 절반이 4니까 2, 3으로 두 개를 체크하게 될 텐데? 제곱근은 2 * √2로 약 2.8이니 2 하나만 체크해도 판별이 끝날 것임!! 더 줄었죠?

예시 코드

const isPrime = (num) => {
  let isPrime = true;
  // num의 제곱근까지만 체크하기!!
  const squareRoot = Math.sqrt(num);
  for (let i = 2; i < squareRoot; i++) {
    if (num % i !== 0) {
      isPrime = false;
      break;
    }
  }
  return isPrime;
}

사실 이러면 자연수와 실수의 비교라서 문제가 생길 수 있지만 일단 예시니까!! 무튼 소수 판별이 더 빨라졌다!!

초고수의 소수 판별법
통칭 "체"라고 해서, 자연수에서 소수일 수가 없는 넘들을 쳐내고 쳐내어 만든 소수 모음을 만들고, num이 해당 모음에 포함되는 지 확인한다거나 하는 등에 고오수 방법이 있는디, 있다는 것만 기억하고 혹시 필요해지면 찾아보자....!!!! 체가 여러 개여 또 흑흑

 

'TIL&WIL' 카테고리의 다른 글

250123 TIL - Connection Pool 실습  (0) 2025.01.23
250122 TIL - ECS Architecture  (0) 2025.01.22
250117 TIL - 알고리즘 풀이 회고  (0) 2025.01.17
250116 TIL - 개인과제 정리  (0) 2025.01.17
250114 TIL - 꼬리재귀?  (0) 2025.01.14