코딩테스트/백준

JAVA 백준 2609번 최대공약수와 최소공배수

광고(주) 2022. 6. 17. 09:46
반응형

문제

두 개의 자연수를 입력받아 최대 공약수와 최소 공배수를 출력하는 프로그램을 작성하시오.

입력

첫째 줄에는 두 개의 자연수가 주어진다. 이 둘은 10,000이하의 자연수이며 사이에 한 칸의 공백이 주어진다.

24 18

출력

첫째 줄에는 입력으로 주어진 두 수의 최대공약수를, 둘째 줄에는 입력으로 주어진 두 수의 최소 공배수를 출력한다.

6
72

알고리즘 분류

유클리드 호제법(euclidean), 수학(math), 정수론(number_theory)

힌트

a, b의 최소공배수는 절대값 a x b 를 최대공약수로 나눗값과 같다
a, b의 최대공약수는 절대값 a x b 를 최소공배수로 나눗값과 같다
최소공배수나, 최대공배수를 못구할경우 순환오류가 발생한다.
최대공약수는 유클리드 알고리즘으로 풀수있다. 두 양의정수 a>b 가정이 있으나
a<b일 때 a mod b ≡ a(a%b==a)이므로 Gcd(a,b)는 Gcd(b,a)를 호출하므로 자연스럽게 a와 b 위치가 바뀌게 된다.

int GCD(int a, int b)
{
    int r = a % b;
    if (r == 0) {
      return b;
    }
    return GCD(b, r);
}

소스코드

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 token = new StringTokenizer(br.readLine(), " ");
        int N = Math.abs(Integer.parseInt(token.nextToken()));
        int S = Math.abs(Integer.parseInt(token.nextToken()));

        int gcd = GCD(S, N);
        System.out.println(gcd);
        System.out.println((N * S) / gcd); // LCM
    }

    // greatest common divisor
    static int GCD(int a, int b) {
        if (b == 0) return a;
        return GCD(b, a % b);
    }

    // least common multiple
    static int LCM(int a, int b) {
        return (a * b) / GCD(a, b);
    }
}
반응형