본문 바로가기

CS ﹒ Algorithm/Baekjoon

Java 백준 문제풀이 (34) 2609: 최대공약수와 최소공배수

 

 

 

 

 

 

최대공약수와 최소공배수는 유클리드 호제법을 이용하면 쉽게 구할 수 있다.

 

 

유클리드 호제법(-互除法, Euclidean algorithm) 또는 유클리드 알고리즘은 2개의 자연수 또는 정식(整式)의 최대공약수를 구하는 알고리즘의 하나이다. 호제법이란 말은 두 수가 서로(互) 상대방 수를 나누어(除)서 결국 원하는 수를 얻는 알고리즘을 나타낸다. 2개의 자연수(또는 정식) a, b에 대해서 a를 b로 나눈 나머지를 r이라 하면(단, a>b), a와 b의 최대공약수는 b와 r의 최대공약수와 같다. 이 성질에 따라, b를 r로 나눈 나머지 r'를 구하고, 다시 r을 r'로 나눈 나머지를 구하는 과정을 반복하여 나머지가 0이 되었을 때 나누는 수가 a와 b의 최대공약수이다. 이는 명시적으로 기술된 가장 오래된 알고리즘으로서도 알려져 있으며, 기원전 300년경에 쓰인 《원론》 제7권, 명제 1부터 3까지에 해당한다. 최소공배수, 최대공약수를 구하기 위해서는 다음과 같은 표를 쓴다.

 

어.. 그렇다고 한다.

수학시간은 아니니까 적용 방법만 알아보자.

 

숫자 n1과 n2가 있을 때 최대공약수를 구하는 방법은 다음과 같다.

 

n1 % n2 = n3

n2 % n3 = n4

n3 % n4 = n5

...

n6 % n7 = 0일 때 n7이 최소 공약수이다. 단, 여기서 n1이 n2보다 크다고 가정한다.

 

최대공약수를 구했다면 최소공배수는 쉽다.

n1 * n2 / 최대공약수(n1, n2)가 최소 공배수이다.

 

여기까지 봤으면 그만 보고 직접 코드 치러 가자.

더 보면 받아쓰기 공부다.

 

 

 

 

 

 

 

 

 

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.StringTokenizer;

public class Main {
    public static void main(String[] args) throws IOException {
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        StringTokenizer st = new StringTokenizer(br.readLine(), " ");

        int num1 = Integer.parseInt(st.nextToken());
        int num2 = Integer.parseInt(st.nextToken());

        int max = Math.max(num1,num2);
        int min = Math.min(num1,num2);

        int gcd = getGcd(max, min);
        int lcm = getLcm(max, min, gcd);

        System.out.println(gcd);
        System.out.println(lcm);
    }

    static int getGcd(int max, int min) {
        int temp = 0;

        for (;;) {
            temp = max%min;
            if ( temp == 0 ) { return min; }

            max = min;
            min = temp;
        }

    }

    static int getLcm(int n1, int n2, int gcd) {
        return n1*n2/gcd;
    }
}