문제 해석 : 두 수의 [최대 공약수,최소공배수] 담기
1. 최대공약수(gcd),최소공배수(lcm) 구하기
if (n % i === 0 && m % i === 0) {
gcd.push(i);
}
이렇게 하니 모든 공약수가 push
되어 shift
해야하는 번거로움이 발생.
lcm = n * m / gcd;
두 수의 곱에 최대 공약수를 나누면 최소 공배수가 된다.
최대 공약수 구하기
if (n % i === 0 && m % i === 0) {
gcd = (i);
}
n과 m 모두 나누어 떨어지는 숫자가 공약수 이므로 마지막 공약수만 넣기 위해 =
사용하면 되었음.
function solution(n, m) {
var answer = [];
let gcd = []
let lcm = [];
for (i = 1; i <= m; i++) {
if (n % i === 0 && m % i === 0) {
gcd = i;
}
}
lcm = n * m / gcd;
answer.push(gcd)
answer.push(lcm)
return answer
}
최대 공약수와 공배수를 구하는 방법을 한 번 더 배웠다.
function gcdlcm(a, b) {
var r;
for(var ab= a*b;r = a % b;a = b, b = r){}
return [b, ab/b];
}
유클리드호제법을 사용한 코드인데 변수 ab에 a*b를(상당히 직관적이다), r= a%b 로 a와 b를 나머지를 계산, 값을 업데이트 하기위해 a는 b를 할당 b는 r을 할당함.
a%b=r, b%r, b%r... 반복하였을 때 나머지가 0이 된다면 마지막 b가 최대공약수가 됨.
a=10, b=12 라면
10%12=10
12%10=2
10%2=0 // 나머지가 0이므로 2가 최대 공약수가 됨.
해당 식을 알고 있지만 이용을 하는건 다른 개념의 문제인 거 같다.
생각하는 힘이 부족한 거 같다.