코딩테스트

[프로그래머스] 최대공약수와 최소공배수 자바 유클리드 호제법

mhui123 2025. 4. 7. 10:15
반응형

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

 

프로그래머스

SW개발자를 위한 평가, 교육, 채용까지 Total Solution을 제공하는 개발자 성장을 위한 베이스캠프

programmers.co.kr

문제

주어진 두 수의 최대공약수와 최소공배수를 배열에 담아 반환하시오.

접근

각 수의 약수 리스트를 먼저 구한 후, 반복문으로 m의 약수 목록에 n의 약수가 존재하는지 체크하고 촌재하면 최대값을 갱신 -> 최대공약수

 

최소공배수는 (n * m) / 최대공약수를 활용했다.

 

public static int[] solution(int n, int m) {
        List<Integer> nFactors = getFactors(n);
        List<Integer> mFactors = getFactors(m);
        int maxFactor = 1; // 최대 공약수
        int minMulti = 1;
        for(int x : nFactors){
            boolean isExist = mFactors.contains(x);
            if(isExist){
                maxFactor = Math.max(maxFactor, x);
            }
        }
        //최소공배수 공식 : (n * m) / 최대공약수
        minMulti = (n * m) / maxFactor;
        return new int[]{maxFactor, minMulti};
    }

    //제곱근으로 약수구하기
    public static List<Integer> getFactors(int n){
        List<Integer> factors = new ArrayList<>();
        for(int i = 1; i <= Math.sqrt(n); i ++){
            if (n % i == 0) {
                factors.add(i);
                if (i != n / i) { // 중복 제거 (예: 5x3, 3x5)
                    factors.add(n / i);
                }
            }
        }
        Collections.sort(factors);
        return factors;
    }

발견된 문제 : 더 효율적인 방법

최대공약수를 구할 더 효율적인 방법이 있었다. 유클리드 호제법이라고 한다.

//유클리드 호제법을 이용한 최대공약수 계산
    public int getGCD(int n, int m){
        while ( m != 0) {
            int temp = n % m ;
            n = m;
            m = temp;
        }
        return n;
    }

개선

public static int[] solution2(int n, int m){
        int gcd = getGCD(n, m);
        int lcm = (n * m) / gcd;
        return new int[]{gcd, lcm};
    }
반응형