본문 바로가기
IT/JavaScript & TypeScript

[JavaScript/알고리즘] CountDiv

by 저당단 2025. 3. 1.

오랜만에 다시 하는 코딜리티...

A와 B 사이에 K로 나눴을 때 몫이 0이 되는 수가 몇 개인지 세는 문제입니다.

 

https://app.codility.com/demo/results/trainingGDW5F8-WJ7/

 

Test results - Codility

Write a function: function solution(A, B, K); that, given three integers A, B and K, returns the number of integers within the range [A..B] that are divisible by K, i.e.: { i : A ≤ i ≤ B, i mod K = 0 } For example, for A = 6, B = 11 and K = 2, your f

app.codility.com

 

A와 B사이를 for문으로 1 step씩 검증하면 당연하게도 time exceed가 발생합니다.

function solution(A, B, K) {
    let startNum = 0;

    for (let i=A; i<B+1; i++) {
        if (i % K === 0) {
            startNum = i;
            break;
        }
    }

    return Math.floor(((B - startNum) / K)) + 1;
}

그래서 나름 방법을 바꿔 봤습니다.

만약 A, B, K가 각각 3, 10, 2일 경우 가장 작은 배수인 4를 startNum이라고 합니다.

10 - 4 = 6 이고, 6 안에 2의 배수가 몇 개가 있는지 세서 거기서 startNum을 포함시켜야 하니까 +1을 해줍니다.

 

근데 문제는 A, B의 값이 같을 때 1이 나온다는 것입니다.

function solution(A, B, K) {
    if (A === B && A !== 0) return 0;
    
    let startNum = 0;

    for (let i=A; i<B+1; i++) {
        if (i % K === 0) {
            startNum = i;
            break;
        }
    }

    return Math.floor(((B - startNum) / K)) + 1;
}

 

그래서 수정된 코드는 위와 같습니다... 거참... 생각할 게 많은 코드군요.

경계값 테스트의 중요성은 이미 많이 말했으니 적지 않겠습니다.