프로그래머스Lv1 소수 만들기
문제 설명
https://programmers.co.kr/learn/courses/30/lessons/12977
답안
나의 풀이
function solution(nums) {
const sums = [];
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++) {
sums.push(nums[i] + nums[j] + nums[k]);
}
}
}
let answer = sums.length;
for (const sum of sums) {
if (sum % 2 === 0) {
answer--;
continue;
}
for (let divisor = 3; divisor <= Math.sqrt(sum); divisor += 2) {
if (sum % divisor === 0) {
answer--;
break;
}
}
}
return answer;
}
시간복잡도: O(N3)
- 3자리를 고르기 위해 i, j, k 3중 반복문을 돈다.
- 두번째 자리는 첫번째 자리를 제외하고 선택할 수 있고 세번째 자리도 첫번쨰, 두번째 자리를 제외하고 선택할 수 있다. 따라서 반복문의 조건을 j = i + 1, k = j + 1로 설정한다.
- 각 세자리수를 더해 sum 배열에 push 한다.
- answer은 sum의 길이로 초기값을 정해놓고 소수가 아닌 경우를 찾을 때마다 -1을 해준다.
- ‘에라토스테네스의 체’의 공식을 사용하여 sum의 제곱근까지만 반복문을 돌면서 짝수인 경우는 제외해야하므로 +2씩 건너뛰어 소수를 찾는다.