문제 소개
두 개의 정수로 이루어진 범위를 첫 번째 인수로, 하나의 숫자를 두 번째 인수로 받는 JavaScript 함수를 작성해야 합니다.
이 함수는 지정된 범위 안에서 입력받은 숫자로 나누어 떨어지는 모든 수를 찾아 그 개수를 반환해야 합니다.
구현 방법
가장 직관적인 방법은 반복문을 사용하는 것입니다. 범위의 시작 값부터 끝 값까지 한 숫자씩 확인하면서, 나머지 연산자(%)를 이용해 해당 숫자로 나누어 떨어지는지 검사합니다. 나머지가 0이면 카운트를 증가시키고, 마지막에 카운트 값을 반환하면 됩니다.
예제 코드
const range = [6, 57];
const num = 3;
const findDivisibleCount = (num = 1, [l, h]) => {
let count = 0;
for(let i = l; i <= h; i++){
if(i % num === 0){
count++;
};
};
return count;
};
console.log(findDivisibleCount(num, range));
실행 결과
18
코드 설명
위 예제에서 범위는 [6, 57]이며, 나누는 수는 3입니다. 6부터 57 사이에서 3으로 나누어 떨어지는 수는 총 18개입니다.
findDivisibleCount 함수는 매개변수에 기본값을 설정하고, 배열 구조 분해 할당을 통해 범위의 하한(l)과 상한(h)을 손쉽게 추출합니다. 이후 for 반복문으로 범위 내 모든 정수를 순회하며 조건에 맞는 경우만 카운트합니다.
더 효율적인 방법: 수학적 공식 활용
범위가 매우 넓다면 반복문 대신 수학적 공식을 사용하는 것이 좋습니다. 나누어 떨어지는 수의 개수는 다음과 같이 O(1) 시간 복잡도로 계산할 수 있습니다.
const findDivisibleCountFast = (num, [l, h]) => {
return Math.floor(h / num) - Math.floor((l - 1) / num);
};
console.log(findDivisibleCountFast(3, range)); // 18Math.floor(h / num)은 상한까지의 배수 개수를, Math.floor((l - 1) / num)은 하한 미만까지의 배수 개수를 의미합니다. 두 값을 빼면 정확히 범위 내의 배수 개수가 구해집니다. 이 방식은 반복 횟수와 무관하게 항상 일정한 성능을 보장하므로 실무에서 더 권장됩니다.