728x90
JS
문제
두 정수 left와 right가 매개변수로 주어집니다. left부터 right까지의 모든 수들 중에서, 약수의 개수가 짝수인 수는 더하고, 약수의 개수가 홀수인 수는 뺀 수를 return 하도록 solution 함수를 완성해주세요.
제한사항
1 ≤ left ≤ right ≤ 1,000
계획
let answer = 0
for(let i =left ; i <= right; i++){
const n = 약수의 개수
(n%2)? answer -=i : answer +=i;
}
return answer
참고, 풀이
n의 약수 구하는 방법
1. 반복문으로 1 ~ n 사이의 값을 하나하나 대입해서 n을 나누기
const Divisors = (n) => {
let arrD = [];
for (let i = 1; i <= n; i++) {
if (n % i === 0) arrD.push(i);
}
return arrD;
};
2. 주어진 수의 절반을 대상으로 약수 구하기
약수는 본인을 제외하고 n/2 보다 클 수 없기 때문에 절반값까지만 체크
const Divisors = (n) => {
let arrD = [];
for (let i = 1; i <= n/2; i++) {
if (n % i === 0) arrD.push(i);
}
return [...arrD, n];
};
3. 제곱근(Math.sqrrt) 사용하기
해당 약수를 가지고 입력받은 값을 나누게 될 경우 나오는 결과 값 역시 약수
const Divisors2 = (n) => {
let arrD = [];
for (let i = 1; i <= Math.sqrt(n); i++) {
if (n % i === 0) {
arrD.push(i);
if (n / i != i) arrD.push(n / i);
}
}
arrD.sort((a, b) => a - b);
return arrD;
};
console.log(Divisors2(102));
/*
[
1, 2, 3, 6,
17, 34, 51, 102
]
*/
답 - 3점나와서 별로 좋은코드는 아닌듯
function solution(left, right) {
let answer = 0;
for (let n = left; n <= right; n++) {
let arrD = [];
for (let i = 1; i <= Math.sqrt(n); i++) {
if (n % i === 0) {
arrD.push(i);
if (n / i != i) arrD.push(n / i);
}
}
arrD.length % 2 ? (answer -= n) : (answer += n);
}
return answer;
}
코드 간략화하기
function solution(left, right) {
let result = 0;
for (let i = left; i <= right; i++) result += Number.isInteger(Math.sqrt(i)) ? -i : i;
return result;
}
참고
약수 구하기 : https://mine-it-record.tistory.com/522#google_vignette
'내일배움 과제 > 기타 과제' 카테고리의 다른 글
알고리즘 35번 - 부족한 금액 계산하기 (0) | 2024.12.16 |
---|---|
알고리즘 34 - 문자열 내림차순으로 배치하기 (0) | 2024.12.13 |
알고리즘 32번 내적 (0) | 2024.12.11 |
알고리즘 31번 - 수박수박수박수박수박수? (0) | 2024.12.10 |
알고리즘 30번 - 가운데 글자 가져오기 (0) | 2024.12.09 |