알고리즘(백준, 프로그래머스)/[프로그래머스] Lv1

[프로그래머스] Lv1. 최대공약수와 최소공배수 - 파이썬(Python)

마법사 코딩공주 2023. 5. 10. 10:14
728x90
반응형

최대 공약수 (GCD, Greatest Common Divisor)

  • 두 수 혹은 그 이상의 여러 수의 공통인 약수 중 최대인 것 -> 즉, 수들의 각각의 약수 중 공통이며 가장 큰 수를 최대 공약수라고 함
3의 약수  - 1, 3
12의 약수 - 1, 2, 3, 4, 6, 12

3과 12의 공통 약수 : 1, 3
3과 12의 최대공약수 : 3

 

최소 공배수(LCM, Least Common Multiple)

  • 두 수 혹은 그 이상의 수들의 공통인 배수 중 최소 -> 즉, 각각의 배수 중 공통이며 가장 작은 수를 최소 공배수라고 함
3의 배수  - 3, 6, 9, 12, 15, 18, 21, 24...
12의 배수 - 12, 24, 36, 48, 60...

3과 12의 공통 배수 : 12, 24, ...
3과 12의 최소공배수 : 12

 

문제링크 : https://school.programmers.co.kr/learn/courses/30/lessons/12940

 

프로그래머스

코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요.

programmers.co.kr

📝 문제설명

두 수를 입력받아 두 수의 최대공약수와 최소공배수를 반환하는 함수, solution을 완성해 보세요.
배열의 맨 앞에 최대공약수, 그다음 최소공배수를 넣어 반환하면 됩니다.
예를 들어 두 수 3, 12의 최대공약수는 3, 최소공배수는 12이므로 solution(3, 12)는 [3, 12]를 반환해야 합니다.

🔗 제한 사항

- 두 수는 1이상 1000000이하의 자연수입니다.

🔗입출력예

입출력 예 #1
위의 설명과 같습니다.

입출력 예 #2
자연수 2와 5의 최대공약수는 1, 최소공배수는 10이므로 [1, 10]을 리턴해야 합니다.


👉 문제풀이

최대 공약수

  • n, m의 공통인 약수를 구하기 위해 최소값을 선택
  • if문으로 공통 약수를 구한 후 GCD 변수에 저장 -> 반복문에서 처음으로 조건문에 해당하는 값이 저장됨
  • 해당 값을 result 리스트로 저장

최소 공배수

  • 위의 내용 처럼 3과 12의 최소공배수를 구할 때 공통 배수가 12부터 시작하는 것을 알 수 있음
  • 따라서, n,m값중 큰 값부터 시작하여 두 개를 곱한 값으로 범위를 지정
  • 해당 조건문을 만족하는 i값이 나오면 LCM 변수에 저장하여 result 리스트에 추가함
  • 불필요한 반복을 실행시키지 않도록 조건이 만족하면 break를 써서 반복문을 탈
def solution(n, m):
    answer = 0
    result = []
    
    # 최대공약수
    for i in range(min(n,m), 0, -1):
        if (n % i) == 0 and (m % i == 0):
            GCD = i
            result.append(GCD)
            break
    
    # 최소공배수
    for i in range(max(n,m), (n*m)+1):
        if (i % n == 0) and (i % m == 0):
            LCM = i
            result.append(LCM)
            break
    return result

👉 다른사람 풀이(유클리드호제)

  • 유클리드 호제법은 큰 수를 작은 수로 나누어 나머지를 구하고, 작은 수를 나머지로 나누어 나머지가 0이 될 때까지 반복하여 최대공약수를 구하는 알고리즘
  • 최대공약수를 구한 뒤, 이를 이용하여 최소공배수를 계산할 수 있음
  • 최소공배수는 주어진 두 수의 곱을 최대공약수로 나눈 값

https://codingpractices.tistory.com/34 참고

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

# 아래는 테스트로 출력해 보기 위한 코드입니다.
print(gcdlcm(3,12))

👉 다른사람 풀이(lambda 함수 사용)

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)]

 

728x90
반응형