[Lv.2]N개의 최소공배수

Jihyun-Jeon·2022년 5월 20일
0

문제: https://programmers.co.kr/learn/courses/30/lessons/12953?language=javascript

※ 최대공배수 구하는 방법 (출처 : https://mathbang.net/204)
: 2 x 2 x 2 x 3 x 5 x 1 x 2 x 1 = 240

🔶 내가 한 방법

  • 경고뜸 - Assignment to function parameter 'arr'.
    : 함수의 매개변수에 재할당하는 코드는 안좋은 코드인 것 같은데, 다른 방안을 모르겠음.
    : 왜 안좋은 코드인가? → 피드백에 내용 설명
function solution(arr) {
  let result = 1;
  const max = arr.sort((a, b) => b - a)[0]; // 1. arr중 제일 큰 숫자를 찾음

 // 2. 2부터 ~ max까지 for문을 돌면서 arr요소를 나눠봄.
  for (let i = 2; i <= max; i += 1) {
 // 3. arr의 요소 중 하나라도 2로 나눠지는게 있으면 true, while문 실행됨.
    let trueFalse = arr.some((el) => el % i === 0); 

// 4. arr에서 2로 나눌 수 있는 요소가 없을 때 까지 계속 나눠주면서, result에 2를 곱함.
// 5. 2로 나눌 수 있는 요소가 없으지면 i +1씩 증가시키면서, 다시 반복
    while (trueFalse) {
      arr = arr.map((el) => (el % i === 0 ? el / i : el));
      result *= i;
      if (arr.some((el) => el % i === 0)) {
        trueFalse = true;
      } else {
        trueFalse = false;
      }
    }
  }
// 6. arr를 더이상 나눌 수 없게되면, result와 arr에 남은 모든 요소를 곱하여 반환함.
  return arr.reduce((acc, cur) => acc * cur, result);
}

// 실행코드
console.log(solution([60, 48, 40])); // 240
console.log(solution([2, 6, 8, 14])); // 168
console.log(solution([1, 2, 3])); // 6
console.log(solution([39, 26, 13, 11, 7, 5, 3, 2, 1])); // 30030

🔶 다른 사람 방법

(다른 사람 방법 잘 모르겠음. 나중에 봐보기)

  • 방법1
function gcd(a, b) {
  return a % b ? gcd(b, a % b) : b;
}

function solution(num) {
  return num.reduce((a, b) => (a * b) / gcd(a, b));
}
  • 방법2 - while문 대신 reduce로 도는 방법
function solution(arr) {
  return arr.reduce((acc, cur) => {
    const recursive = (min, max) => {
      return min % max === 0 ? max : recursive(max, min % max);
    };

    let max = 0;
    return (acc * cur) / recursive(acc, cur);
  });
}
  • 방법3 - 내 방법과 비슷
function solution(arr) {
  let answer = 0;
  let isFind = false;
  let i = 1;
  arr.sort((a, b) => a - b);
  const max = arr.splice(arr.length - 1, 1);

  while (!isFind) {
    isFind = arr.every((e) => (max * i) % e === 0);
    i += 1;
  }

  answer = max * (i - 1);
  return answer;
}

🔶 피드백

왜 함수의 매개변수에 재할당 하면 안되는지!?

0개의 댓글