https://school.programmers.co.kr/learn/courses/30/lessons/12953
프로그래머스
SW개발자를 위한 평가, 교육의 Total Solution을 제공하는 개발자 성장을 위한 베이스캠프
programmers.co.kr
✓ 문제
숫자 배열(n)을 받아서 숫자들의 최소공배수 계산
✓ 풀이과정
처음 풀이했던 과정은 아래와 같습니다
1. 숫자 배열(n)을 오름차순으로 정렬해서 가장 큰 값(max)을 구하고 이를 제외한 새로운 배열(newArr) 생성
2. max 값의 배수(num)를 돌면서 남은 숫자들이 나누어 떨어지는지 확인
3. 모든 값이 나누어 떨어졌을 때만 모든 수의 최소공배수라고 판단하여 해당 값을 반환
function solution(arr) {
let newArr = arr.sort((a, b) => a - b);
let max = newArr.pop();
let num;
for (let i = 1; ; i++) {
num = max * i;
let find = true;
for (let j = 0; j < newArr.length; j++) {
if (num % newArr[j] !== 0) {
find = false;
break;
}
}
if (find) break;
}
return num;
}
풀 때는 가장 큰 수를 기준으로 횟수를 줄여서 효율적인 방법이라고 생각했지만
LCM = (a * b) / GCD 라는 점과 GCD를 유클리드 호제법을 이용해서 계산한다면 더 효율적인 방법으로 해결할 수 있었습니다
최대공약수/최소공배수와 유클리드 호제법 ↓
[코딩테스트/Javascript] 최대공약수(GCD)/최소공배수(LCM)와 유클리드 호제법
코테 빈출 개념인 최대공약수와 최소공배수를 계산하는 방법을 정리해 보겠습니다 최대공약수 = Greatest Common Divisor = GCD최소공배수 = Least Common Multiple = LCM 수학 공식소인수분해를 통해 계산최대
woooing.tistory.com
1. 배열의 앞에서부터 두 수의 최대공약수를 이용해서 최소공배수를 구한다
2. 구한 최소공배수와 다음 수를 다시 연산하여 하나의 값이 남을 때까지 반복하며 최종 값을 반환
두 수의 연산 결과를 다음 연산의 입력으로 사용하는 누적 계산을 reduce로 구현했습니다
✓ 최종코드
function solution(arr) {
const gcd = (a, b) => (b === 0 ? a : gcd(b, a % b));
const lcm = (a, b) => (a * b) / gcd(a, b);
return arr.reduce((acc, cur) => lcm(acc, cur));
}
'프로그래머스 > Lv2' 카테고리의 다른 글
| [프로그래머스/Javascript] Lv.2 기능개발 (0) | 2026.02.09 |
|---|---|
| [프로그래머스/Javascript] Lv.2 H-Index (0) | 2026.02.06 |
| [프로그래머스/Javascript] Lv.2 구명보트 (0) | 2026.02.04 |
| [프로그래머스/Javascript] Lv.2 카펫 (0) | 2026.02.03 |