Sungtt

Lev.1 프로그래머스 약수의 개수와 덧셈 본문

코테

Lev.1 프로그래머스 약수의 개수와 덧셈

sungtt 2023. 3. 20. 16:11

프로그래머스 [약수의 개수와 덧셈]

 

문제 설명 

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

 

제한사항

1 ≤ left  right ≤ 1,000

직접 풀이 결과

function solution(left, right) {
    var answer = 0;
    let length = right - left + 1;
    let numberList = Array.from({length:length},(v,i) => left+i); // [13,14,15,16,17]
    let count = numberList.map((num,idx) => {
    let 갯수 = 0;
    for(let i = 1 ; i <= num ; i++){
        if(num % i === 0) 갯수++;
    }
    갯수%2===0 ? answer+=numberList[idx] : answer-=numberList[idx]
    })
    
    return answer;
}

Array.from을 사용하여 약수의 개수를 구해야할 숫자목록을 생성했다.

이 목록을 순회하며 각 요소의 약수의 갯수를 구한 뒤 갯수가 홀,짝수냐에 따라

answer에 값을 더해주고 빼준다.

중간중간 방식을 바꿔서 시도하다보니 불필요한 메소드가 사용된것이 보인다.

배열을 반환해주는 map은 굳이 필요없고 forEach로도 순회하기에 충분할것이다.

 약수 구하는 방식을 더 빠르게 할 수 있을것같다.

참고 풀이 결과 - 1

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;
}

제한사항에 따라서 반복문 조건으로 잘 넣기만 한다면 위에처럼 굳이 배열을 만들지않아도 각 숫자별로 순회할 수 있었다.

Number.isInterger는 인수가 정수인지 확인하여 true / false를 반환해준다.

Math.sqrt는 인수의 제곱근을 반환해준다.

인수의 제곱근이 정수일 경우 약수의 갯수가 홀수기때문에 뺄셈을,

정수가 아닐 경우 짝수기때문에 덧셈을 실행해준다.

 

멋있는 코드인거같다!

 

Comments