문제 설명
철수와 영희는 선생님으로부터 숫자가 하나씩 적힌 카드들을 절반씩 나눠서 가진 후, 다음 두 조건 중 하나를 만족하는 가장 큰 양의 정수 a의 값을 구하려고 합니다.
철수가 가진 카드들에 적힌 모든 숫자를 나눌 수 있고 영희가 가진 카드들에 적힌 모든 숫자들 중 하나도 나눌 수 없는 양의 정수 a
영희가 가진 카드들에 적힌 모든 숫자를 나눌 수 있고, 철수가 가진 카드들에 적힌 모든 숫자들 중 하나도 나눌 수 없는 양의 정수 a
철수가 가진 카드에 적힌 숫자들을 나타내는 정수 배열 arrayA와 영희가 가진 카드에 적힌 숫자들을 나타내는 정수 배열 arrayB가 주어졌을 때, 주어진 조건을 만족하는 가장 큰 양의 정수 a를 return하도록 solution 함수를 완성해 주세요. 만약, 조건을 만족하는 a가 없다면, 0을 return 해 주세요.
코드
import java.util.*;
class Solution {
public int solution(int[] arrayA, int[] arrayB) {
ArrayList<Integer> listA= new ArrayList<>();
ArrayList<Integer> listB= new ArrayList<>();
Arrays.sort(arrayA);
Arrays.sort(arrayB);
insert(listA,listB,arrayA[0],arrayB[0]);
int answer= check(arrayA,arrayB,listA,listB);
return answer;
}
public void insert(ArrayList<Integer> array1,ArrayList<Integer> array2,int A,int B){
for(int i=2;i<=A;i++){
if(A%i==0){
array1.add(i);
}
}
for(int i=2;i<=B;i++){
if(B%i==0){
array2.add(i);
}
}
}
public int check(int[] array1,int[] array2,ArrayList<Integer> listA,ArrayList<Integer> listB){
int answerA =0,answerB =0;
for(int i=0;i<listA.size();i++){
boolean flag=true;
for(int j=0;j<array1.length;j++){
if(array1[j]%listA.get(i)!=0){
flag =false;
break;
}
}
if(!flag) continue;
for(int j=0;j<array2.length;j++){
if(array2[j]%listA.get(i)==0){
flag =false;
break;
}
}
if(flag) answerA=listA.get(i);
}
for(int i=0;i<listB.size();i++){
boolean flag=true;
for(int j=0;j<array2.length;j++){
if(array2[j]%listB.get(i)!=0){
flag =false;
break;
}
}
if(!flag) continue;
for(int j=0;j<array1.length;j++){
if(array1[j]%listB.get(i)==0){
flag =false;
break;
}
}
if(flag) answerB=listB.get(i);
}
answerA =Math.max(answerA,answerB);
return answerA;
}
}
ArrayA의 약수와 ArrayB의 약수를 만들어서 비교를 해주면 되는 문제
코드가 길어졌는데 같은 반복을 두번쓴 함수를 사용했기 때문. 사실 한번만 불러올수 있도록 코드를 짜는것이 옳다.