알고리즘, 코딩테스트

[프로그래머스/ 코딩테스트 연습문제] 최대공약수와 최소공배수

jy3574 2024. 11. 20. 09:29

Q. 최대공약수와 최소공배수

A.

class Solution {
//코드 재사용성을 위해 최대공약수와 최소공배수는 메서드를 따로 분리해봄
    public int[] solution(int n, int m) {
//두 수 중 큰값 = max, 두 수 중 작은 값= min
        int max = Math.max(n,m);
        int min = Math.min(n,m);
        
//GCD : 최대공약수를 계산하는 메서드 호출, LCM : 최소공배수를 계산하는 메서드 호출 
        int gcd = getGCD(max,min);
        int lcm = getLCM(max,min,gcd);
        
//answer = [최대공약수, 최소공배수]를 리턴해야하니까 배열로 반환
        int[] answer = new int[]{gcd,lcm};
        return answer;
    }
    
//최대공약수 계산
    private int getGCD(int a, int b){
//나머지가 0이 될때까지 반복
        while(b != 0){
//원래의 b 값을 c에 저장하고,
//a를 b로 나눈 나머지를 b에 저장, 
//이전 b 값을 a에 저장 후 나머지가 0이 될때까지 반복
//ex> a=48, b=18
// c = 18 , b = 48%18 = 12, a = 18 -> c = 12, b = 18%12 =6, a = 12 -> c = 6, b = 12%6 = 0, a=6
//나머지가 0이 됐으니까 반복 종료 return 6
            int c = b;
            b = a % b;
            a = c;
        }
        return a;
    }
    
//최소공배수 계산
    private int getLCM(int a, int b, int gcd){
//두 수를 곱한 뒤에 최대공약수로 나누면 최소공배수
        return (a * b) / gcd;
    }
}