최대공약수와 최소공배수

·2022년 3월 24일
0

알고리즘

목록 보기
30/47

보자마자 쉽네! 라고 생각했는데
과정이....짧지가 않았다.

그래서 코드가
졸라.....길다


아래가 내 코드

function solution(n, m) {
    var answer = [];
    let nnumber = []
    let mnumber = []
    for (i=0; i<=n; i++){
  if(n%i===0){
    nnumber.push(i)
  }
}
    for (i=0; i<=m; i++){
  if(m%i===0){
    mnumber.push(i)
  }
}
    answer.push(nnumber.filter(a=> mnumber.includes(a)).sort((a,b)=> a-b).pop())    
    for(let j = 1; j <=n*m; j++){
  if(j % n ===0 && j % m === 0){
    answer.push(j)
    break;
}
    }  
    return answer;
}

까여도 할말이 없다
진짜로 ㅋㅋ


과정이 어떻게 되냐면
1. n의 모든 약수를 전부 nnumber의 배열에 담는다
2. m의 모든 약수를 mnumber의 배열에 담는다
3. 그 둘을 비교를 해서 중복되는 값이 있을 경우 오름차순 정렬을 해서 제일 오른쪽(제일 큰 수)를 제출할 answer에 담아준다. (최대공약수)
4. 반복문을 돌아서 n*m의 수까지 빙글빙글 돌면서 나눠주는 값을 j값을 1씩 올려준다.
5. j값을 1씩 올리면서 n을 나눠서 나머지가 0이 나올 때, m을 나눠서 나머지가 0이 나올 경우
6. 그 값을 answer에 담아주고, 반복문을 멈춘다. (최소공배수)

지이이이이이이이이이이인자 비효율적이다

최소공배수는 괜찮다. 짧으니까!!

근데 공약수를 구하는 과정이 복잡하다, 두개의 반복문을 돌려야하니까....
그래서 조금 더 스마트하게 값을 구할 순 없을지 서칭을 하다가 처음 보는 법칙(?)을 찾았다.


바로 유클리드 호제법이라는 것인데, 이해는 했지만 그... 설명하는건 좀 어려울 것 같아서 서술을 같이 하면서 풀어보겠다.

참고한 링크!
JavaScript로 최대공약수(GCD), 최소공배수(LCM) 구하기
위키백과 유클리드 호제법

우와와와...................

결국은 A % B = C라면 B % C = D
C % D = 0 라면 D가 최대공약수가 된다는 소리다.

하지만 A가 B보다 작을 경우에 문제가 되는데 그러한 부분을 함수의 형태로 위에 걸어놓은 블로그에 설명을 해주시고 있다.

이 사진을 보면 재귀함수로 만들어놨는데
예를 들어서 값이 134 , 515 라고 한다면 이런 순서로 돌아간다
134, 515 -> 515, 134 -> 134, 515 % 134 -> 113 , 134 % 111 ->
23 , 111 % 23 -> 19 , 23 % 19 = 4, 19 % 4 -> 3 , 4 % 3 -> 1, 3%1
2, 2%1 -> 1, 1%1
num2 = 0 이 되므로 num1에 있는 1이 최소공약수가 된다.

그렇기에 최소공약수는

const gcd = (a, b) => a % b === 0 ? b : gcd(b, a % b);
gcd(사용해야하는 값 1, 사용해야하는 값2)

의 방식으로 사용할 수 있다.

최대공배수도 방법이 적혀있는데 내가 바보멍청이 인건지 카페인이 모자른지 계산이 머리속에서 회전이 안돼.....
나중에 이해가 되면 추가해보겠다

profile
물류 서비스 Backend Software Developer

0개의 댓글