프로그래머스 숫자 카드 나누기 JavaScript
2023년 1월 16일
문제 풀이
매개변수 arrayA, arrayB 가 주어졌을 때, arrayA를 모두 나눌 수 있는 숫자가 arrayB의 모든 값들을 나눌 수 없거나,
arrayB를 모두 나눌 수 있는 숫자가 arrayA의 모든 값들을 나눌 수 없는 숫자 중 최댓값을 리턴하는 문제다.
핵심 아이디어로는 최대 공약수를 이용하는 것이다. arrayA와 arrayB의 최대공약수를 각각 구해준다. 최대 공약수 AMaxDivisor
, BMaxDivisor
가 각각 다른 행렬의 값들과 나눠지는지 확인하고 나눠지면 그중 최댓값을 답으로 리턴한다.
solution.js
function solution(arrayA, arrayB) {
let answer = 0;
const AMaxDivisor = searchMaxDivisor(arrayA[0], arrayA);
const BMaxDivisor = searchMaxDivisor(arrayB[0], arrayB);
const checkA = checkSplits(AMaxDivisor, arrayB);
const checkB = checkSplits(BMaxDivisor, arrayA);
if (checkA) {
answer = answer < AMaxDivisor ? AMaxDivisor : answer;
}
if (checkB) {
answer = answer < BMaxDivisor ? BMaxDivisor : answer;
}
return answer;
}
function gcd(x, y) {
[x, y] = x < y ? [y, x] : [x, y];
while (y) {
[x, y] = [y, x % y];
}
return x
}
function searchMaxDivisor(num, arr) {
for (const item of arr) {
num = gcd(num, item);
if (num === 1) return 1
}
return num;
}
function checkSplits(num, arr) {
for (const item of arr) {
if (item % num === 0) return false;
}
return true;
}