programmers_숫자 카드 나누기_java

2023. 5. 15. 15:13Algorithm/Programmers

728x90

https://school.programmers.co.kr/learn/courses/30/lessons/135807

 

프로그래머스

코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요.

programmers.co.kr

import java.util.*;

class Solution {
    public int solution(int[] arrayA, int[] arrayB) {
        int answer = 0;

        int arrayLength = arrayA.length;
        // 오름차순 정렬
        Arrays.sort(arrayA);
        Arrays.sort(arrayB);
        
        // 각각의 최대공약수 찾기
        int aGCD = arrayA[0];
        int bGCD = arrayB[0];
        for (int i = 1; i<arrayLength; i++){
            aGCD = findGCD(arrayA[i], aGCD);
            bGCD = findGCD(arrayB[i], bGCD);
        }

        // 조건을 만족하는 가장 큰 값 찾기
        answer = Math.max(findMaxDivisor(aGCD, arrayB), findMaxDivisor(bGCD, arrayA));

        return answer;
    }

    // 최대공약수 찾기
    public int findGCD(int num1, int num2){
        while (num2 != 0){
            int n = num1 % num2;
            num1 = num2;
            num2 = n;
        }

        return num1;
    }

    // 조건 만족하는 가장 큰 정수 찾기
    public int findMaxDivisor(int gcd, int[] array){
        List<Integer> aGCDDivsors = findDivisors(gcd);

        for (int i = 0; i<aGCDDivsors.size(); i++){
            int divisor = aGCDDivsors.get(i);
            boolean res = true;
            for (int num : array){
                if(num%divisor == 0){
                    res = false;
                    break;
                }
            }
            if (res){
                return divisor;
            }
        }
        return 0;
    }

    // num의 약수 찾기 (내림차순)
    public List<Integer> findDivisors(int num){
        List<Integer> divisors = new ArrayList<>();
        for(int i = 2; i<Math.sqrt(num); i++){
            if(num%i == 0){
                divisors.add(0, i);
            }
        }
        divisors.add(0, num);
        return divisors;
    }
}