본문 바로가기

알고리즘

프로그래머스: 최대공약수와 최소공배수

[level 1] 최대공약수와 최소공배수 - 12940

문제 링크

성능 요약

메모리: 10.2 MB, 시간: 0.00 ms

구분

코딩테스트 연습 > 연습문제

채점결과

정확성: 100.0
합계: 100.0 / 100.0

제출 일자

2023년 12월 1일 15:8:2

문제 설명

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

제한 사항
  • 두 수는 1이상 1000000이하의 자연수입니다.
입출력 예
n m return
3 12 [3, 12]
2 5 [1, 10]
입출력 예 설명

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

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

풀이

def solution(n, m):
    big = max(n, m)
    small = min(n, m)
    return [gcd(big, small), lcm(big, small)]

def gcd(big, small):
    r = 1
    while r:
        r = big % small
        big = small
        small = r

    return big

def lcm(big, small):
    div = gcd(big, small)
    return (big * small) // div

느낀점

처음에는 divmod()를 사용하여 문제를 풀려고 시도했다. 내가 if문을 잘못 사용했거나, 문제가 있었는지 문제에 대한 답을 제대로 구하지 못했다. 그래서 최소공배수를 구하는 알고리즘을 찾아본 결과 (두 수의 곱 / 최대공약수)인 것을 다시 한번 생각할 수 있었다.

사실 문제가 간단하니 하나의 함수에서 더 짧고 간결하게 풀 수 있었지만, 각각의 기능을 하는 함수마다 구현을 해보고 싶었고 연습도 해보고 싶어서 위의 풀이처럼 구현을 하게 됐다.

이것도 사실 엄청 마음에 들지는 않지만, 앞으로 더 발전해가면서 코드를 더 잘 구현할 수 있을 거라 생각한다.