Programming/python

[Daily 코테] 백준 2609번: 최대공약수와 최소공배수

mariej 2023. 11. 9. 15:39

https://www.acmicpc.net/problem/2609

 

2609번: 최대공약수와 최소공배수

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

www.acmicpc.net

 

First Try

"""
최대공약수 : 교집합
최소공배수 : 합집합
"""
def get_factors(x: int) -> list:
"""
입력받은 x의 약수를 반환한다.
"""
  factors = []
  n = 2
  while (True):
    if x == 1:
      break
    if x % n == 0:
      factors.append(n)
      x = x / n
    else:
      n += 1
  return factors

def get_gcn(a, b: list):
"""
두 수의 약수 리스트를 각각 입력받고, 최대공약수를 출력한다.
"""
  inter = set(a)&set(b) #공약수이므로 두 수에 공통으로 포함된 약수를 교집합을 활용하여 구한다.
  result = 1
  for n in inter:
    result *= n**min(a.count(n),b.count(n)) 
  return result

def get_lcm(a ,b):
"""
두 수의 약수 리스트를 각각 입력받고, 최소공배수를 출력한다.
"""
  union = set(a)|set(b) # 공배수이므로 두 수의 약수들 중 하나 이상 포함하는 모든 약수들을
                    # 합집합을 활용하여 구한다.
  result = 1
  for n in union:
    result *= n**max(a.count(n),b.count(n))
  return result

num1, num2 = map(int, input().split())
print(get_gcn(get_factors(num1),get_factors(num2)))
print(get_lcm(get_factors(num1),get_factors(num2)))