알고리즘, 자료구조/프로그래머스
[Javascript/Python] 프로그래머스 - N개의 최소공배수
jaee
2023. 5. 5. 14:19
문제: https://school.programmers.co.kr/learn/courses/30/lessons/12953
프로그래머스
코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요.
programmers.co.kr
문제요약
- n개의 숫자를 담은 배열이 주어졌을 때, 원소들의 최소 공배수를 반환하여라
- 배열의 길이는 1 이상, 15 이하이다.
- 배열의 원소는 100 이하의 자연수이다.
첫 번째로 접근한 방식은, 배열에 속한 숫자들 중 제일 큰 수의 배수를 구하고 해당 값이 나머지 숫자들로 나누어 떨어지는지 확인했다. 아래는 이 방식을 자바스크립트로 작성한 코드이다.
풀이과정
function solution(arr) {
let answer = 0;
// maxN: 배열의 원소중 제일 큰 수 / x: maxNum에 곱할 값
let maxN = Math.max(...arr), x = 1;
while(answer === 0) {
for (let i=0; i < arr.length; i++) {
// maxN의 배수가 나누어떨어지지 않을 경우 x+1.
if(maxN * x % arr[i] !== 0) {
x++;
break;
// maxN의 배수가 모든 원소로 나누어떨어진경우, answer에 maxN의 배수를 할당.
} else if(i === arr.length - 1) {
answer = maxN * x;
}
};
};
return answer;
}
다른 사람들은 어떻게 풀었나 살펴보니 다수가 유클리드 알고리즘을 사용해서 최대 공약수를 구하고 이를 활용해 최소공배수를 구하는 방식으로 해결했다. (A와 B의 최대공약수를 C라고 했을 때, A와 B의 최소공배수는 A*B/C이다)
유클리드 알고리즘: 최대 공약수를 구할 때 사용하는 알고리즘
1. 두 자연수 A, B가 있다고 가정했을 때
2. A%B = C
3. C가 0이면 B는 A의 최대 공약수이다.
4. C가 0이 아니면 A자리에 B, B자리에 C를 대입(B%C)해 나머지가 0이 될 때까지 반복한다.
이 공식을 파이썬으로 풀어낸 코드는 아래와 같다.
풀이과정
from functools import reduce
def solution(arr):
lcm =reduce(get_lcm, arr)
return int(lcm)
# 최대공약수 구하는 함수
def get_gcd(a,b):
x, y = max([a,b]), min([a,b])
while y != 0:
x,y = y, x % y
return x
# 최소공배수 구하는 함수
def get_lcm(a,b):
return a*b / get_gcd(a,b)
참고 자료