대범하게

[알고리즘] 유클리드 호제법 & 백준(최대공약수와 최소공배수) 본문

Problem Solving/Algorithm Concepts

[알고리즘] 유클리드 호제법 & 백준(최대공약수와 최소공배수)

대범하게 2022. 12. 13. 03:25
반응형

유클리드 호제법

유클리드 호제법을 알기 전에

먼저 호제법이란 두 수가 서로 상대방 수를 나누어서 결국 원하는 수를 얻는 알고리즘을 말한다.

 

우리가 알고자 하는 유클리드 호제법두 수의 최대공약수를 구하는 알고리즘이다. 

(A와 B의 최대공약수는 B와 A를 B로 나눈 나머지의 최대공약수와 같다는 것이다.)

 

2개의 자연수 a, b에 대해서 ab로 나눈 나머지를 r이라 하면 (단, a > b), a와 b의 최대공약수는 b와 r의 최대공약수와 같다.

즉, gcd(a, b) = gcd(b, r)와 같다는 말이다. (gcd()는 최대공약수를 나타내는 표기이다.)

 

예시 입력으로 보면,

gcd(24, 18) = gcd(18, 6) = gcd(6, 0)인 것이다!

여기서 b가 0이 되는 순간의 6이 바로 최대공약수가 된다.

def gcd(a, b):
    while b > 0:
        a, b = b, a % b
    return a
# 재귀로 나타내는 법
def gcd(a, b):
    if b == 0:
    	return a
	return gcd(b, a % b)

 

최소공배수는 ab의 곱을 ab의 최대 공약수(= gcd(a, b))로 나누면 나오게 된다.

def lcm(a, b):
    return a * b / gcd(a, b)

1. 2609: 최대공약수와 최소공배수

최대공약수(GCD : Greatest Common Divisor)와 최소공배수(LCM : Least Common Multiple)를 구하는 문제다.

최대공약수는 유클리드 알고리즘을 이용해 구하고, 최소공배수는 a * b를 최대공약수로 나눈 값과 같다.

import sys
input = sys.stdin.readline

a, b = map(int, input().split())

def gcd(a, b):
    while b > 0:
        a, b = b, a % b
    return a

def lcm(a, b):
    return a * b // gcd(a, b)

print(gcd(a, b))
print(lcm(a, b))

파이썬 math 모듈 에 최대공약수와 최소공배수를 구하는 함수가 내장되어있다고 한다. 

import math

a, b = map(int, input().split())

print(math.gcd(a, b))
print(math.lcm(a, b))

 

Reference)

https://velog.io/@junyp1/%EC%9C%A0%ED%81%B4%EB%A6%AC%EB%93%9C-%ED%98%B8%EC%A0%9C%EB%B2%95

 

 

Comments