Study/알고리즘

백준: 최대공약수(GCD)와 최소공배수(LCM) 구하는 메소드 (나머지 연산)

devyoseph 2021. 12. 3. 23:32

문제) 12와 20의 최대공약수를 구하시오

 

어떻게 푸시나요?

보통 나눗셈을 합니다

최대공약수 = 2X2 = 4​

하지만 주어진 두 수가 엄청 크다면

어떤 수로 나눠야할지 일일히 찾아야하기 때문에

컴퓨터 연산에서는 비효율적입니다

최대공약수

A와 B의 나머지 연산으로 최대공약수를 구한다

두 수(12, 20)만으로 최대공약수를 구해봅시다​

20 % 12 = 8 (20을 12로 나눈 나머지)

12 % 8 = 4 (12를 8로 나눈 나머지)

8 % 4 = 0 (나머지가 0일 때 그 수는 최대공약수)

논리가 매우 단순해졌죠??​

메소드로 만들면 다음과 같습니다

static int GCD(int A, int B) { //B를 A로 나눈 나머지를 구합니다
		if(A==0)return B; // 마지막 나머지가 0이 될때 나눠준 A가 곧 최대공약수입니다 
		return GCD(B%A,A); // A를 다시 나눠줍니다. B를 A로 나눈 나머지로 A를 나눕니다

//A가 B보다 더 크다면? B%A=B가 되고 결국 GCD(B%A,A)가 됩니다. 즉 처음 GCD(A, B)에서 자동정렬된 GCD(B, A)가 됩니다
}

 

이 메소드 안에 12 20을 집어넣으면?

컴퓨터는 이렇게 찾아냅니다!

 

최소공배수

A에 1,2,3...N 을 곱해본다

AxN 을 B로 나눈 나머지가 0이 될 때

AxN은 곧 최소공배수이다

12와 20의 최소공배수는 어떻게 구할까요?

한 쪽에다 계속 숫자를 곱해 확인합니다

(12 x 1) % 20 = 12

(12 x 2) % 20 = 4

(12 x 3) % 20 = 16

(12 x 4) % 20 = 8

(12 x 5) % 20 = 0

12 x 5 = 60이 최소공배수입니다

메소드는 다음과 같습니다

static int LCM(int A, int B, int N) {
		if((A*N)%B==0)return A*N;
		return LCM(A,B,N+1);
}

 

 

Java 전체 코드

import java.util.*;
public class Main {
	 static int GCD(int A, int B) {
			if(A==0)return B;
			return GCD(B%A,A);
	}
	public static void main(String[] args) {
		Scanner sc = new Scanner(System.in);
		int A = sc.nextInt();
		int B = sc.nextInt();
		System.out.println(GCD(A,B));
}}
import java.util.*;
public class Main {
    static int LCM(int A, int B, int N) {
		if((A*N)%B==0)return A*N;
		return LCM(A,B,N+1);
	}
	public static void main(String[] args) {
		Scanner sc = new Scanner(System.in);
		int A = sc.nextInt();
		int B = sc.nextInt();
		System.out.println(LCM(A,B,1));
}}