[Codility] CountDiv - JavaScript

Sohyeon Bak·2021년 12월 3일
0

Codility

목록 보기
7/19
post-thumbnail

문제

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 function should return 3, because there are three numbers divisible by 2 within the range [6..11], namely 6, 8 and 10.

Write an efficient algorithm for the following assumptions:

A and B are integers within the range [0..2,000,000,000];
K is an integer within the range [1..2,000,000,000];
A ≤ B.

문제해석

A와 B는 정수로 주어지고 A와 B 사이의 숫자 중 K로 나눠지는 수의 갯수를 구하는 문제이다. 이 문제 또한 효율성을 고려해야하는 문제이고 웬만하면 O(N)으로 문제가 해결 될 수 있도록 하는 것이 좋다.

문제풀이

효율성을 고려해야 함으로 최대한 반복문이 덜 돌아가도록 해야한다.
반복문 시작은 A보다 크거나 같고 K로 나눠지는 가장 작은 수로 지정해야한다. 그리고 반복문은 K만큼 더해서 B까지 도달해야 한다.

  • 반복문의 첫번째 값을 찾아줘야한다.
    • A < K 그리고 A%K===0 : A
    • A < K 그리고 A%K!==0 : K
    • A > K 그리고 A%K===0 : A
    • A > K 그리고 A%K!==0 : K*Math.ceil(A/K)
  • 효율성 문제를 해결하기 위해 K가 1일땐 B-A+1을 해주고 리턴한다.
  • 또한 A와 B가 같다면 K로 나눠지면 1, 아니라면 0을 리턴해야한다.

코드

function solution(A, B, K) {
    let answer = 0;
    let aNum = A < K && A%K===0 ? A : A < K && A%K!==0 ? K : A > K && A%K===0 ? A : K*Math.ceil(A/K)

    if(K===1) return answer = (B-A)+1

    if(A===B && A%K===0) return answer = 1
    
    for(let i = aNum; i<=B; i+=K){
        answer++
    }

    return answer
}

최종결과

출처

https://app.codility.com/programmers/lessons/5-prefix_sums/

profile
정리하고 기억하는 곳

0개의 댓글