프로그래머스 숫자 카드 나누기 JavaScript

2023년 1월 16일

프로그래머스 숫자 카드 나누기

문제 풀이

매개변수 arrayA, arrayB 가 주어졌을 때, arrayA를 모두 나눌 수 있는 숫자가 arrayB의 모든 값들을 나눌 수 없거나,
arrayB를 모두 나눌 수 있는 숫자가 arrayA의 모든 값들을 나눌 수 없는 숫자 중 최댓값을 리턴하는 문제다.

핵심 아이디어로는 최대 공약수를 이용하는 것이다. arrayAarrayB의 최대공약수를 각각 구해준다. 최대 공약수 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;
}

댓글