철수와 영희는 선생님으로부터 숫자가 하나씩 적힌 카드들을 절반씩 나눠서 가진 후, 다음 두 조건 중 하나를 만족하는 가장 큰 양의 정수 a의 값을 구하려고 합니다.
예를 들어, 카드들에 10, 5, 20, 17이 적혀 있는 경우에 대해 생각해 봅시다. 만약, 철수가 [10, 17]이 적힌 카드를 갖고, 영희가 [5, 20]이 적힌 카드를 갖는다면 두 조건 중 하나를 만족하는 양의 정수 a는 존재하지 않습니다. 하지만, 철수가 [10, 20]이 적힌 카드를 갖고, 영희가 [5, 17]이 적힌 카드를 갖는다면, 철수가 가진 카드들의 숫자는 모두 10으로 나눌 수 있고, 영희가 가진 카드들의 숫자는 모두 10으로 나눌 수 없습니다. 따라서 철수와 영희는 각각 [10, 20]이 적힌 카드, [5, 17]이 적힌 카드로 나눠 가졌다면 조건에 해당하는 양의 정수 a는 10이 됩니다.
철수가 가진 카드에 적힌 숫자들을 나타내는 정수 배열 arrayA
와 영희가 가진 카드에 적힌 숫자들을 나타내는 정수 배열 arrayB
가 주어졌을 때, 주어진 조건을 만족하는 가장 큰 양의 정수 a를 return하도록 solution 함수를 완성해 주세요. 만약, 조건을 만족하는 a가 없다면, 0을 return 해 주세요.
제한사항
arrayA
의 길이 = arrayB
의 길이 ≤ 500,000arrayA
의 원소, arrayB
의 원소 ≤ 100,000,000arrayA
와 arrayB
에는 중복된 원소가 있을 수 있습니다.arrayA | arrayB | result |
---|---|---|
[10, 17] | [5, 20] | 0 |
[10, 20] | [5, 17] | 10 |
[14, 35, 119] | [18, 30, 102] | 7 |
입출력 예 #1
입출력 예 #2
입출력 예 #3
function solution(arrayA, arrayB) {
let answer = [];
function fnGCD(a,b){
return a % b ? fnGCD(b,a%b): b;
}
function fnCD(val){
let arr = [];
for(let i=1;i<=val;i++){
if(i !== 1 && !(val % i)) arr.push(i);
}
return arr;
}
function fnCondition(arr, list){
let cnt = false;
for(let i=0;i<list.length;i++){
for(let j=0;j<arr.length;j++){
if(arr[j] % list[i] === 0) cnt = true;
}
if(!cnt) answer.push(list[i]);
cnt = false;
}
}
let A_GCD = arrayA.reduce((acc,cur) => fnGCD(acc,cur), arrayA[0]);
let B_GCD = arrayB.reduce((acc,cur) => fnGCD(acc,cur), arrayB[0]);
let A_GCD_List = fnCD(A_GCD);
let B_GCD_List = fnCD(B_GCD);
fnCondition(arrayB,A_GCD_List);
fnCondition(arrayA,B_GCD_List);
return answer.length > 0 ? Math.max(...answer) : 0;
}
function solution(arrayA, arrayB) {
const aResult = getAnswer(arrayA, arrayB)
const bResult = getAnswer(arrayB, arrayA)
return aResult > bResult ? aResult : bResult
}
function getAnswer (A, B) {
A.sort((a, b) => a - b)
for (let i = A[0]; i > 1; i--) {
if (A.every(a => a % i === 0) && !B.some(b => b % i === 0)) return i
}
return 0
}