문제
프로그래머스 문제
내 풀이
function solution(n, m) {
const divisors = (n) => Array(n).fill(1).map((num, idx) => num + idx).filter((divisor => Number.isInteger(n / divisor))) ;
const gcd = Math.max(...divisors(n).filter(num => divisors(m).includes(num)));
const lcm = n * m / gcp;
return [gcp, lcm];
}
개선점
- 개인적으로 어려웠다.
- 아래는 유클리드 호제법을 이용한 풀이란다. 솔직히 읽어도 원리는 모르겠고... 그냥 a / b -> b / a%b -> a%b / b%(a%b) 를 뒷자리가 0이 될 때까지 반복하면 최대공약수가 나온다는 얘기라고 한다.
function greatestCommonDivisor(a, b) {return b ? greatestCommonDivisor(b, a % b) : Math.abs(a);}
function leastCommonMultipleOfTwo(a, b) {return (a * b) / greatestCommonDivisor(a, b);}
function gcdlcm(a, b) {
return [greatestCommonDivisor(a, b),leastCommonMultipleOfTwo(a, b)];
}
- 밑에도 위와 원리는 같은 건데 for문을 이렇게도 쓸 수 있구나 싶어서 신기해서 가져왔다. r === 0되면 멈추도록 되어있다.
function gcdlcm(a, b) {
var r;
for(var ab= a*b;r = a % b;a = b, b = r){}
return [b, ab/b];
}