https://school.programmers.co.kr/learn/courses/30/lessons/12977
프로그래머스
코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요.
programmers.co.kr
여기서 가장 시간을 많이 잡아먹은 부분은
쓸데없이 중복을 제거해버린것.
여기서 가능한 모든 소수의 경우의 수를 구하는 것이라
중복이 있어도 별개의 소수로 계산이 되는건데
쓸데없이 set을 이용해서 중복을 제거해서 계속 오류가 나왔다.
이건 1차로 해매다가 결국 지워버렸던 것
function solution(nums) {
let set = new Set();
for(i in nums){
for(let j = i+1; j<nums.length; j++){
set.add(nums[i]+nums[j])
}
}
let arr = [...set];
function strainer(i){
if(arr.length ===0||Math.max(...arr)<i){
return arr.length;
}
arr = arr.filter((a)=>a%i===0||a<i);
i++;
strainer(i);
}
... 감을 못잡고 있음
소수란, 1과 자기자신으로만 나누어 떨어지는 숫자를 말한다.
소수를 생성하는 공식은 사실상 없어서, 패턴을 통한 예측은 불가능하고, 하나씩 계산을 반드시 해봐야 한다 .
그러면, 결국 1과 자기자신으로 나누어떨어지는지 여부를 확인하고, 그 갯수를 count해야한다.
위에선 모든 수를 filter로 가장 큰 수만큼 반복해서 자기자신과 1로만 나누어 떨어지고, 그외 다른수로 나누어 나머지가 0인 수는 제외해야했다.
근데 이렇게 하면 filter내부에서 각 숫자마다 또 for문을 돌려야하고,
필터링 하는 숫자가 커질수록 예외처리해야할 작은 수가 늘어난다.
아 ㅏ... filter말고 다른걸로 써봐야겠다. 너무 복잡해짐.
그래서 생각한게, 하나씩 비교하는것.
이건 하나하나 모두 따로 계산해야하므로, 어차피 한번식 다 연산은 해야하고, 일괄 필터링이 매우 어려움.
function solution(nums) {
let set = new Set();
for (let i = 0; i < nums.length; i++) {
for (let j = i + 1; j < nums.length; j++) {
for (let k = j + 1; k < nums.length; k++) {
set.add(nums[i] + nums[j] + nums[k]);
}
}
}
let arr = [...set];
let cnt = 0;
for (n of arr) {
if (strainer(n) === 2) {
cnt++;
}
}
return cnt;
function strainer(n) {
let count = 0;
for (let i = 1; i <= n; i++) {
if (n % i === 0) {
count++;
}
}
return count;
}
}
console.log(solution([1, 2, 7, 6, 4]))
거의 완성을 하긴 했는데,
쓸데없이 set써보려고 조건이 있지도 않은 중복을 제거해버림.
그래서 아래처럼 변경하고, 통과되었다.
function solution(nums) {
let cnt = 0;
for (let i = 0; i < nums.length; i++) {
for (let j = i + 1; j < nums.length; j++) {
for (let k = j + 1; k < nums.length; k++) {
if(strainer(nums[i] + nums[j] + nums[k])===2){
cnt++;
};
}
}
}
return cnt;
function strainer(n) {
let count = 0;
for (let i = 1; i <= n; i++) {
if (n % i === 0) {
count++;
}
}
return count;
}
}
어 근데
에라토스테네스의 체를 이용하는 방법이 있다고 한다.