
class Solution {
static int[] num;
static int n;
public int solution(int a, int b) {
int answer = 1;
int gcd = GCD(a,b);
b = b/gcd;
EulerPhi(b);
for(int i=2; i<=b; i++) {
if(num[i] != 0) {
if((i != 2 && i != 5) && b%i==0) {
answer=2;
break;
}
}
}
return answer;
}
public int GCD(int a, int b) {
int gcd = 1;
for(int i=1; i<=a && i<=b; i++) {
if(a%i==0 && b%i==0) gcd = i;
}
return gcd;
}
public void EulerPhi(int n) {
num = new int[n+1];
for(int i=2; i<=n; i++) {
num[i] = i;
}
for(int i=2; i<=n; i++) {
for(int j=i+i; j<=n; j +=i) {
if(num[j] != 0) num[j] =0;
}
}
}
}
gcd구하는것까지는 좋았으나 오일러피사용해서 1~n사이의 소수를 구한 후, 해당 소수로 다 나누어보는로직은 비효율적이라는생각이들어 다른 풀이로 공부한다.
class Solution {
public int solution(int a, int b) {
b /= gcd(a, b);
while (b != 1) {
if (b % 5 == 0) {
b /= 5;
continue;
}
if (b % 2 == 0) {
b /= 2;
continue;
}
return 2;
}
return 1;
}
private int gcd(int a, int b) {
if (b == 0) {
return a;
}
return gcd(b, a % b);
}
}