문제
https://school.programmers.co.kr/learn/courses/30/lessons/12953
프로그래머스
코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요.
programmers.co.kr
문제 설명
두 수의 최소공배수(Least Common Multiple)란 입력된 두 수의 배수 중 공통이 되는 가장 작은 숫자를 의미합니다. 예를 들어 2와 7의 최소공배수는 14가 됩니다. 정의를 확장해서, n개의 수의 최소공배수는 n 개의 수들의 배수 중 공통이 되는 가장 작은 숫자가 됩니다. n개의 숫자를 담은 배열 arr이 입력되었을 때 이 수들의 최소공배수를 반환하는 함수, solution을 완성해 주세요.
제한 사항
- arr은 길이 1 이상, 15 이하인 배열입니다.
- arr의 원소는 100 이하인 자연수입니다.
입출력 예
arr | result |
[2,6,8,14] | 168 |
[1,2,3] | 6 |
문제 풀이
개념
먼저 문제를 풀기전에 최대공약수와 최소공배수의 개념에 대해서 배워봅시다!
최대공약수 GCD(Greatest Common Division): 두 숫자 사이에 존재하는 공통인 약수 중 가장 큰 수
두 숫자의 공통인수로 인수의 교집합이라고 생각하면 됩니다.
최소공배수 LCM(Largest Common Multiple): 두 숫자 사이에 존재하는 공통인 배수 중 가장 작은 수
두 숫자의 인수를 모두 포함하고 있고, 인수의 합집합이라고 생각하면 됩니다.
GCD와 LDM의 관계
두 수의 곱은 최대공약수와 최소공배수의 곱으로 나타낼 수 있습니다.
위에서 다룬 6, 9로 예를 들면, GCD는 3, LCM은 18로 두 수의 곱과 같습니다. 그 이유는 최대공약수는 두 수의 공통 인수를 포함하고 있고, 최소공배수는 두 수의 인수 모두를 포함하고 있기 때문입니다.
이렇게 말이죠.
따라서
위와 같은 식으로 최소공배수를 쉽게 구할 수 있습니다.
유클리드 호제법
유클리드 호제법은 두 수의 최대공약수를 구하는 알고리즘입니다. 호제법이란 두 수가 서로 상대방의 수를 나누어 결국 원하는 수를 얻는 방법을 말합니다. 서로의 나머지 수로 나머지를 구할 때 나머지가 0이 될 때 최대공약수가 구해집니다. 36, 20으로 예를 들면
36을 20으로 나눈 나머지 = 16
20을 16으로 나눈 나머지 = 4
36을 4로 나눈 나머지 = 0
따라서 36과 20의 최대공약수는 4입니다!
구현
코드
# 최대공약수 GCD 구하기
def gcd(n1, n2):
p = n1 % n2
if p == 0:
return n2
else:
return gcd(n2, p)
def solution(arr):
answer = 1
# 리스트에 담긴 숫자와의 최소공배수를 구해나간다.
for n in arr:
answer = answer * n // gcd(answer, n)
return answer
결과
'PS > 프로그래머스' 카테고리의 다른 글
[프로그래머스(Programmers)/ Level3] N으로 표현 (파이썬, Python3) (0) | 2022.07.06 |
---|---|
[프로그래머스(Programmers)/ Level3] 블록 이동하기 (파이썬, Python3) (0) | 2022.06.30 |
[프로그래머스(Programmers)/ Level2] 기능개발 (파이썬, Python3) (0) | 2022.06.30 |
[프로그래머스(Programmers)/ Level2] 구명보트 (파이썬, Python3) (0) | 2022.06.29 |