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

Kim Jason·2023년 4월 11일
0

알고리즘 노트

목록 보기
35/35
post-thumbnail

💁🏻 코드

function solution(arrayA, arrayB) {
    const arrAMin = arrayA.reduce((prev, curr) => Math.min(prev, curr), 100000000);
    const arrBMin = arrayB.reduce((prev, curr) => Math.min(prev, curr), 100000000);
    
    function findA(criterion, compare, minNum) {
        for (let i = minNum; i > 0; i--) {
            if (criterion.every(n => n % i === 0) && !compare.some(n => n % i === 0)) return i;
        }
        return 0;
    }
    
    return Math.max(findA(arrayA, arrayB, arrAMin), findA(arrayB, arrayA, arrBMin));
}

입력값의 제한은 다음과 같습니다.

  • 1 <= 배열 arrayA, arrayB의 길이 <= 500,000

각 배열에 대해 이중 for문을 적용하는 건 어렵다고 생각했습니다.
가장 큰 양의 정수 a를 찾기 위해서는 각 배열이 비교 기준이 되는 총 2가지 경우를 따져야 합니다.
가장 큰 양의 정수를 찾는 로직은 다음과 같습니다.

  1. 우선 각 배열에 대한 최소값을 구합니다. 최소값을 구한 이유는 최소값보다 큰 수로는 최소값을 나눌 수 없기 때문입니다.
  2. 구한 최소값을 시작점으로 1씩 감소시키면서 가장 큰 양의 정수를 찾기 위한 조건문을 돌립니다.
  3. 조건을 만족한다면 해당 값을 리턴하고 for문을 종료합니다. 해당 값보다 더 작은 수를 볼 필요는 없기 때문입니다.

위 로직을 담은 fidnA 함수를 생성했습니다.
마지막으로, 비교 기준을 arrayA로 삼았을 때 findA 함수가 리턴하는 값과 비교 기준을 arrayB로 삼았을 때 findA 함수가 리턴하는 값 중 큰 값을 리턴하면 됩니다.

profile
성장지향형 프론트엔드 개발자

0개의 댓글