프로그래머스 LEVEL 2(숫자 카드 나누기)
-
사용 언어 : javascript
-
해결 날짜 : 2022-12-06
-
해결 방법 :
- arrayA, arrayB 오름차순 정렬
- 각 arrayA, arrayB의 가장 작은 숫자의 약수를 구함
- 구한 두 배열의 약수들을 돌며
- arrayA의 약수(divisorsA)의 경우,
- arrayA의 모든 값을 약수로 나눌 수 있고(divisableA), arrayB의 모든 값을 약수로 나눌 수 없을 경우(!divisableB)
- divisors에 추가
- arrayB의 약수(divisorsB)의 경우,
- arrayB의 모든 값을 약수로 나눌 수 있고(divisableB), arrayA의 모든 값을 약수로 나눌 수 없을 경우(!divisableA)
- divisors에 추가
- arrayA의 약수(divisorsA)의 경우,
- 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