JavaScript/알고리즘

프로그래머스 약수구하기 JS

hihiha2 2023. 7. 21. 01:54

문제 설명

정수 n이 매개변수로 주어질 때, n의 약수를 오름차순으로 담은 배열을 return하도록 solution 함수를 완성해주세요.

 

 

🙋‍♀️ 내 생각

n이라는 숫자를 매개변수로 받아서 약수를 구하고 그 약수들로 채워진 배열을 구하는 문제이다.

이 문제를 풀면서 자바스크립트에서 약수를 어떻게 구할것인가를 중점적으로 생각해보았다. (배열에 담는것은 어렵지 않으니까)

divisor이라는 변수를 선언하고 그 값을 이용해서 n을 나누는데, (n/divisor)

divisor이 n이 될때까지 계속해서 나눈다. (divisor <= n)

그 과정에서 만약 divisor를 통해서 값이 완전히 나누어지면 ( n%divisor === 0 )

그 값이 약수이므로 빈배열에 담는다. ( arr.push(divisor) )

 

 

 

✅ 내 코드

function solution(n) {  
    let divisor = 1
    let arr =[]
    
    while(divisor<=n){
        if(n%divisor === 0){
            arr.push(divisor)
        }
         divisor++
    } 
     return arr
}

우선 divisor를 1부터 시작하기 위해서 1로 초기화한다. (1부터 나눌 것이므로 시작을 1부터 한다.)

그리고 최종값을 담을 arr빈배열로 초기화한다.

 

반복문을 while을 통해서 만든다. while의 범위는 divisor<=n이다.

이 값은 1부터 시작해서 n까지 값을 검사하는 역할을 한다. (예를 들면 4라고 하면 1,2,3,4까지의 값을 검사할 것이다)

 

그리고 while문안에서는 n의 값을 검사한다. 

n를 나누었을때 나머지가 0이라는 것divisor로 나누어진다는것을 의미하므로 이때 divisor가 약수이다.

if문을 통해서 n%divisor === 0 이면 arr에 divisor를 push한다.

 

그리고 divisor를 ++를 통해서 +1한다. 그래야 divisor의 값이 1이 더해져서 다음 값을 검사할 수 있다. 

그러면 divisor=2가 된 상태에서 다시 while문을 돈다. if문을 통해서 약수인지 아닌지 검사하고 약수가 맞다면 arr에 push한다.

그리고 다시 divisor에 +1을 한다.

 

이러한 동작을 divisor이 n일때까지 반복한다.

이렇게하면 n의 약수만을 모은 배열 arr가 완성된다.

마지막으로 arr을 리턴한다.

 

 

 

✅ 내 코드 2

function solution(n){
    let arr =[]
    for(divisor=1; divisor<=n; divisor++){
        if(n%divisor===0){
            arr.push(divisor)
        }
    }
    return arr
}

while문의 끝에서 어차피 ++을 통해서 +1을 해야하기때문에 for문을 통해서 값을 구해도 좋을것같다는 생각이 들었다.

그래서 같은 코드를 for문으로도 짜보았다.

 

divisor이라는 글자가 길어서 원래는 i로 짰지만 위의 코드와 비교하면서 보기 좋게 하려고 이름은 위의 코드와 모두 동일하게 지어주었다.

 

먼저, 약수가 담길 배열 arr빈배열로 초기화한다.

그리고 for문을 통해서 반복문을 만드는데 n을 나누기위해서는 0이 아니라, 1부터 시작해서 나눌것이기때문에 divisor의 초기값을 1로 한다. 그리고 divisor가 n보다 작거나 같을 경우까지만 +1을 더하면서 반복문이 돌도록 범위를 지정한다.

 

for문의 안에서는 만약 n을 divisor로 나눈 나머지가 0인 경우에 arr에 divisor의 값을 push하도록 한다.

(n을 나눈 나머지가 0이라는 말이 곧 n의 약수라는 의미이기 때문에)

 

그리고 배열을 다 돌고 빠져나오면 arr를 리턴한다.

 

 

 

 

💻  다른사람 코드중에 배울 것 

function solution(n) {
    return Array(n).fill(0).map((v, index) => v+index+1).filter((v) => n%v===0);
}

Array를 통해서 n의 개수만큼의 배열을 만들고, 그 배열을 1-n까지의 숫자로 채운다 (ex> [1,2,3,4,5,6,7])

그리고 그 배열을 filter을 통해서 n을 나누면 나머지가 0이 나오는 값만 남긴다.

 

테스트를 통해서 코드를 실험해보면서 이해하면 이해하기가 더 쉽다.

 

Array(n)을 통해서 n개의 길이를 가진 배열을 생성한다.

function solution(n) {
    return Array(n)
}

테스트로 값을 확인해보면 n의 길이를 가진 배열이 모두 null값으로 채워진 것을 확인할 수 있다.

 

 

그런 다음 fill(0)을 통해서 배열을 모두 0으로 채운다.

function solution(n) {
    return Array(n).fill(0)
}

 

 

map을 통해서 위의 배열을 돌면서 각 요소에 index+1을 더한다.

function solution(n) {
    return Array(n).fill(0).map((v,index)=>v+index+1)
}

 

마지막으로 filter를 통해서 n을 나눈 나머지가 0인 요소만을 남긴다.

function solution(n) {
    return Array(n).fill(0).map((v,index)=>v+index+1).filter(v=>n%v===0)
}

 

 

 

 

🙋‍♀️ 내 생각

어려운 문제라기 보다는 약수를 어떻게 구해야하는지를 생각해보고 익히는 베이스같은 문제인것 같다.

앞으로 다른 문제에서 약수를 구해서 응용을 해야할때 이 문제를 풀었던 것이 유용하게 쓰일 수 있을 것이다.