[프로그래머스] 소수 찾기
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 의 크기를 반환한다.