[파이썬 코드카타]
최대공약수와 최소공배수
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 값은 어떠한 경우든 공배수에 해당하기 때문에, 이를 최대 공약수로 나누면 최소 공배수가 나오게 됨
'TIL' 카테고리의 다른 글
[240305] 실전 프로젝트: 태블로 시간대 영역 그래프 및 월별 주번호(week) 생성하여 캘린더 차트 만들기 (0) | 2024.03.05 |
---|---|
[240304] 실전 프로젝트: 파이썬과 태블로를 활용한 데이터 전처리 (0) | 2024.03.04 |
[240228] SQL: 코드카타 143~144 & 파이썬: 코드카타 38(map, index, strip) (4) | 2024.02.28 |
[240227] SQL: 코드카타 141~142 & 파이썬: 코드카타 37 (1) | 2024.02.27 |
[240226] SQL: 코드카타 132~140(right/left) & 파이썬: 코드카타 36(isdecimal/isdigit/isnumeric) (0) | 2024.02.26 |