문제 설명
제한사항
입출력 예nresult
입출력 예 설명
소인수분해란 어떤 수를 소수들의 곱으로 표현하는 것입니다. 예를 들어 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()을 통해 반복되는거 제거하면 되는 거였구나..
'🗃️javascript > 프로그래머스' 카테고리의 다른 글
7의 개수(Lv.0)[filter((x) => 조건) 조건에 맞는 요소의 배열을 출력] (0) | 2023.03.11 |
---|---|
공 던지기(Lv.0)[좀 더 답에만 집중한 순서도를 설계하자] (0) | 2023.03.11 |
이진수 더하기(Lv.0)[parseInt()로 진수 변환하기 ,Math.pow()로 제곱] (0) | 2023.03.09 |
숨어있는 숫자의 덧셈 (2)(Lv.0)[isNaN()과 변수 초기화] (0) | 2023.03.09 |
한 번만 등장한 문자(Lv.0)[indexOf 와 lastIndexOf로 중복 문자 거르기 ] (0) | 2023.03.09 |