기타/코딩테스트

(코테) 프로그래머스_N개의 최소공배수 *최소공배수 GCD , LCM

불광동 물주먹 2025. 6. 26. 17:17

 

더보기

문제 설명
두 수의 최소공배수(Least Common Multiple)란 입력된 두 수의 배수 중 공통이 되는 가장 작은 숫자를 의미합니다. 예를 들어 2와 7의 최소공배수는 14가 됩니다. 정의를 확장해서, n개의 수의 최소공배수는 n 개의 수들의 배수 중 공통이 되는 가장 작은 숫자가 됩니다. n개의 숫자를 담은 배열 arr이 입력되었을 때 이 수들의 최소공배수를 반환하는 함수, solution을 완성해 주세요.

제한 사항
arr은 길이 1이상, 15이하인 배열입니다.
arr의 원소는 100 이하인 자연수입니다.
입출력 예
arr result
[2,6,8,14] 168
[1,2,3] 6

 

 

 

 

 

최초 나의 코드 

class Solution {
    public int solution(int[] arr) {       
        int maxOrign = 0;
        int max = 0;

        for(int next:arr){
                maxOrign = Math.max(maxOrign,next);
        }

        max= maxOrign;

        while(true){   
            boolean flag = true;
            for(int i=0;i<arr.length;i++){
                if(max % arr[i] != 0){
                    max = max + maxOrign ; 
                    flag = false;
                    break;                  
                }                
            }         
            if(flag) return max;                                
        }        

    }
}

 

 

->배열의 가장 큰 값을 기준으로   배열을 순회하면서 maxOragin을 추가로 더하면서 반복문 돌림
시간복잡도가 (N*M) 으로 효율이 좋진 않다. 

다만, 문제에서 범위가 크지 않아 통과는 됐다......

 

 

 

GCD , LCM 적용

  • 공약수 (GCD): 두 수가 공통으로 나눠지는 가장 큰 수
  • 공배수 (LCM): 두 수가 공통으로 나눠지는 배수 중 가장 작은 수
class Solution {
    public int solution(int[] arr) {
        int lcm = arr[0];  // 첫 번째 수로 초기화
        for (int i = 1; i < arr.length; i++) {
            lcm = getLCM(lcm, arr[i]);  // 누적해서 LCM 계산
        }
        return lcm;
    }

    private int getLCM(int a, int b) {
        return a * b / getGCD(a, b);  // 최소공배수 공식
    }

    private int getGCD(int a, int b) {
        while (b != 0) {
            int tmp = b;
            b = a % b;  // 나머지를 계속 구함
            a = tmp;
        }
        return a;  // b가 0이 되면 a가 최대공약수
    }
}