공부 자료/알고리즘

[알고리즘] 최대공약수와 최소공배수

sshrik 2018. 7. 16. 14:30

 

[알고리즘] 최대공약수와 최소공배수

 
    최대 공약수와 최소 공배수를 구하는 방법은 간단합니다. 요즘은 초등학생들도 할 수 있는 소인수 분해를 통해 구하면 됩니다. 다만, 컴퓨터 프로그래밍상에서 계산하는 방식은 조금 어렵습니다. 구현상의 문제가 아닌 시간 복잡도 상으로 굉장히 오래걸리기 때문입니다. 이 때문에 나온 방법이 바로 "유클리드 호제법" 입니다. 이에 대한 자세한 설명은 여기에서 확인 가능합니다. 먼저 방법부터 설명 해 보겠습니다.
 
    먼저 두 수 A, B가 있다고 할 때, A와 B의 최대공약수를 구하는 방식은 다음과 같습니다. ( A >= B 라고 가정하고 시작합니다. )
 
    A 가 B로 나눴을 때 나머지가 0인가?
       -> Yes : End. 최대 공약수는 B
       -> No : A = A % B; Swap(A, B) // A >= B의 조건을 만족하기 위해서
           다시 반복.
 
    의외로 간단한데, 이를 코드로 나타내면 다음과 같게 표현 가능합니다.
 
int getLCD(int a, int b)    {
    int A = a;
    int B = b;
    
    while(A % B != 0) {
        A = A % B;
        swap(&A, &B);
    }

    return B;
}
 
 
    최소공배수는 더 간단합니다. a * b / getLCD(a, b) 로 진행 해 주면 끝이기 때문입니다.
 
    사실 최소공배수, 최대공약수를 구하는 방법은 간단하나, 이에 대한 응용 문제가 어렵습니다.
 
    백준 2981번 문제는 최대공약수를 이용하는 문제인데, 한 번 풀어보는 것을 권유드립니다. 해답은 질문란에 가면 모두 존재하기 때문에 진행하지 않도록 하겠습니다.