Codility Java CountNonDivisible
업데이트:
문제
코드
// you can also use imports, for example:
// import java.util.*;
// you can write to stdout for debugging purposes, e.g.
// System.out.println("this is a debug message");
class Solution {
public int[] solution(int[] A) {
int[] result = new int[A.length];
// Initializing array, element's range is [1, 2 * N]
int[] divisors = new int[(A.length * 2) + 1];
for (int idx = 0; idx < A.length; idx++) {
divisors[A[idx]]++;
}
for (int idx1 = 0; idx1 < A.length; idx1++) {
int count = 0;
for (int idx2 = 1; idx2 * idx2 <= A[idx1]; idx2++) {
// Common factor
if (A[idx1] % idx2 == 0) {
count += divisors[idx2];
// Not square root
if (A[idx1] / idx2 != idx2) {
count += divisors[A[idx1] / idx2];
}
}
}
result[idx1] = A.length - count;
}
return result;
}
}
설명
- 주어진 배열 A에 존재하는 정수의 숫자 별 개수를 변수 divisors 배열에 저장한다.
- 숫자는 1부터 2 * N까지 주어지므로, 0을 제외하면 배열의 크기는 (2 * N) + 1이어야 한다.
- 주어진 배열 A를 변수 divisors를 이용하여 인수가 아닌 숫자의 수를 구한다.
- divisors 배열은 숫자 기준으로 저장되었으므로 0번째 인덱스는 무시한다.
- 최대 반복은 제곱근이 될 수 있는 idx2^2가 A[idx1] 이하가 될 때까지 한다.
- 반복 중 나머지가 0이 되면 인수가 되는 숫자이다.
- 만일 A[idx1] / idx2가 idx2가 되는 경우는 제곱근이 되는 경우이므로, 한 번을 더 더해준다.
- 마지막으로 A의 크기에서 인수가 되는 숫자의 개수를 빼면, 인수가 아닌 숫자의 개수가 나오므로 해당 결과를 변수 result에 저장한다.
- 반복이 끝나면 주어진 배열 A의 각 숫자의 인수가 아닌 숫자의 개수를 저장한 변수 result를 주어진 문제의 결과로 반환한다.
결과
소스
Sample Code는 여기에서 확인 가능합니다.
댓글남기기