자료구조 & 알고리즘/[수학] 최대공약수 & 최소공배수

최대공약수 & 최소공배수 이론 예시 코드

꾸준함의 미더덕 2024. 1. 20. 21:28
# 최대 공약수 & 최소 공배수  --> // 두 자연수의 곱 == 최대 공약수 * 최소 공배수
## 약수
- 해당 수를 나눠서 나머지가 0이 되는 수
- ** 해당 수 /2 까지 나머지가 0인 수 + 해당 수 **
## 최대 공약수
- 두 수의 약수 중 공통적으로 나오는 약수이면서 가장 큰 수
## 최소 공배수
- 배수 중 공통적으로 배수면서 가장 작은 수
- 최소 공배수 == (a * b) / GCD(a, b)   <- **두 원소 곱하고 최대 공약수로 나누기.**

public class Practice {
    //  약수 --> 나눠서 나머지가 발생하지 않는 수
    public List<Integer> getDivisor(int num) {
        List<Integer> result = new ArrayList();
        for (int i = 1; i <= num / 2; i++) { // 절반까지 체크
            if (num % i == 0) {
                result.add(i);
            }
        }
        result.add(num); // 자기 자신도 약수..
        return result;
    }

    //  최대 공약수
//  GCD: the Greatest Common Denominator
    public int getGCD(int numA, int numB) {
        int gcd = -1;
        List<Integer> aDvisors = getDivisor(numA);
        List<Integer> bDvisors = getDivisor(numB);

        for (int itemA : aDvisors) {
            for (int itemB : bDvisors) {
                if (itemA == itemB && gcd < itemA) {
                    gcd = itemA;
                }
            }
        }
        return gcd;
    }

    //  최소 공배수 == (a * b) / GCD(a, b)   <- 두 원소 곱하고 최대 공약수로 나누기.
//  LCM: the Lowest Common Multiple
    public int getLCM(int numA, int numB) {
        int lcm = -1;
        int gcd = this.getGCD(numA, numB);
        if (gcd == -1) {
            lcm = numA * numB / gcd;
        }
        return lcm;
    }
    public static void main(String[] args) {

//      Test code
        int number1 = 10;
        int number2 = 6;

        Practice p = new Practice();
        List<Integer> l1 = p.getDivisor(number1);   // 10: 1, 2, 5, 10
        List<Integer> l2 = p.getDivisor(number2);   // 6: 1, 2, 3, 6
        System.out.println("l1 = " + l1);
        System.out.println("l2 = " + l2);

        System.out.println("최대 공약수: " + p.getGCD(number1, number2));
        System.out.println("최대 공배수: " + p.getLCM(number1, number2));
    }
}