프로그래머스 LEVEL 2(숫자 카드 나누기)

image

  • 사용 언어 : javascript

  • 해결 날짜 : 2022-12-06

  • 해결 방법 :

    • arrayA, arrayB 오름차순 정렬
    • 각 arrayA, arrayB의 가장 작은 숫자의 약수를 구함
    • 구한 두 배열의 약수들을 돌며
      • arrayA의 약수(divisorsA)의 경우,
        • arrayA의 모든 값을 약수로 나눌 수 있고(divisableA), arrayB의 모든 값을 약수로 나눌 수 없을 경우(!divisableB)
        • divisors에 추가
      • arrayB의 약수(divisorsB)의 경우,
        • arrayB의 모든 값을 약수로 나눌 수 있고(divisableB), arrayA의 모든 값을 약수로 나눌 수 없을 경우(!divisableA)
        • divisors에 추가
    • divisors의 길이가 0인 경우 0 반환
    • 그 외의 경우 divisors 중 최댓값 반환
  • 회고 :

    • x
  • 코드

    const getDivisors = (num) => {
      const divisors = [];
      for (let i = 2; i <= Math.sqrt(num); i++) {
        if (num % i === 0) {
          divisors.push(i);
          if (num / i != i) divisors.push(num / i);
        }
      }
    
      divisors.push(num);
      divisors.sort((a, b) => a - b);
      return divisors;
    };
    
    function solution(arrayA, arrayB) {
      const divisors = [];
    
      arrayA.sort((a, b) => a - b);
      arrayB.sort((a, b) => a - b);
    
      const divisorsA = getDivisors(arrayA[0]);
      const divisorsB = getDivisors(arrayB[0]);
    
      divisors.push(
        ...divisorsA.filter((divisorA) => {
          const divisableA = arrayA.every((a) => a % divisorA === 0);
          const divisableB = arrayB.some((b) => b % divisorA === 0);
    
          if (divisableA && !divisableB) return divisorA;
          return;
        }),
      );
    
      divisors.push(
        ...divisorsB.filter((divisorB) => {
          const divisableB = arrayB.every((b) => b % divisorB === 0);
          const divisableA = arrayA.some((a) => a % divisorB === 0);
    
          if (divisableB && !divisableA) return divisorB;
          return;
        }),
      );
    
      if (divisors.length === 0) return 0;
    
      return Math.max(...divisors);
    }
    
  • 출처: 프로그래머스 코딩 테스트 연습, https://school.programmers.co.kr/learn/challenges