class Solution {
public int[] solution(int n, int m) {
int gcd = gcd(n, m);
int lcs = lcs(n, m);
int[] answer = {gcd, lcs};
return answer;
}
public int gcd(int val1, int val2) {
int i = val1;
while(i > 1) {
if(val2 % i == 0 && val1 % i == 0) {
break;
}
i--;
}
return i;
}
public int lcs(int val1, int val2) {
int i = val2;
while(i < val1 * val2) {
if(i % val1 == 0 && i % val2 == 0) {
break;
}
i++;
}
return i;
}
}
두 숫자의 최대공약수를 구할 때 가장 큰 값이 나와도 두 수중 작은수인 n보다는 작을거라고 판단하고 n부터 시작해서 1씩 내리면서 두 수가 i로 나누어 떨어지는지 확인하는 로직이다.
두 숫자의 최소공배수를 구할 때 두 숫자중 큰 수인 m보다는 크고 두 수의 곱보다는 작을 거라고 판단하고 m부터 시작해서 n*m이 될 때까지 1씩 증가하면서 i가 n과 m이 나누어 떨어지는지 확인하는 로직이다.
위의 해답은 일종의 꼼수를 활용한 알고리즘으로 정석으로 짜면 유클리드 호제법을 활용해서 구현해야 한다.
class Solution {
public int[] solution(int n, int m) {
int gcd = gcd(n, m);
int lcs = lcs(n, m);
int[] answer = {gcd, lcs};
return answer;
}
public int gcd(int val1, int val2) {
if (val2 == 0) {
return val1;
}
return gcd(val2, val1 % val2);
}
public int lcs(int val1, int val2) {
int gcd = gcd(val1, val2);
return Math.abs(val1*val2) / gcd;
}
}
유클리드 호제법:
두 양의 정수 a,b (a>b) 에 대하여 a=bq+r(0≤r<b)이라 하면, a,b의 최대공약수는 b,r의 최대공약수 와 같다.
즉, gcd(a, b)=gcd(b, r) r=0 이라면, a,b의 최대공약수는 b가 된다.
lcs(n,m)= |ab| / gcd(a,b)이다.
'내일배움캠프' 카테고리의 다른 글
Spring 숙련주차 Part4 (2) | 2024.06.03 |
---|---|
3진법 뒤집기 (0) | 2024.05.31 |
MySQL에서의 if문과 case문 (0) | 2024.05.30 |
행렬 간 덧셈 (0) | 2024.05.28 |
Java의 정규표현식 (0) | 2024.05.27 |