숫자카드 나누기

Lee1231234·2023년 3월 27일

코딩테스트

목록 보기
8/95

문제 설명
철수와 영희는 선생님으로부터 숫자가 하나씩 적힌 카드들을 절반씩 나눠서 가진 후, 다음 두 조건 중 하나를 만족하는 가장 큰 양의 정수 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의 약수를 만들어서 비교를 해주면 되는 문제
코드가 길어졌는데 같은 반복을 두번쓴 함수를 사용했기 때문. 사실 한번만 불러올수 있도록 코드를 짜는것이 옳다.

profile
not null

0개의 댓글