본문 바로가기

TIL

[240229] SQL: 코드카타 145 & 파이썬: 코드카타 39

[파이썬 코드카타]

최대공약수와 최소공배수

https://school.programmers.co.kr/learn/courses/30/lessons/12940

 

1) 어떤 문제가 있었나
두 개의 수를 입력 받아, 두 수의 최대 공약수와 최소공배수를 반환하는 문제

 

n = 3, m = 12, return = [3, 12] 

 

2) 내가 시도해본 건 무엇인가

- n의 약수를 빈 리스트에 넣은 뒤, n의 약수가 m으로도 나눠지는지 확인 후 공통 약수의 최대값을 result 에 넣음

- 배수는 n, m 크기에 따라 공통 배수 값이 result 에 들어가도록 작성

- 정확성 18.8점으로 실패 

# n = 3, m = 12 
# 최대 공약수는 3
# n의 약수 1, 3
# m의 약수 1, 2, 3, 4, 6, 12

# 최소 공배수는 12
# n의 배수 3, 6, 9, 12, 15...
# m의 배수 12, 24.... 

def solution(n, m):
    divisor_list_1 = [] 
    divisor_list_2 = []
    result = []
    
    # 공약수 구하기
    for i in range(1, n+1):  
        if n % i == 0:
            divisor_list_1.append(i) 

    for j in divisor_list_1:
        if m % j == 0: 
            divisor_list_2.append(j)
    # 최대 공약수만 리스트에 넣기 
    result.append(max(divisor_list_2))
    
    # 공배수 구하기 
    if n < m and m % n == 0: 
        result.append(m//n*n)
    elif m < n and n % m == 0: 
        result.append(n//m*m)
    elif m < n and n % m != 0: 
        result.append(n%m*n)
    elif n < m and m % n != 0: 
        result.append(n*m)
    return result

 

3) 어떻게 해결했나

- 도저히 답이 나오지 않아 다른 사람 풀이를 참고 

def solution(n, m):
    num1 = 0 
    # '공통' 약수이므로 n과 m을 나눴을 때 나머지가 0인 값을 and 조건으로 지정
    for i in range(1, n+1):
        if n % i == 0 and m % i == 0:
        	# for 문이 돌 때마다 num1 변수값이 새로 지정되므로, 최대값만 남게 됨
            num1 = i
    
    # 최소 공배수 = 각 수를 곱한 다음, 최대 공약수를 나누면 나옴 
    num2 = int((n*m) / num1) 
    answer = [num1, num2]
    return answer


4) 무엇을 새롭게 알았나
- 최대 공약수와 최소 공배수 모두 '공통'의 숫자와 연관성을 가진 부분에 대한 고민이 필요했음 

- n * m 값은 어떠한 경우든 공배수에 해당하기 때문에, 이를 최대 공약수로 나누면 최소 공배수가 나오게 됨