소수는 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: 참고로 소수의 반대말은 합성수이다.
<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('');
sort는 사실 문자열을 a,b,c,d...순서로 정렬하는 것이 본기능이다. ()안에 어떤 함수도 넣지 않으면 문자정렬을 한다. sort로 숫자 정렬을 하고 싶다면 알다시피 다음 함수를
넣어 sort를 사용해야 한다.
array = [4,1,6,2];
array.sort((a,b)=>a-b); //[1,2,4,6]