두 수를 입력받아 두 수의 최대공약수와 최소공배수를 반환하는 함수, solution을 완성해 보세요. 배열의 맨 앞에 최대공약수, 그다음 최소공배수를 넣어 반환하면 됩니다.
function solution(n, m) {
var answer = [];
for (let i=Math.min(n,m);i>=1;i--){
if(n%i==0 && m%i==0) {
answer.push(i)
break
}
}
for (let j=Math.max(n,m);j<=n*m;j++){
if(j%n==0&&j%m==0) {
answer.push(j)
break
}
}
return answer;
}
function gcdlcm(a, b) {
var r;
for(var ab= a*b;r = a % b;a = b, b = r){}
return [b, ab/b];
}
b=> 최대공약수
ab/b => 최소공배수
아직 코드가 이해가지 않아서 for 문의 진행 과정을 풀어서 써보았다
6, 12
ab= 72
r=6 % 12 == 6
a=>6 b=>6
r= 6%6 == // for문 끝남
6, 72/6 12
15,27
ab = 405
r=15% 27 == 15
a=>27, b=>15
r=27%15 == 12
a=>15, b= 12
r= 15 % 12 == 3
a=>12, b=>3
r= 12%3 == 0
b, ab/b => 3, 405/3
최대공약수와 최소공배수의 특징을 먼저 살펴봐야 할 것 같다
아직 전혀 이해가 가지 않는다
=> 유클리드 호제법을 for 문으로 아름답게 옮겨놓은 것 같다
15, 27을 유클리드 호제법으로 구해보자
27 % 15 == 12
15 % 12 == 3
12 % 3 == 0 // 이 전의 나머지 였던 3이 최대공약수
최소 공배수는 두 자연수의 곱 / 최대공약수
따라서 ab/GCD == 405/3 == 135
for 문의 조건문 부분에 r= a%b 를 넣어 0 이 되면 falsy 에 해당되기 때문에 반복문이 끝난다
즉, a 와 b 가 나누어 떨어질 때 끝나게 되고 그 전 계산의 나머지인 b 가 최대공약수( GCD ) 가 된다
최소공배수는 두 수의 곱/GCD 이기 때문에 ab/b 가 된다
for 문의 조건문과 증감식에 다양한 식을 넣어 사용할 수 있으며 유클리드 호제법을 통해 GCD, LCM 을 구하는 방법을 배웠다