문제
코드
function gcd(a, b) {
const mod = a%b;
if(mod === 0) return b;
return gcd(b, mod)
}
function findDivde(n, arr) {
if(n !== 1) arr.push(n);
for(let i=2; i<=Math.sqrt(n); i++) {
if(n%i ===0) arr.push(i, n/i);
}
}
function compareArr(originArr, gcdArr) {
if(gcdArr.length === 0) return 0;
const result = [];
for(let i=0; i<gcdArr.length; i++) {
for(let j=0; j<originArr.length; j++) {
if(originArr[j]%gcdArr[i] === 0) break;
if(j === originArr.length-1) result.push(gcdArr[i]);
}
}
return Math.max(...result);
}
function solution(arrayA, arrayB) {
const ans = [];
let aGcd = 1, bGcd = 1;
const aDiv = [], bDiv = [];
for(let i=0; i<arrayA.length-1; i++) {
const a = gcd(arrayA[i], arrayA[i+1]), b = gcd(arrayB[i], arrayB[i+1])
if(aGcd < a) aGcd = a;
if(bGcd < b) bGcd = b;
}
findDivde(aGcd, aDiv);
findDivde(bGcd, bDiv);
ans.push(compareArr(arrayA, bDiv));
ans.push(compareArr(arrayB, aDiv));
return Math.max(...ans);
}
function solution(arrayA, arrayB) {
let a = getDvsr(arrayA, arrayB);
let b = getDvsr(arrayB, arrayA);
return Math.max(a,b);
}
function getDvsr(arrayA, arrayB){
let answer = 0;
const gcd = (a, b) => a % b === 0 ? b : gcd(b, a % b);
arrayA.forEach(val => answer = gcd(answer, val));
if(arrayB.some(val => val%answer === 0)) return 0;
return answer;
}
유클리드 호제법
- a는 b가 되고, b는 a%b를 한 값이 된다.
- 마지막에 나오는 값이 최대공약수
- 여기서 멍청하게 생각한 것이....최대공약수의 모든 약수를 구해서 넣고 있었다...왜 그렇게 생각했는지 아직도 의문이다. 뇌 손상이 온 것 같다.
최대 공배수 = a * b / 최대공약수
some을 이용한 풀이
some
은 배열의 값들 중 하나라도 충족할 시 true를 반환한다.
every
는 배열의 모든 값들이 충족해야 true를 반환한다.
- some을 이용해 상대 배열의 값들 중 나눠지는 값이 있는지 확인해서 있으면 0을 return한다.
참고 사이트