백준 2436 공약수 (Python,Pypy)

Joowan Park·2023년 8월 8일
0

코딩

목록 보기
21/28
import sys
import math

input =  sys.stdin.readline
A,B = map(int,input().split())

x = math.gcd(A,B) 
y = math.lcm(A,B)
z = y // x

result = []
divisor = []
for i in range (1,int(math.sqrt(z))+1):
    if z % i == 0:
        if math.gcd(i,z // i) == 1:
            b = [x*i,x*(z // i)]
            divisor.append(b)
            y = i + (z // i)
            result.append(y)
        else:
            continue
    else:
        continue

z = min(result)
c = result.index(z)
d = " ".join(str(s) for s in divisor[c])
print(d)

실행시간은 40ms

아이디어로는 "최소공배수를 최대공약수로 나눈 후, 몫을 서로소인 두 수의 곱으로 나타내는 것" 이겠다.

또 다른 예를 들어본다면 40과 90을 들어보자.
이 둘의 최대공약수는 10이며, 최소공배수는 360이다.
최소공배수 / 최대공약수 = 36 이며, 이를 서로소인 두 수의 곱으로 나타내는 방법은
(1,36), (4,9) 이렇게 두 쌍만 존재하는데 합을 최소로 하기 위해서는 4와9를 취하고, 최대공약수를 곱해주면 되겠다. 즉, 그대로인 40과 90가 되겠다.

profile
Complex Dynamics에서 탈출한 원숭이

0개의 댓글