Level1 - 약수의 개수와 덧셈
문제 설명 및 링크
https://programmers.co.kr/learn/courses/30/lessons/77884?language=javascript
나의 풀이
- 나눴을때 나머지가 없으면 약수이며, 또한 쌍을 이루는 나머지 숫자도 약수
- ex: "N === n1 * n2" 일때 n1, n2 모두 약수
- 2개의 약수를 동시에 찾을 수 있으므로 한번 카운팅할때마다 2씩 증가, 이에 따라 최대 sqrt(N) 번만 for 문 수행
- 다만 제곱근의 경우에는 n1 === n2 가 동일하므로 이 부분에 대한 예외처리만 추가
- ex: "N === n1 * n2" 일때 n1, n2 모두 약수
다른 사람의 풀이를 보니 타겟 N 의 제곱근이 정수이면 약수의 개수는 홀수, 제곱근이 정수가 아니면 약수의 개수는 짝수
라는 공식으로 훠얼씬 간단하게 코딩을 하더라.
역시 수학이 중요함...
코드
모든 프로그래머스 문제 관련 코드들은 GitHub 링크 에 있음.
function solution(left, right) {
// 약수의 개수를 리턴하는 함수
const getDivisorLength = n => {
if (n === 1) {
return 1;
}
let count = 0;
// 나눴을때 나머지가 없으면 약수이며, 또한 쌍을 이루는 나머지 숫자도 약수이다. (ex: "N === n1 * n2" 일때 n1, n2 모두 약수임.)
// 즉 2개의 약수를 동시에 찾을 수 있으므로 한번 카운팅할때마다 2씩 증가하며, 이에 따라 최대 sqrt(n) 번만 for 문을 돌면 됨.
// 다만 제곱근의 경우에는 n1 === n2 가 동일하므로 이 부분에 대한 예외처리만 추가
for (let i = 1; i <= Math.sqrt(n); i++) {
if (n % i === 0) {
if (i === Math.sqrt(n)) {
count += 1;
} else {
count += 2;
}
}
}
return count;
};
let result = 0;
for (let i = left; i <= right; i++) {
if (getDivisorLength(i) % 2 === 0) {
result += i;
} else {
result -= i;
}
}
return result;
}
Author And Source
이 문제에 관하여(Level1 - 약수의 개수와 덧셈), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다 https://velog.io/@crazydj/프로그래머스-문제-풀이-Level1-약수의-개수와-덧셈저자 귀속: 원작자 정보가 원작자 URL에 포함되어 있으며 저작권은 원작자 소유입니다.
우수한 개발자 콘텐츠 발견에 전념 (Collection and Share based on the CC Protocol.)