[프로그래머스] 소수 찾기

2022. 11. 10. 16:17기록/Programmers

    목차

문제 설명

1부터 입력받은 숫자 n 사이에 있는 소수의 개수를 반환하는 함수, solution을 만들어 보세요.

소수는 1과 자기 자신으로만 나누어지는 수를 의미합니다.
(1은 소수가 아닙니다.)

 

제한 사항

  • n은 2이상 1000000이하의 자연수입니다.

 

입출력 예

n result
10 4
5 3

 

입출력 예 설명

입출력 예 #1
1부터 10 사이의 소수는 [2,3,5,7] 4개가 존재하므로 4를 반환

 

입출력 예 #2
1부터 5 사이의 소수는 [2,3,5] 3개가 존재하므로 3를 반환


나의 문제 풀이

function solution(n) {
  let answer = 0;

  for (let i = 2; i <= n; i++) {
    let count = 0;
    for (let j = 2; j <= i; j++) {
      if (i % j === 0) {
        count++;
      }
    }
    if (count < 2) {
      answer++;
    }
  }
  return answer;
}

정답은 맞았지만 시간 초과가 떴던 코드 1 .......... 😢

 

function solution(n) {
  let answer = 0;
  const arr = Array(n)
    .fill(0)
    .map((val, idx) => idx + 1);

  for (let i = 2; i < Math.sqrt(n); i++) {
    for (let k = i * 2; k <= n; k += i) {
      let idx = arr.indexOf(k);
      if (idx !== 0) {
        arr.splice(idx, 1);
      }
    }
  }
  arr.splice(0, 1);
  answer = arr.length;
  return answer;
}

정답은 맞았지만 시간 초과가 떴던 코드 2 ... 😞

 

function solution(n) {
  let answer = 1;

  for (let i = 3; i <= n; i++) {
    let count = 0;
    for (let j = 2; j <= Math.sqrt(i); j++) {
      if (i % j === 0) {
        count++;
        break;
      }
    }
    if (count === 0) {
      answer++;
    }
  }
  return answer;
}
  • 정답 갯수 변수에 1을 할당한다.
  • i는 3부터 주어진 숫자까지 1씩 증가하면서 반복한다.
    • 1은 소수가 아니다.
    • 2는 소수이다.
    • 2를 정답 갯수 변수에 반영했다.
  •  j는 2부터 i의 제곱근까지 1씩 증가하면서 반복한다.
    • 소수는 1과 자기 자신으로만 나누어지는 수이다.
    • i가 j로 나누어 떨어지는 경우 소수가 아니다. 카운팅 후 빠져나간다.
      • j는 1일 수 없다.
      • j는 자기 자신일 수 없다.
    • 카운트가 0일 경우 소수가 아니기 때문에 정답 갯수 변수에 1을 더해준다.
  • 완성된 정답 갯수 변수를 반환한다.

다른 사람의 문제 풀이

function solution(n) {
  const s = new Set();
  
  for(let i = 1; i <= n; i += 2){
    s.add(i);
  }
  s.delete(1);
  s.add(2);
  
  for(let j = 3; j < Math.sqrt(n); j++){
    if(s.has(j)) {
      for(let k = j * 2; k <= n; k += j){    
        s.delete(k);
      }
    }
  }
  return s.size;
}
  • 1부터 주어진 수까지 2씩 증가하는 것을 반복하며 Set 에 넣는다. (홀수만) [1, 3, 5, 7, 9]
  • Set 에서 1을 삭제하고 2를 넣는다. [2, 3, 5, 7, 9]
    • 1은 소수가 아님
    • 2는 짝수이면서 소수임
  • j는 3부터 주어진 수의 제곱근까지 1씩 증가하는 것을 반복한다.
  • Set 에 해당 숫자가 존재할 경우 
    • 해당 숫자의 배수들을 제거한다. [2, 3, 5, 7]
  • Set 의 크기를 반환한다.