Computer >> 컴퓨터 >  >> 프로그래밍 >> JavaScript

JavaScript로 경계 값 이하에서 n으로 나누어 떨어지는 가장 큰 수 구하기

문제 설명

이번 문제에서는 숫자 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 공식을 사용하면 상수 시간 안에 최적의 답을 구할 수 있습니다.
  • 입력값의 유효성(양수 여부)을 확인하면 더 견고한 함수를 만들 수 있습니다.