- 문제설명 (최대공약수와 최소공배수)
두 수를 입력받아 두 수의 최대공약수와 최소공배수를 반환하는 함수, solution을 완성해 보세요. 배열의 맨 앞에 최대공약수, 그다음 최소공배수를 넣어 반환하면 됩니다. 예를 들어 두 수 3, 12의 최대공약수는 3, 최소공배수는 12이므로 solution(3, 12)는 [3, 12]를 반환해야 합니다.
- 풀이 과정
- 최대 공약수는 두 수의 약수들 중 공통된 소수들의 곱으로 생각했다.
- 최소 공백수는 두 수가 나누어 떨어질 때, 두 수 중 큰 수와 몫의 곱이라 생각했고, 나누어떨어지지 않을때는 두수의 곱이라고 생각했다.
- 이 과정을 처리하기 위한 과정이다.
- 두수의 약수를 구하기
- 공통된 소수 찾기
- 공통된 소수의 곱 구하기
- 두 수를 나누어 떨어지는지 판단하기
- 나누어 떨어질 때 큰 수와 몫을 곱하기
- 나누어 떨어지지 않을 때 두수를 곱하기.
- 이 많은 과정을 처리하려니 시간이 오래 걸렸다.
- 아래가 완성 코드이다. 하지만 테스트 결과 실패가 나왔다.
function solution(n, m) {
let a = [];
let b = [];
let answer = [];
for ( let i =1; i <=1000000; i++ ) {
if ( n % i === 0) {
a.push(i);
}
if ( m % i === 0) {
b.push(i);
}
}
let c = a.filter ( (x) => isPrime(x) == true );
let d = b.filter ( (x) => isPrime(x) == true );
answer.push(c.filter((x) => d.includes(x))
.reduce((a,b) => a*b ,1));
if ( m >= n) {
if ( m%n === 0){
answer.push(parseInt(m/n) * n);
} else {
answer.push( m * n);
}
} else if ( n >= m ) {
if ( n % m === 0) {
answer.push(parseInt(n/m) * m);
} else {
answer.push ( n * m);
}
}
return answer.sort((a,b)=> a-b);
}
function isPrime(num) {
for(let i = 2; num > i; i++) {
if(num % i === 0) {
return false;
}
}
return num > 1;
}
console.log(solution(500,5000));
- 풀이 과정에서 사고 과정이 복잡했고, 그 결과 코드가 너무 길어지고, 예외를 너무 만드는 결과를 초래했다. 그래서 다른 사람의 풀이를 참고했고, 의외로 간단한 풀이 과정임을 깨달았다.
- 최소 공약수는 두 수의 공통된 약수 중 가장 큰 정수이다.
- 최소 공배수는 두 수의 공통된 배수 중 가장 작은 정수이다.
- 공통된 약수이므로 두 수와 동시에 나누어 떨어지는 정수 중 큰 수를 구하면 된다.
- 공통된 배수이므로 두 수와 동시에 나누어 떨어지는 정수 중 가장 작은 수를 구하면 된다.
- 아래는 위의 내용을 반영한 코드이다.
function solution(n, m) {
let a = 1;
for ( let i =2; i <= Math.min(n,m); i++) {
if ( n%i === 0 && m%i=== 0) {
a = i;
}
}
let b = 1;
for ( let i = 1; i<=n*m; i++) {
if ( i%n === 0 && i%m ===0) {
break;
} b++;
}
return [a,b].sort((a,b) => a-b);
}