level1_최대공약수와 최소공배수

2024. 2. 19. 14:41파이썬_알고리즘(코딩테스트)/level1

 

내가 제출한 코드

import math

def solution(n, m):
    # 최대공약수
    a = math.gcd(n,m)
    # 최소공배수
    b = n * m // a
    return [a,b]

 

사실 처음에 코드를 어떻게 쳐야할지 감이 안잡혀서 구글에 검색을 했다.

그랬더니 파이썬 'math'모듈에 최대공약수를 계산하는 'gcd'함수가 내장되어 있는걸 알 수 있었다.

 

- 최대공약수 계산 : math.gcd(n, m)

- 최소공배수 계산 : n * m  //  a

    - 두 수의 곱을 그 두 수의 최대공약수로 나눈 값으로 계산할 수 있다.

 

 

 

다른 사람이 제출한 코드 1

def gcdlcm(a, b):
    c,d = max(a, b), min(a, b)
    t = 1
    while t>0:
        t = c%d
        c, d = d, t
    answer = [ c, int (a*b/c)]
    return answer

 

- 변수 초기화

    - a,b중 최댓값은 c, 최솟값은 d로 초기화된다.

    - 이는 유클리드 알고리즘에서 큰 수를 작은 수로 나누기 위한 준비과정이다. 

- 유클리드 알고리즘 실행

    - while 루프 내부에서 t에는 c를 d로 나눈 나머지가 저장된다

    - c에는 d의 값을, d에는 t의 값을 할당한다. 

        - 이 과정은 c와 d의 최대공약수를 찾을 때까지 계속된다. 

- 최소공배수 계산

    - a와 b의 곱을 최대공약수인 c로 나눈 값으로 계산된다. 

 

다른 사람이 제출한 코드 2

def solution(n, m):
    gcd = lambda a,b : b if not a%b else gcd(b, a%b)
    lcm = lambda a,b : a*b//gcd(a,b)
    return [gcd(n, m), lcm(n, m)]

 

- gcd

    - a를 b로 나눈 나머지가 0이라면 b를 반환

        - b는 a와 b의 최대공약수이다.

    - 만약 a를 b로 나눈 나머지가 0이 아니라면(else부분)

        - a가 b로 나누어 떨어지지 않는다면 함수는 자신을 다시 호출한다. 

- lcm 

    - a와 b의 곱을 최대공약수인 gcd(a,b)로 나눈 값으로 계산된다.