Lv.0 - 소인수분해_01.03

송철진·2023년 1월 3일
0

문제 설명

소인수분해란 어떤 수를 소수들의 곱으로 표현하는 것입니다. 예를 들어 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]

나의 코드

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    
}

풀이

  1. 빈 객체 so를 선언하고 2이상 n이하의 자연수 i로 넣을 것이다
let so = {}
for(let i=2; i<=n; i++){
    so[i] = 0
  	// 이하 2.
}
// 이하 3~5.
  1. n을 i로 나눈 나머지가 0이면 인수이므로 so[i]를 카운팅한다. 이는 iso[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 순회 종료
  1. 객체 so의 키로 이루어진 배열을 k, 값으로 이루어진 배열을 v라고 할 때
const k = Object.keys(so)
const v = Object.values(so)

// k = ["2", "3"]
// v = [2, 1]
  1. v[i]가 0보다 크면 k[i]를 빈 배열 answer에 숫자형으로 추가한다
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]
  1. answer를 반환한다
return answer    

// answer = [2,3]
profile
검색하고 기록하며 학습하는 백엔드 개발자

0개의 댓글