프로그래머스, N개의 최소공배수
TL;DR
- 주어진 문제 조건에 따라 구현(implementation)할 수 있는지
- 유클리드 호제법
문제 분석
1. n개의 숫자를 담은 배열 arr에 대해 이 수들의 최소 공배수를 반환하는 함수를 작성하라.
- 해결해야 하는 문제 조건에 대해서 말하고 있다.
- 최소공배수이기 때문에, 배열을 순회하며 최소공배수를 배열 내의 숫자 간의 최소공배수로 갱신하면 풀 수 있다.
입출력 형태
- 숫자들이 저장된 arr이 입력으로 주어진다.
- 예시 1번을 확인해보면
- 2와 6의 최소공배수는 6이다.
- 6과 8의 최소공배수는 24이다.
- 24와 14의 최소공배수는 168이다.
- 이와 같이 배열에서 두 수 간의 최소공배수를 구한 뒤 다음 원소들과 최소공배수로 갱신해나가면 문제를 해결할 수 있다.
풀이
def solution(arr):
def euclid(big, small): # 1
return small if big % small == 0 else euclid(small, big % small)
if len(arr) == 1: # 2
return arr[0]
sorted_arr = sorted(arr) # 3
answer, gcd = sorted_arr[0], 0
for i in range(1, len(sorted_arr)): # 4
gcd = euclid(answer, sorted_arr[i])
answer = int(answer * sorted_arr[i] / gcd) # 5
return answer
- 1 : 최대공약수와 최소공배수를 구하는 방법은 유클리드 호제법을 사용하는 것이다.
- 큰 수를 작은 수로 나눈다. 이 때 나누어 떨어지지 않는다면 큰 수를 큰 수와 작은 수로 나눈 나머지로 변경하고, 작은 수와 연산을 진행한다.
- 나머지가 없을 때까지 위의 과정을 반복한다. 그렇게 하면 최대공약수를 얻을 수 있다.
- 최소공배수는 두 수를 곱한 수를 최대공약수로 나눈 수이다.
- 최대공약수를 구하는 함수를 작성하였다. 두 수가 나누어떨어질 때까지 재귀적으로 반복된다.
- 2 : 예외처리를 한다. 배열의 길이가 1일 때는 바로 원소를 반환하면 된다.
- 3 : 주어진 배열을 정렬한다. 작은 수부터 순차적으로 최소공배수를 구하는데 사용한다.
- 4 : 배열의 처음 원소를 제외한 다음 원소부터 배열을 순회하며 최소공배수를 갱신한다.
- 5 : 작성한 유클리드 호제법 함수를 사용해 최대공약수를 구하고, 최소공배수를 구해서 answer에 갱신시킨다.
- 최종적으로 모든 수에 대한 최소공배수를 구할 수 있고, 이를 반환한다.
'개발 > Algorithm' 카테고리의 다른 글
[리트코드] Swap Nodes in Pairs(python) (0) | 2021.06.15 |
---|---|
[프로그래머스] 최솟값 만들기(python) (0) | 2021.06.14 |
[프로그래머스] 최대값과 최소값(python) (0) | 2021.06.12 |
[리트코드] Add Two Numbers(python) (0) | 2021.06.11 |
[리트코드] Happy Number(python) (0) | 2021.06.11 |