백준 2609 파이썬 최대공약수와 최소공배수


차근차근 풀었는데 시간 초과가 떴다.

약수를 하나하나 넣고 배수를 하나하나 넣어서 해서 시간이 너무 오래걸린듯

 

import sys

x, y = sys.stdin.readline().split()
x = int(x)
y = int(y)

factor_x = [x]
for i in range(1, x//2 + 1):
    if x % i == 0:
        factor_x.append(i)

factor_y = [y]
for i in range(1, y//2 + 1):
    if y % i == 0:
        factor_y.append(i)

common_f = []
for i in factor_y:
    if i in factor_x :
        common_f.append(i)

mul = []
for i in range(max(x, y), x * y + 1):
    if i % x == 0 and i % y == 0 :
        mul.append(i)

print(max(common_f))
print(min(mul))

 

 

 

 

유클리드 호제법을 이용해서 풀면 빠르게 풀린다.

 

a와 b 두 수가 있다고 할 때, 

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

 

예를 들어,

최대공약수(24, 18) = 최대공약수(18, 6) = 최대공약수(6, 0)가 되어

결국 둘의 최대공약수는 6이 되는 것

 

최소공배수는 

a * b를 최대공약수로 나눈 수가 된다.

import sys

x, y = map(int, sys.stdin.readline().split())


# 최대공약수 구하기
def GCD(a, b):
    A = a
    while b > 0:
        a = b
        b = A % b
        A = a
    return a


# 최소공배수 구하기
def LCM(a, b):
    return a * b // GCD(a, b)


print(GCD(x, y))
print(LCM(x, y))

 

'공부하자! > 알고리즘' 카테고리의 다른 글

백준 10250 ACM 호텔  (0) 2021.03.12
백준 1009 파이썬 분산처리  (0) 2021.03.11
백준 10989 파이썬 수 정렬하기 3  (0) 2021.03.10
백준 10845 파이썬 큐  (0) 2021.03.09
백준 2108 파이썬 통계학  (0) 2021.03.08