본문 바로가기
Algorithm/Codility

[Codility(코딜리티)] Lesson5. CountDiv (100%)

by 잭피 2020. 9. 12.

Lesson 5 Prefix Sums - CountDiv (Java Solution)

app.codility.com/programmers/lessons/5-prefix_sums/count_div/

 

CountDiv coding task - Learn to Code - Codility

Compute number of integers divisible by k in range [a..b].

app.codility.com


문제

A,B,K가 주어진다

{ i  : A <= i <= B, i mod K=0 }

A와 B사이의 정수들 중에 K로 나눴을 때 나머지가 0인인 정수들의 개수를 출력하는 문제이다

 

해결

A부터 B까지 돌면서, 최초로 나머지가 0이 나오는 수를 init에 저장한 후, break 한다

그리고 B를 K로 나눴을 때 몫에서 init을 K로 나눈 몫을 뺀 후, 1을 더해주면 된다

예를 들면, A = 6 B = 11, K = 2이면,

[6,7,8,9,10,11] 중에서 2로 나눠서 나머지가 0인 정수는 6,8,10이므로 답은 3이다

위의 로직에 맞춰보면,

6부터 돌면서 2로 나눠서 나머지가 0인 최초의 수는 6이다

init = 6이고, B는 11이다

6~11 사이 2로 나누어 떨어지는 정수들의 개수(11/2 + 6/2 + 1)를 출력할 수 있다

예외로 A==B 같을 경우는 따로 처리해줬다

public class CountDiv {

    public int solution(int A, int B, int K) {
        int init = 0;
        for (int i=A; i<=B; i++) {
            if (i % K == 0) {
                init = i;
                break;
            }
        }

        if (A==B) return A%K == 0 ? 1 : 0;
        int result = B/K - init/K + 1;
        return result;
    }
 }

 

한번 다른 풀이를 찾아봤는데,

생각해보니 따로 init을 구할 필요가 없었다

if(A%K==0)
	return B/K - A/K +1;
return B/K - A/K;

그냥 A를 K로 나눠서 나머지가 0이면 B/K - A/K + 1 아니면 B/K - A/K를 출력하면 된다

댓글