문제 설명
이번 문제에서는 숫자 n과 경계 값 b를 입력받는 JavaScript 함수를 작성해야 합니다. 함수는 다음 세 가지 조건을 모두 만족하는 가장 큰 정수 num을 반환해야 합니다.
- num은 n으로 나누어 떨어져야 합니다.
- num은 경계 값 b보다 작거나 같아야 합니다.
- num은 0보다 커야 합니다.
예제 코드 — 반복문 활용
가장 직관적인 방법은 n부터 b까지의 모든 수를 순회하면서 조건에 맞는 최댓값을 찾는 것입니다.
const n = 14;
const b = 400;
const biggestDivisible = (n, b) => {
let max = 0;
for(let j = n; j <= b; j++){
if(j % n == 0 && j > max){
max = j;
}
}
return max;
};
console.log(biggestDivisible(n, b));출력 결과
392
n이 14이고 b가 400일 때, 400 이하에서 14로 나누어 떨어지는 가장 큰 수는 392입니다(14 × 28 = 392).
더 효율적인 접근 방법 — 수학적 공식 활용
위 코드는 시간 복잡도가 O(b)이므로 경계 값이 클 경우 비효율적입니다. 사실 반복문 없이 간단한 나눗셈 연산만으로 답을 즉시 구할 수 있습니다.
핵심 아이디어는 b를 n으로 나눈 몫에 다시 n을 곱하는 것입니다. 이렇게 하면 b 이하에서 n의 배수 중 가장 큰 값을 한 번의 연산으로 얻을 수 있습니다.
const biggestDivisible = (n, b) => {
return Math.floor(b / n) * n;
};
console.log(biggestDivisible(14, 400)); // 392
console.log(biggestDivisible(7, 100)); // 98
console.log(biggestDivisible(5, 23)); // 20이 방식은 시간 복잡도가 O(1)이므로 어떤 크기의 입력값이 들어와도 일정한 성능을 보장합니다. 단, n이나 b가 0 이하일 경우 결과가 0 또는 음수가 될 수 있으므로, 필요하다면 유효성 검사 로직을 추가하는 것이 좋습니다.
정리
- 단순 반복문으로도 문제를 해결할 수 있지만, 범위가 넓어지면 성능이 저하됩니다.
Math.floor(b / n) * n공식을 사용하면 상수 시간 안에 최적의 답을 구할 수 있습니다.- 입력값의 유효성(양수 여부)을 확인하면 더 견고한 함수를 만들 수 있습니다.