프로그래머스/LV2

[프로그래머스 Lv2, python]- N개의 최소공배수

chyam_eun 2024. 12. 27. 12:12

def solution(arr):
    an=1
    li=[[1] for a in range(len(arr))] #소인수 분해를 저장할 리스트. 1은 모든수에 들어가서 미리 저장
    idx=0 # 리스트의 인덱스
    for a in arr:
        b=2 #2부터 나눠주기
        while(b<=a):
            if a%b==0: 
                a//=b
                li[idx].append(b)
                b=2 #최소의 숫자로 나눠주기위해 초기화해주는
            else:
                b+=1      
        idx+=1
    stack=[] # 각 소인수분해들 중에서 같은 숫자중 많은 수를 가진거 저장하기
    for i in li:
        for j in i:
            if j not in stack: # 없는 수이면 추가해주기
                stack.append(j)
            else:
                if stack.count(j)<i.count(j): # 스택에있는 숫자의 수보다 리스트안에 있는 숫자의 수가 클때 추가
                    stack.append(j)
    for i in stack: #곱해주기
        an*=i
    return an

처음에 최대공약수랑 최소공배수 구하는거 잘몰라서 복잡하게 풀었다..

def lcm(a,b): #최소 공배수. 
    return a*b//gcd(a,b)

def gcd(a,b): #최대 공약수.유클리드 호제법 사용
    if a%b==0:
        return b
    return gcd(b,a%b)

def solution(arr):
    answer=arr[0]
    for num in arr[1:]:
        answer=lcm(answer,num)
    return answer

최소공배수는 lcm으로, 두 수를 곱한뒤 최대공약수를 나누어줘야함.

 

최대공약수는 유클리드 호제법을 사용함.

만약 48과 18을 구할때, 48%18=12이고, 다시 뒤에 두 숫자의 나머지를 구해서 0이될때까지 하는것임. 18%12=6, 12%6=0이므로 최대공약수는 6이된다. 

이를 a,b로 한다면 위의 함수와 같이 사용할 수 있다.

 

또한 두개씩 비교해야한다.