소수구하는 법 & 에라토스테네스의 체/문자열 중복제거/문자열 내림차순

hyerin·2023년 3월 15일
0

1. 소수 구하는 법

소수는 1과 자기자신을 제외하고 어떠한 수로도 나누어지지 않는다.
2부터 자기자신보다 작은 숫자까지 반복해 나눠본다
-> 나머지가 0이 나오면 소수가 아니다!

/*num이 소수이면 true, 아니면 false 반환*/
function isPrime(num) {
  /*반복문이 2부터 시작하는 이유는 1은 소수가 아니기때문에 pass*/
  /*for문은 자기자신을 루트 씌운 걸로 나누면 된다.*/
   for(let i = 2; i <= Math.sqrt(num); i++) {
      if(num % i === 0) {
         return false;
      }
   }
   return true;
}

소수구하는 법 => 에라토스테네스의 체

//구하고 싶은 숫자 n+1만큼 array로 만들고 true로 채운다.
//이 index 번호를 사용하며 0부터 시작한다. 
function solution(n){
let arr = new Array(n+1).fill(true);
//소수는 2부터이고, 제곱보다 작은수까지 반복한다. 
//제곱이상은 의미가 없기 떄문이다.
for(let i = 2 ; i * i < sieve.length ; i++){
  //만약 arr[i]이 true라면 
  if(arr[i]){
    //i의 배수인지 확인하고 맞으면 false처리한다. 
    for(let j = i+i; j < sieve.length ; j +=i){
      arr[j] = false;}
    }
  }
  return arr;
}
let isPrimes = solution(100);
//소수의 개수 구하기
isPrimes.filter(e=> e).length //25;
//소수 반환하기
isPrimes.map((e,i)=>e? i : 0).filter(e=>e);
//// [2, 3, 5, 7, 11, 13, 17, 19, 23, 29, 31, 37, 41, 43, 47, 53, 59, 61, 67, 71, 73, 79, 83, 89, 97]

어떤 소수도 N의 제곱근보다 큰 수로 나눠지지 않는다는 규칙이 있다.
만약 17이 소수인지 확인해보려면 16이 아니라 4까지만 나누어보면 된다.
이는 반복을 줄여주어 효율성을 올릴 수 있는 장점이 있다.

프로그래머스 문제 : 소수 만들기

배열에서 3개의 숫자를 골라서 3개의 숫자를 더한 후 소수인지 판별하는 문제이다.
nums이라는 배열을 매개변수로 받으며, 하나의 숫자는 1000을 넘지 않기때문에
3개의 숫자의 총 합은 3000을 넘지 않는다. 이떄는 체의 크기를 3000으로 만든다

//3000까지의 소수 판별 체를 만든다.
//여기서 체의 이름은 arr이다. 
let arr = new Array(3001).fill(true);
for(let i = 2; i*i < arr.length ; i++){
  if(arr[i]){
    for(let j = 2 * i; j < arr.length; j += i ){
      arr[j] = false;
    }
  }
}
//nums는 숫자로 이루어진 배열이다.
function solution(nums){
  let answer = 0;
  //3개의 인덱스를 순회함
  for(let i = 0 ; i < nums.length-2 ; i++){
    for(let j = i+1; j < nums.length-1 ; j++){
      for(let k = j+1 ; k < nums.length ; k++){
        let sum = nums[i] + nums[j] + nums[k];
        //arr에서 num을 판별한다. true이면 1을 더한다.
        if(arr[num]) {answer += 1}
      }
    }
  }
  return answer;
}

tip: 참고로 소수의 반대말은 합성수이다.

2.문자열 중복제거(filter & indexOf)

<filter는 array에서만 사용가능! array로 고친뒤 시작하기>
indexOf : 처음으로 발견한 문자의 Index의 위치만 반환한다.
따라서 해당 문자의 index가 indexOf가 찾은 index와 다르다면,
이 문자는 중복되고 있다는 뜻이다.
filter는 true인 값만 새로운 배열로 반환하기 때문에 이 index들이
일치하는 조건을 filter안에 넣으면 된다.

my_string = "people"
//배열로 바꿔주기 filter는 배열함수
let array = [...my_string];
let newarr = array.filter((value,index)=>array.indexOf(value) === i);
//다시 문자열로 바꿔주기
return newarr.join('');

3. sort()의 기능

sort는 사실 문자열을 a,b,c,d...순서로 정렬하는 것이 본기능이다. ()안에 어떤 함수도 넣지 않으면 문자정렬을 한다. sort로 숫자 정렬을 하고 싶다면 알다시피 다음 함수를
넣어 sort를 사용해야 한다.

array = [4,1,6,2];
array.sort((a,b)=>a-b); //[1,2,4,6]
profile
글쓰기의 시작은 나를 위해, 끝은 읽는 당신을 위해

0개의 댓글