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

@bbearcookie · April 03, 2023 · 2 min read

문제

https://school.programmers.co.kr/learn/courses/30/lessons/135807

아이디어

  1. 각 배열 arrayAarrayB의 모든 원소를 나누어 떨어지게 하는 약수 배열 divisorsAdivisorsB를 만든다.
  2. 자신의 모든 원소를 나누어 떨어지면서, 상대의 모든 원소는 나누어 떨어지지 않는 최대 값을 구한다.

소스코드

// 배열의 모든 원소를 나누어 떨어지게 하는 모든 약수를 구하는 함수
function getDivisors(array) {
  const result = [];

  for (let i = 1; i <= array[0]; i++) {
    if (array.every(v => v % i === 0)) {
      result.push(i);
    }
  }

  return result;
}

// 약수 중에서 상대 배열의 모든 원소를 나누어 떨어지지 않게 하는 최대 원소를 구하는 함수
function getMaxResult(divisors, targets) {
  let result = 0;

  for (let i = 0; i < divisors.length; i++) {
    const div = divisors[i];

    if (targets.every(v => v % div !== 0)) {
      result = div;
      break;
    }
  }

  return result;
}

function solution(arrayA, arrayB) {
  // arrayA와 arrayB를 오름차순으로 정렬한다.
  arrayA = arrayA.sort((a, b) => a - b);
  arrayB = arrayB.sort((a, b) => a - b);

  // 각각의 배열의 모든 원소가 나눠 떨어지는 값을 기록하고 내림차순 정렬한다.
  let divisorsA = getDivisors(arrayA);
  let divisorsB = getDivisors(arrayB);
  divisorsA = divisorsA.sort((a, b) => b - a);
  divisorsB = divisorsB.sort((a, b) => b - a);

  // 자신의 모든 원소는 나눠 떨어지면서, 상대의 모든 원소는 나눠 떨어지지 않게 하는 최대 값을 출력한다.
  return Math.max(getMaxResult(divisorsA, arrayB), getMaxResult(divisorsB, arrayA));
}
@bbearcookie
Frontend Developer