프로그래머스

[프로그래머스_Level1] 최대공약수와 최소공배수

빙수빈수 2021. 7. 10. 18:16

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

 

코딩테스트 연습 - 최대공약수와 최소공배수

두 수를 입력받아 두 수의 최대공약수와 최소공배수를 반환하는 함수, solution을 완성해 보세요. 배열의 맨 앞에 최대공약수, 그다음 최소공배수를 넣어 반환하면 됩니다. 예를 들어 두 수 3, 12의

programmers.co.kr

[문제]

 두 수를 입력받아 두 수의 최대공약수와 최소공배수를 반환하는 함수, solution을 완성해 보세요. 배열의 맨 앞에 최대공약수, 그다음 최소공배수를 넣어 반환하면 됩니다. 예를 들어 두 수 3, 12의 최대공약수는 3, 최소공배수는 12이므로 solution(3, 12)는 [3, 12]를 반환해야 합니다.

 

[제한 조건]

두 수는 1이상 1000000이하의 자연수입니다.

 

[코드]

class Solution {
public int[] solution(int n, int m) {
        int[] answer=new int[2];
        int a=m;
        int b=n;
        
        /*
         * 유클리드 호제법을 사용하여 최대공약수 구하기
         * GCD(a,b) = GCD(b,r) 이때 r은 a%b를 의미한다.
         */
        while(b!=0) {
        	int r=a%b;
        	
        	a=b;
        	b=r;
        }
        
        answer[0]=a; // 최대공약수 저장
        answer[1]=(n/a)*(m/a)*a; // 최소공배수 구하기
        
        return answer;
    }
}


[고찰]

 이번 문제는 이전에 백준에서도 풀어보았던 최대공약수, 최소공배수 문제였다. 최대공약수만 구하면 최소공배수는 각각의 값을 최대공약수로 나눈 몫과 최대공약수의 곱으로 구할 수 있기 때문에 최대공약수를 구하는 것이 중점인 문제이다. 최대공약수는 유클리드 호제법이란 알고리즘으로 구할 수 있다.

유클리드 호제법이란 a와 b의 최대공약수를 (a,b)라고 할 때 (a,b)의 최대공약수는 (b,r)의 최대공약수와 같다는 것을 말한다. 여기서 r은 a를 b로 나눈 나머지를 의미한다. 즉, GCD(a,b) = GCD(b,r) 이다.
 예를 들어 GCD(581,322)일 때 r(나머지)=259이다. 즉, GCD(581,322)=GCD(322,259)이다. 이를 반복하면 GCD(581,322) = GCD(322,259) = GCD(259 63) = GCD(63,7) = GCD(7,0) = 7 이 된다.

이와 같은 과정을 코드로 구현하면 위와 같고 이렇게 최대공약수를 구했다면 최소공배수 또한 쉽게 구할 수 있다.