안녕하세요

프로그래머스 JS 숫자 카드 나누기 (나누어 떨어지는 수) 본문

프로그래머스/Lv.2

프로그래머스 JS 숫자 카드 나누기 (나누어 떨어지는 수)

sakuraop 2023. 12. 14. 00:15

숫자 카드 나누기 (45) 문제 보기

A의 모든 숫자를 나눌 수 있고, B의 모든 숫자들 중 하나도 나눌 수 없는 양의 정수 a
B의 모든 숫자를 나눌 수 있고, A의 모든 숫자들 중 하나도 나눌 수 없는 양의 정수 a

 

를 만족하는 수 중 가장 큰 a를 찾고, 없다면 0을 반환하시오


문제 풀이

// 나누어 떨어지는 수들을 찾기
const getDivisors = (number) => {
  const divisors = [];
  for (let i = 2; i <= number; i++) {
    if (number % i === 0) divisors.push(i);
  }
  return divisors.reverse();
};

// 조건에 따라 가장 크게 나누어 떨어지는 수 찾기
const findMaxDivisor = (cardsA, cardsB, divisors) => {
  const results = [];
  for (let divisor of divisors) {
    if (cardsA.every((card) => card % divisor === 0) && 
        cardsB.every((card) => card % divisor !== 0)
    ) {
      results.push(divisor);
    }
  }
  return results;
};

const solution = (arrayA, arrayB) => {
  const sortedA = arrayA.sort((a, b) => a - b);
  const sortedB = arrayB.sort((a, b) => a - b);

  // 각 배열에서 가장 큰 수에 대해 나누어 떨어지는 수의 집합 만들기
  const maxADivisors = getDivisors(sortedA[sortedA.length - 1]);
  const maxBDivisors = getDivisors(sortedB[sortedA.length - 1]);

  // 각 배열에서 조건에 맞는 수 찾기
  const maxADivisor = findMaxDivisor(sortedA, sortedB, maxADivisors);
  const maxBDivisor = findMaxDivisor(sortedB, sortedA, maxBDivisors);

  // 조건에 맞는 수 배열 합치기
  const results = maxADivisor.concat(maxBDivisor);

  // 가장 큰 조건에 맞는 수 또는 0 반환하기
  const result = results.length ? Math.max(...results) : 0;
  return result;
};

solution([2, 2, 2], [3, 3, 3]);

1. 각 배열의 가장 큰 수에 대해서 나누어 떨어지는 수의 집합을 구한다.

2. 이 집합의 수들을 이용해 문제의 조건에 맞는 수를 찾는다.

3. 가장 큰 수를 반환, 조건에 맞는 수가 없다면 0을 반환한다.

 

조건이 무엇을 말하는지 이해만 했다면 복잡하지 않게 해결할 수 있는 문제였습니다.