본문 바로가기

ALGORITHM_PRACTICE

최대공약수(gcd), 최소공배수(lcm)

알고리즘 문제를 풀다보면 가끔 최대공약수, 최소공배수를 구하라는 문제가 나온다.

자주 있는 문제 유형이 아니다보니 항상 문제를 풀때마다 구하는 방법을 찾는 것 같아서

정리할 필요가 있어서 작성한다.

유클리드 공식이라고 하여 최대공약수에는 다음과 같은 성질이 있다.

  • 0과 n의 최대공약수는 n이다
  • a와 b의 최대공약수는 b와 a를 b로 나눈 나머지의 최대공약수와 같다

위와 같은 성질이 있다고 한다.

이 공식을 토대로 코드를 작성하면 다음과 같다

 

int gcd(int a, int b){
    // 큰 숫자를 a에 둔다
    if(a < b){
        int t = a;
        a = b;
        b = t;
    }
    while(b!=0){
        int n = a % b;
        a = b;
        b = n;
    }
    return a;
}

 

작은 수가 0이 될때까지 반복을 하다보면 a와 0의 최대공약수가 나온다.

이 공약수가 최대공약수가 되도록 만든 것이다.

 

최소공배수는 다음과 같이 구한다.

  • a와 b의 곱을 구한다
  • 곱을 최대공약수로 나눈다

위와 같이 구하면 최소공배수가 된다.

 

int lcm(int a, int b){
    return a * b / gcd(a, b);
}

 

최대공약수만 구하면 정말 간단한 함수가 된다.

 

간단하니까 잘 외워둬야겠다.

'ALGORITHM_PRACTICE' 카테고리의 다른 글

[C++] 퀵 소트(Quick Sort) 구현  (0) 2019.12.18
[C++] 계산기 구현  (1) 2019.12.17
[프로그래머스] 최고의 집합  (0) 2019.12.11
[프로그래머스] 방문 길이  (0) 2019.12.08
[프로그래머스] 라면공장  (0) 2019.12.08