Codility - CommonPrimeDivisors

RESULT

이해가 잘 안가는 어려운 문제다.
참고했던 것 중에는 요 설명이 가장 낫다. 요약하자면,

  • 소수의 약수 집합이 같으려면 두 집합이 서로에게 속해야한다.
  • 최대 공약수를 빼면서 포함되고 있는지를 포함한다
  • 수를 소인수분해된 형태로 이해하면 좀 편하다.
import java.util.*;

class Solution {

    public int solution(int[] A, int[] B) {
        int count = 0;
        for (int i=0; i<A.length; i++) {
            if (hasPrimeDivisorsSet(A[i], B[i]) && (hasPrimeDivisorsSet(B[i], A[i]))) {
                count++;
            }
        }

        return count;
    }

    private boolean hasPrimeDivisorsSet(int A, int B) {
        int gcd;
        while ((gcd = gcd(A, B)) != 1) {
            A = A / gcd;
        }

        return A == 1;
    } 

    private int gcd(int A, int B) {
        while (A % B != 0) {
            int tmp = B;
            B = A % B;
            A = tmp; 
        }

        return B;
    }
}