문제 :
내 풀이 :
function solution(n, m) {
let gdc = 1;
let lcm = 1;
let gdcAndLcm = [];
for(let i = 2; i <= Math.min(n, m); i++) {
if(n % i === 0 && m % i === 0) {
gdc = i;
}
}
while(true) {
if(lcm % n === 0 && lcm % m === 0) {
break;
}
lcm++;
}
gdcAndLcm.push(gdc, lcm);
return gdcAndLcm;
}
최대공약수는 2부터 min(n, m)까지 모든 정수로 나누어보는 방법으로 구했다.
각각의 두 수를 lcm으로 나누었을 때 나머지 값이 0인지를 비교하면서 lcm++을 하는 방법으로 구했다.
다른 사람의 풀이 :
function solution(a, b) {
let gcd = (a, b) => {
while (b !== 0) {
[a, b] = [b, a % b];
}
return a;
};
let gcdValue = gcd(a, b);
let lcmValue = (a * b) / gcdValue;
return [gcdValue, lcmValue];
}
위 풀이는 유클리드 호제법으로 작성한 코드이다.
유클리드 호제법의 원리
두 수 a와 b의 최대공약수는 다음과 같은 방식으로 구할 수 있습니다:
- 큰 수에서 작은 수를 나눈다: 먼저 a를 b로 나누고, 그 나머지를 구합니다. (이때 a > b로 가정합니다.)
- 나머지가 0이 될 때까지 반복: a와 b를 계속해서 나누되, 이번에는 b를 이전 단계에서 구한 나머지로 나누는 식으로 반복합니다.
- 나머지가 0이 되는 순간의 나누는 수: 나머지가 0이 되었을 때, 그 직전 단계에서 나누었던 수가 두 수의 최대공약수입니다.
a = 48과 b = 18의 최대공약수
48을 18로 나눈 나머지: 48 % 18 = 12
18을 12로 나눈 나머지: 18 % 12 = 6
12를 6으로 나눈 나머지: 12 % 6 = 0
나머지가 0이 되었으므로, 이때 나누는 수 6이 48과 18의 최대공약수입니다.
두 수 a와 b의 최소공배수는 두 수의 곱을 그 두 수의 최대공약수로 나누어 구할 수 있습니다.
- 수학적 성질: 두 수 a와 b에 대해 a * b = GCD(a, b) * LCM(a, b)이 성립합니다.
- 따라서 LCM(a, b) = (a * b) / GCD(a, b)로 계산할 수 있습니다.
유클리드 호제법을 이용하여 문제를 해결하면 큰 수에 대해서도 빠르게 계산할 수 있겠다고 생각했고,
상당히 효율적이라고 느껴졌다.
'프로그래머스' 카테고리의 다른 글
[JavaScript] 이상한 문자 만들기 - 프로그래머스 (0) | 2024.08.19 |
---|---|
[JavaScript] 3진법 뒤집기 - 프로그래머스 (0) | 2024.08.16 |
[JavaScript] 문자열 다루기 기본 - 프로그래머스 (0) | 2024.08.13 |
[JavaScript] 부족한 금액 계산하기 - 프로그래머스 (0) | 2024.08.12 |
[JavaScript] 콜라츠 추측 - 프로그래머스 (0) | 2024.08.09 |