[js] 소인수분해 (lv.0, 정답률 83%)

sookyoung.k·2024년 5월 9일
0
post-thumbnail

소인수분해란 어떤 수를 소수들의 곱으로 표현하는 것입니다. 예를 들어 12를 소인수 분해하면 2 2 3 으로 나타낼 수 있습니다. 따라서 12의 소인수는 2와 3입니다. 자연수 n이 매개변수로 주어질 때 n의 소인수를 오름차순으로 담은 배열을 return하도록 solution 함수를 완성해주세요.

제한사항

  • 2 ≤ n ≤ 10,000

나의 풀이

function solution(n) {
    let answer = [];
    let modifiedN = n;
    for (let i=2; modifiedN > 1; i++) {
        while (modifiedN % i == 0) {
            answer.push(i);
            modifiedN /= i;
        }
    }
    
    return [...new Set(answer)]
}
  • 정답을 담을 배열 answer과 n을 i로 나누며 계속 변경하는 값을 저장할 modifiedN을 n으로 초기화하며 선언한다.

  • for문을 돌며 modifiedN이 1이 될 때까지 계속해서 코드를 실행한다.

  • 내부의 while 루프에서 modifiedN을 i로 나눈 나머지가 0일 경우 answer 배열에 i를 추가한 후 나눈 값을 modifiedN에 재할당한다. 이후로는 i를 증가시켜서 for문의 조건문에 걸릴 때까지 돈다.

  • 그리고 중복되는 인수를 제거하기 위해 Set을 사용하고 다시 배열에 담아 반환한다.

다른 풀이 1

function solution(n) {
    let answer = []

    let i = 2;
    while (i <= n) {
      if (n % i === 0) {
        answer.push(i)     
        n = n / i
      } else {
      i++        
      }
    }

    return [...new Set(answer.sort((a, b) => a > b ? 1 : -1))]
}

굳이 for를 사용하지 않고 가능! modifiedN같이 새로 변수를 선언할 필요도 없음!
i를 2로 선언한 후 시작한다.

  • while 루프를 사용하여 i가 n 이하일 때까지 반복한다.
  • if 조건을 사용하여 n이 현재 소인수 후보인 i로 나누어 떨어지는지 확인한다. 만약 나누어 떨어진다면 answer에 i를 추가하고 n을 i로 나눈 몫을 n에 재할당한다.
  • 나누어 떨어지지 않는다면 i를 1 증가시킨다.
  • while 루프가 종료되면 answer를 Set 객체로 변환하여 중복을 제거한 후
  • sort 메서드를 사용하여 오름차순으로 정렬한다. a, b가 주어졌을 때 a가 b보다 크면 1을 그렇지 않으면 -1을 반환하여 정렬 순서를 결정한다.

다른 풀이 2

function solution(n) {
    var answer = [];

    for(let i = 2; i <= n; i++) {

        while (n % i === 0) {

            n = n / i;
            answer.push(i);

        }
    }

    return [...new Set(answer)];
}
profile
영차영차 😎

0개의 댓글