[プログラマLv 2]N個の最小公倍数(python)


質問する
https://programmers.co.kr/learn/courses/30/lessons/12953
マイコード
"""
1. 아이디어
최소 공배수 구하는 문제인데 식을 몰라서 비효율 적이게 풀 수 있을거 같다.

2. 시간복잡도
O(N^2)
"""

def solution(arr):
    
    for i in range(1, 100000000+1):
        for j in arr:
            if i % j == 0: # 만약 i의 약수이면 계속 반복문을 돌고
                continue
            else: # i의 약수가 아니면 break
                break
        else: # 이 코드는 i의 약수가 아니고 정상적으로 반복문이 종료되면 수행된다.
            return i
    
他人のコード

def gcd(a, b): # 유클리드 호제법
    
    while b > 0:
        a, b = b, a % b
        
    return a
 
def lcm(a, b): # 최소 공배수
    return a * b / gcd(a,b)
 
 
def solution(arr):
    answer = 1
    
    for num in arr:
        answer = lcm(num, answer)
    
    return answer
    
に感銘を与える
最大公約数、最小公倍数の方法を忘れないでください.覚えておいてください.
最大公約数とは、所定の数字a、bが与えられた場合の、共通の約数のうちの最大値である.
  • 最大公約数
  • を求めます

  • a,bそれぞれの薬水を求め,共通の薬水から最大値を見つける方法
    ->探す必要のない薬も探しているので効率が悪い.

  • ユークリッドアークほう
    ユークリッドアーク除去法とは、数字a,bがある場合、aをbの残りとbで割った最大公約数がaとbの最大公約数に等しいことを意味する.
  • では、aをbで割って、bが0になるまで続け、残りのa値が最大公約数となる.
    
    def gcd(a, b):
        
        while b > 0:
            a, b = b, a % b
            
        return a
        
    最小公倍数、数字a,bが与えられると、a,bの積をa,bの最大公倍数で除算する.
    
    def lcm(a, b):
        return a * b / gcd(a,b)
        
    ただし、mathライブラリを使用して解くことはできます.以下に示します.
    import math
    
    print(math.gcd(20, 45)) # 5
    print(math.lcm(10, 20, 35)) # 140