철수와 영희는 선생님으로부터 숫자가 하나씩 적힌 카드들을 절반씩 나눠서 가진 후, 다음 두 조건 중 하나를 만족하는 가장 큰 양의 정수 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
출처: 프로그래머스 코딩 테스트 연습, https://programmers.co.kr/learn/challenges
함수를 2개 생성
1. 배열 값 모두 안나눠져야 true리턴하는 함수
인자: num, array
array를 돌면서 num이 모두 안나눠지면 true
나눠지는게 있으면 false리턴
2. 배열 값 모두 나눠져야 true리턴하는 함수
인자: num, array
array를 돌면서 num이 모두 나눠지면 true
안 나눠지는게 있으면 false리턴
- 이를 가지고 아래과정 시행
- arrayA에 가장 작은 값에서부터 2까지 아래 과정 시행 => i
arrayA에 있는 값은 i를 모두 나눠야한다. -> 2번함수
arrayB에 있는 값을 i를 모두 나뉘면 안된다. -> 1번함수
이 값이 있다면 i를 저장하고 break- arrayB기준에서도 반대로 해서 i를 저장
- 두 값을 비교해서 큰 값을 리턴
//배열 값 모두 안나눠져야 true리턴
function divNotFunction(num,array){
for(var i = 0;i<array.length;i++){
if(array[i]%num===0){
return false;
}
}
return true;
}
//배열안 모두 나눠져야 true리턴
function divFunction(num,array){
for(var i = 0;i<array.length;i++){
if(array[i]%num!==0){
return false;
}
}
return true;
}
function solution(arrayA, arrayB) {
arrayA = arrayA.sort((a,b)=>a-b);
arrayB = arrayB.sort((a,b)=>a-b);
var answer1=0,answer2=0;
for(var i = arrayA[0];i>=2;i--){
if(divFunction(i,arrayA)){
if(divNotFunction(i,arrayB)){
answer1 = i;
break;
}
}
}
for(var i = arrayB[0];i>=2;i--){
if(divFunction(i,arrayB)){
if(divNotFunction(i,arrayA)){
answer2 = i;
break;
}
}
}
return answer1>answer2? answer1 :answer2;
}