NIRVANA

[level 1] 최대공약수와 최소공배수 본문

Coding test(Python3)/Programmers

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

녜잉 2023. 7. 17. 16:44

문제

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

 

문제 풀이 접근법1

처음에는 유클리드 알고리즘을 사용해서 문제를 푸는 방법을 생각했다.

 

1) n % m == r(단, n > m)일때, n과 m의 최대 공약수는 m과 r의 최대 공약수와 같고 만약 m == 0이면 m이 n과 m의 최대 공약수가 된다. 

2) 두 수의 곱은 최대 공약수와 최대 공배수의 곱이므로 두수의 곱을 최대 공약수로 나누면 최대 공배수를 구할 수 있다. 

def solution(n, m):
    answer = []
    if n < m:
        tmp = n
        n = m
        m = tmp

    r = n % m

    while(True):
        if r == 0:
            gcd = m
            answer.append(gcd)
            break
        n = m
        m = r
    
    answer.append(int((n*m)/gcd))

    return answer

두번 째 테스트 케이스에서 실행 초과가 걸렸다...ㅎ

아마 while이 무한 루프여서 그랬던 것 같다. 

 

 

문제 풀이 접근법2

위와 같이 유클리드 호제법을 사용하였으나 위에서도 결국 r==0이 되면 break로 탈출하게 하였으므로 이번에는 while문 자체에 조건을 걸었다.

def solution(n, m):
    
    answer = []
    
    def gcd(a, b):
        while b > 0:
            a, b = b, a % b
        return a
    
    answer.append(gcd(n, m))
    answer.append(n*m / answer[0])

    return answer

 

 


다른 분들 풀이

# 문제가 개편되었습니다. 이로 인해 함수 구성이나 테스트케이스가 변경되어, 과거의 코드는 동작하지 않을 수 있습니다.
# 새로운 함수 구성을 적용하려면 [코드 초기화] 버튼을 누르세요. 단, [코드 초기화] 버튼을 누르면 작성 중인 코드는 사라집니다.
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))

유클리드 알고리즘에서 a>b라는 전제 조건이 있어서 사실 위의 내 코드를 작성하면서 

내심 걱정했는데

max, min값으로 값을 결정해준게 인상 깊었다.

 

'Coding test(Python3) > Programmers' 카테고리의 다른 글

[level 1] 3진법 뒤집기  (0) 2023.07.18
[level 1] 같은 숫자는 싫어(다시??)  (0) 2023.07.17
[level 1] 직사각형 별찍기  (0) 2023.07.17
[level 1] 행렬의 덧셈  (0) 2023.07.15
[level 1] 문자열 다루기  (0) 2023.07.15