🗃️javascript/프로그래머스

소인수분해(Lv.0)[]

하얀성 2023. 3. 10. 20:41
  •  
문제 설명

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


제한사항
  • 2 ≤ n ≤ 10,000

입출력 예nresult
12 [2, 3]
17 [17]
420 [2, 3, 5, 7]

 


입출력 예 설명

입출력 예 #1

  • 12를 소인수분해하면 2 * 2 * 3 입니다. 따라서 [2, 3]을 return합니다.

입출력 예 #2

  • 17은 소수입니다. 따라서 [17]을 return 해야 합니다.

입출력 예 #3

  • 420을 소인수분해하면 2 * 2 * 3 * 5 * 7 입니다. 따라서 [2, 3, 5, 7]을 return합니다.

<설계>

2~(n-1)까지 반복해서 나눠주기

약수 발견
1,2,3,4,6,12 6개

4 * 3 => 2+1 * 1+1 = 6 

짝수개라면 

홀수개라면 그 값

약수들 또 따로 반복해서 나눠주기

10,000

200 50 5^4 * 2^4

10,000보다 작은 단위
10     11  12   13
1024 2048 4096 8192

최대해봤자 소인부분해는 1개의 요소당 13제곱이 최대임

1.약수의 갯수를 구한다.
2.갯수의 다양한 곱셈의 묶음을 상정한다. 최소 (1+1)부터 (13+1)까지의 조합이 최대임
3. math.pow(x, 소인수분해 값-1) 로 맞는 x값을 찾아낸다. 

 

 

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
function solution(n) {
    let count = [];
    let exp = []; // exponent가 지수라는 의미
    for(let i = 1; i<=n; i++){ // 각 한 숫자당 약수갯수 구하기 
            if(Number.isInteger(n / i)){
                count.push(i)
            }
        }
    for(let j = 2; j<=14; j++){ 
        // 2의 13승의 13이라는 지수가 10,000 이내에서 가장 큰 지수. 
        //(지수+1)*(지수+1)= 약수의 갯수
        if(Number.isInteger(count.length / j)){
            exp.push(j) // (지수+1)이 될 수 있는 값들의 모임
        }
    }
    
    for(let k = 0; k < exp.length; k++){ // exp 배열의 요소들 대입하면서 맞는 값 찾기
        for(let k2 = 0;)
        Math.pow(,k)
    }
}
cs

설계대로 가고 있었는데... n값이 420처럼 지수의 밑값이 4개,5개, 6개.. 이렇게 많아져 버리면,

마지막 반복문에서 해를 구하는게 힘들어진다.

다른 방식으로 접근해야 된다.

내일 해야겠다. ㅎㅎ


<정답>

function solution(n) {
  let result = [];
  let divisor = 2;
  
  while (n >= 2) {
    if (n % divisor === 0) {
      result.push(divisor)
      n = n / divisor;
    }
    
     else divisor ++;
    
  }
  
  return [...new Set(result)];
}

그렇구나... Set()을 통해 반복되는거 제거하면 되는 거였구나..