반응형
저번에도 똑같은 게시물을 쓴것 같은데 그때는 솔직히 대충 보고 넘어갔던거라,
이번에 제대로 이해하고 정리해두려고 글을 남긴다.
사실 제일 간단한 방법은 최대공약수를 구하려면 그냥 1부터 주어진 수 중 작은 수까지 있는 애들을 싹 다 나눠보고 나머지가 0인 애들 추린 다음에 그중 제일 큰거 꺼내면 된다.
근데 이렇게 하면 코드도 길어지고, 오류가 꽤 생긴다. 1은 무조건 나눠떨어지니 1이 계속 추가 된다던가 하는 문제가 생기는데, 그거 극복하려면 유클리드 호제법이라고 불리는걸로 계산 하는게 속편하다.
유클리드 호제법
작은 수를 큰 수로 나눠서 나머지가 0이 아니면 그 나머지로 큰 수를 나눈다. 이 과정을 반복하다가 나머지가 0이 되었을 때 큰 수가 최대공약수다.
말로 써두니까 상당히 복잡한 느낌이 드는데 코드로 보면 확 잘 보일 것 같다.
function gcd (min,max) { // 최대공약수를 구하는 함수
return min % max === 0 ? max : gcd(max , min % max) // 여기가 내가 말한 원리
}
function solution(n, m) {
var answer = [];
const max = Math.max(n,m); // 주어진 수 중 큰 수 찾기
const min = Math.min(n,m); // 주어진 수 중 작은 수 찾기
const gcdValue = gcd(min, max);
const lcmValue = (n * m)/gcdValue; // 최소공배수는 주어진 수 두개를 곱하고 최대공약수로 나누면 된다.
answer[0]=gcdValue;
answer[1]=lcmValue;
return answer;
}
저 유클리드 호제법 걍 외우는게 나을 것 같다. 최대공약수, 최소공배수 개념은 어딜 가든 필요할 것 같고..
결국 코드를 쓰는 것도 수학에 기반하는게 많기 때문에, 수학적인 개념 조금씩 다시 떠올려야겠다.
고등학생때로 돌아온 것 같네 에휴..
LIST
'Dev > Algorithm' 카테고리의 다른 글
[Algorithm] DFS (프로그래머스 타겟넘버 문제를 통한 이해) (2) | 2023.06.23 |
---|---|
[코딩테스트] 삼총사 (0) | 2023.05.31 |
[코딩테스트] 옹알이 (0) | 2023.05.22 |
[코딩테스트] 평행 (0) | 2023.05.22 |
[코딩테스트] 겹치는 선분의 길이 (0) | 2023.05.22 |