프로그래머스 Lv.1 : 최대공약수와 최소공배수★

zeroequaltwo·2022년 11월 17일
0

코딩테스트

목록 보기
28/69

문제

프로그래머스 문제

내 풀이

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];
}
profile
나로 인해 0=2가 성립한다.

0개의 댓글