프로그래머스 약수의 개수와 덧셈 (javascript)

이진우·2022년 7월 23일
0

문제 설명
두 정수 left와 right가 매개변수로 주어집니다. left부터 right까지의 모든 수들 중에서, 약수의 개수가 짝수인 수는 더하고, 약수의 개수가 홀수인 수는 뺀 수를 return 하도록 solution 함수를 완성해주세요.

제한사항
1 ≤ left ≤ right ≤ 1,000

풀이방법

1. left,right에 들어온 값으로 for반복문을 돌려서 배개변수 범위의 값들을 leftRight배열에 담아준다.

2. 반복문안에 중첩for문으로 범위값내의 숫자 순서대로 약수를 구하고 구해진 약수갯수를 arr배열에 i값으로 담아준다(약수 갯수체크를 위해)

3. arrLength 배열을 만들어두고 filter메소드를 통해 arr의 각 숫자 length값을 뽑아 arrLength에 약수갯수를 담아준다.

4. answer변수에 0값으로 두고 arrLength를 for반복문을 통해 현재값의 나머지가 0이면 짝수이므로 판별을 해서 참이면 +를 거짓이면 -를 해서 계산후 정답을 return해준다.

function solution(left, right) {
    let arr = [];
    let arrLength = [];
    let leftRight = [];
    let answer = 0;
    for (let i=left; i<=right; i++){
        leftRight.push(i)
        for (let j=1; j<=i; j++) {
            i % j == 0 && arr.push(i)
        }
        arrLength.push(arr.filter(item => i===item).length)
    }
    
    for (let z = 0; z < arrLength.length; z++){
        arrLength[z] % 2 === 0 ? answer += leftRight[z] : answer -= leftRight[z]
        console.log(answer)
    }
    
    return answer;
    
}

다른사람의 풀이

function solution(left, right) {
    var answer = 0;
    for (let i = left; i <= right; i++) {
        if (Number.isInteger(Math.sqrt(i))) {
            answer -= i;
        } else {
            answer += i;
        }
    }
    return answer;
}

생각치 못했는던 점이 두개가 있다...😱

  1. 특정수의 제곱근을 했을때 결과값이 정수라면 약수의 갯수가 홀수 라는것을 생각하지 못했다 아니 정확히는 생각이 아마 절대 안났을꺼같다..
    자기자신을 제곱하는 수가 1개 추가되는것 이니까 홀수 갯수가 나오고 이것으로 판별을 할 수 있었다니...
  2. Math.sqrt() 이라는 제곱근을 계산해주는 함수가 있었다
    Math는 정말 알면알수록 함수갯수가 많은거 같다 아마 첫번째 이유가 생각이 났더라면 제곱근을 구해주는 함수가 있는지 검색해보았을텐데 1을 몰랐으니 2도 생각이 날터가 있나😂

문제를 풀고서

어찌 문제를 풀긴했지만 수학적으로 접근해야하는 프로그램을 짤땐 좀더 생각을 해보고 프로그램을 만드는것이 좋겠다 단순히 계산을 해서 여러 변수에 담아서 답을 추출하니 좀 너저분하게 풀이가 된것같고 함수를 제대로 활용하지 못한것같은점이 좀 많이 아쉽고 앞으론 무작정 만들지 않고 생각을 좀더 해보고 문제를 풀어나가야겠다👊🏻✊🏻

profile
초보개발자의 개발일기

0개의 댓글