카테고리 없음

240524 TIL - 마흔일곱번째날 약수구하기

8나지 2024. 6. 24. 21:51

 

주제1 divisors
작성이유 참고하기 위해

 

문제상황

상황

문제설명 : 임의의 수 left 부터 right까지 돌리면서 이 중에서 약수의 갯수를 구하고,
그 약수의 갯수가 짝수이면 임의의 수를 더하고,
짝수가 아니라면 그렇지 않으면 뺌
=> left 부터 right 까지의 수를 더하고 빼서 결과를 나타내야함.
--
내가 생각한 수식
function solution(left, right) {
    var answer = 0;
    for (let i=left; i <=right; i++){if (divisors(i)%2 ===0){answer +=i}else{answer -=i}}
   
    return answer;
}


해결방법1 function divisors(num) {
    let count = 0;
    for (let i = 1; i <= Math.sqrt(num); i++) {
        if (num % i === 0) {
            count += 2; // i와 num/i 두 개의 약수를 추가
            if (i * i === num) count--; // i가 num의 제곱근인 경우 중복 제거
        }
    }
    return count;
}

function solution(left, right) {
    var answer = 0;
    for (let i = left; i <= right; i++) {
        if (divisors(i) % 2 === 0) {
            answer += i; // 약수의 개수가 짝수인 경우 더하기
        } else {
            answer -= i; // 약수의 개수가 홀수인 경우 빼기
        }
    }
    return answer;
}
해결방법 풀이 이유 : divisors라는 함수의 정의가 필요함 
  1. 반복문: i를 1부터 Math.sqrt(num)까지 반복합니다.
  2. 약수 확인: num % i === 0이면 i num / i가 약수입니다.
  3. 약수 개수 추가: count += 2로 두 개의 약수를 추가합니다.
  4. 중복 제거: i num의 제곱근인 경우, i num / i가 동일하므로 중복을 피하기 위해 count--를 합니다.
해결방법2 function solution(left, right) {
var answer = 0;
for (let i = left; i <= right; i++) {
if (Number.isInteger(Math.sqrt(i))) {
answer -= i;
} else {
answer += i;
}
}
return answer;
}

풀이
number.isInteger() : 주어진 값이 정수인지 확인
=> 약수의 값 (Math.sqrt(i))가 정수인지 확인하는 수식