소인수분해란 어떤 수를 소수들의 곱으로 표현하는 것입니다. 예를 들어 12를 소인수 분해하면 2 2 3 으로 나타낼 수 있습니다. 따라서 12의 소인수는 2와 3입니다. 자연수 n이 매개변수로 주어질 때 n의 소인수를 오름차순으로 담은 배열을 return하도록 solution 함수를 완성해주세요.
제한사항
2 ≤ n ≤ 10,000
입출력 예
n | result |
---|---|
12 | [2, 3] |
17 | [17] |
420 | [2, 3, 5, 7] |
function solution(n) {
let answer = []
let so = {}
for(let i=2; i<=n; i++){
so[i] = 0
while(n%i === 0){
so[i] += 1
n = n/i
}
}
const k = Object.keys(so)
const v = Object.values(so)
for(let i=0 ; i<v.length; i++){
if(v[i] > 0) answer.push(Number(k[i]))
}
return answer
}
i
를 키
로 넣을 것이다let so = {}
for(let i=2; i<=n; i++){
so[i] = 0
// 이하 2.
}
// 이하 3~5.
i
로 나눈 나머지가 0이면 인수이므로 so[i]를 카운팅한다. 이는 i
의 so[i]
제곱의 관계를 이룬다. 그리고 n에 i
로 나눈 몫을 할당한다. 나머지가 0이 아닐 때까지 순회한다while(n%i === 0){
so[i] += 1
n = n/i
}
// n = 12
// i = 2일 때
// 12 % 2 = 0 이므로 so = { "2" : 1 }, n = 12/2 = 6
// > 6 % 2 = 0 이므로 so = { "2" : 2 }, n = 6/2 = 3
// >> 3 % 2 != 0 이므로 while 순회 종료
// n = 3
// i = 3일 때
// 3 % 3 = 0 이므로 so = { "2" : 2, "3" : 1 }, n = 3/3 = 1
// > 1 % 3 != 0 이므로 while 순회 종료.
// n = 1,
// i = 4 일 때 i<=n 조건을 만족하지 못하므로 for 순회 종료
k
, 값으로 이루어진 배열을 v
라고 할 때const k = Object.keys(so)
const v = Object.values(so)
// k = ["2", "3"]
// v = [2, 1]
let answer = []
for(let i=0 ; i<v.length; i++){
if(v[i] > 0) answer.push(Number(k[i]))
}
// i=0일 때, answer = [2]
// i=1일 때, answer = [2,3]
return answer
// answer = [2,3]