프로그래머스 JS LV1

LV1 18 최대공약수와 최소공배수

와라리요 2022. 12. 19. 14:25

문제 설명

 - 두 수를 입력받아 두 수의 최대공약수와 최소공배수를 반환하는 함수, solution을 완성해 보세요. 배열의 맨 앞에 최대공약수, 그다음 최소공배수를 넣어 반환하면 됩니다. 예를 들어 두 수 3, 12의 최대공약수는 3, 최소공배수는 12이므로 solution(3, 12)는 [3, 12]를 반환해야 합니다.

 

제한 사항

  • 두 수는 1이상 1000000이하의 자연수입니다.

 

입출력 예

n m return
3 12 [3, 12]
2 5 [1, 10]

 

나만의 풀이

  우선 최대공약수와 최소공배수는 무조건 1 이상이다. 이유 제한 사항에 있음!! gcd, lcm을 변수로 1을 선언했다. 그 후 반복문과 if문을 이용해 문제를 풀었는데.

  최대공약수는 둘 중 가장 작은 수 까지 반복문을 돌리고 if문으로 n, m의 두 수에 나머지가 0되는 큰 수를 반환하고 최소공배수는 while문을 이용해서 계속 반복하게 하고 lcm을 ++하게 하고 if문에 n, m을 둘 다 나눴을 때 나머지 0이 되는 숫다 있으면 break;를 했다.

  return으로 [gcd, lcm]하면 끝~~

function solution(n, m) {
    let gcd = 1;
    let lcm = 1;
    
    for (let i = 2; i <= Math.min(n, m); i++) {
        if (n % i === 0 && m % i === 0) {
            gcd = i;
        }
    }
    
    while (true) {
        if (lcm % n === 0 && lcm % m === 0) {
            break;
        }
        lcm++;
    }
    
    return [gcd, lcm]
}

  쉽게 구하는 법이 있지 않을까 생각을 해서 검색을 하니 유클리드 호제법이라는 것이 있었다.

  함수를 반복하게 하고 a % b === 0이 되는 수가 최대공약수,

   a * b를 한 후 최대공약수를 나누면 최소공배수가 나오게 된다는 거였다.

  확실히 코드도 간단해지고 런타임도 많이 줄었다는 것을 알 수 있었다~~ 역시 이래서 구글링이 짱인 것 같다~~

function solution(n, m) {
    const gcd = (a, b) => a % b === 0 ? b : gcd(b, a % b);
    const lcm = (a, b) => a * b / gcd(a, b);
    
    return [gcd(n, m), lcm(n, m)];
}

 

'프로그래머스 JS LV1' 카테고리의 다른 글

LV1 20 이상한 문자  (0) 2022.12.20
LV1 19 같은 숫자는 싫어  (0) 2022.12.20
LV1 17 직사각형 별찍기  (0) 2022.12.19
LV1 16 행렬의 덧셈  (0) 2022.12.18
LV1 15 부족한 금액 계산하기  (0) 2022.12.18