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

JINSUNG LEE·2021년 7월 1일
0
post-thumbnail


function solution(left, right) {
    // left 13부터 17까지의 갯수는 4 + (1) =
    
    let countSave = [];
    
    // left가 증가하여 right와 같을 경우 탈출 (right + 1 한 이유는 right의 순수값도 약수 구해야함)
    while(left !== right + 1) {
      let count = 0
    
    // 해당 left 값의 약수 조건 측정
      for(let i = 1; i <= left; i++) {
        if (left % i === 0) {
            count++        
        }
      }
    // 홀수면 ( - ) 짝수면 ( + ) 구분 후 배열에 저장  
      if (count % 2 === 0) {
        countSave.push(left);
      } else {
        countSave.push(-left)
      }
        left++
    }
    
    // 저장한 배열들 총합 구하기
    return countSave.reduce((x, y) => {
        return x + y
    })

}

이번 알고리즘을 한 번에 합격하여 매우 기분이 좋았다.

해당 left의 요소가 홀수면 음수로 짝수면 양수로 구분짓는게 가장 핵심 포인트인 것 같다.

push 를 통해 배열에 부호를 구분하면 음수, 양수 쉽게 대입할 수가 있다.

만일 위의 방법이 아니라면,,,, 아마 문자열에 "-5"를 다시 숫자로 변환해서 복잡한 로직이 구성될 것이다.


모범 답안



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.isInteger 은 정수면 true 그 외는 다 false로 판별하는 메서드이다.

(필자는 금일 이런 메서드 처음 본다...)

즉, 제곱근으로 Math.sqrt() 홀수는 정수, 짝수는 실수로 판별된다.. (너무 신기한데,,,)

해당 코드는 실행 속도도 워낙 빠르기에 최적의 로직인 것 같다.

도대체 이런 생각을 어떻게 했는지 신기하구먼,,, 오늘도 한수 배우고 간다.

profile
https://californialuv.github.io/Tech_Blog 이사 갔어용 🌎 🚀

0개의 댓글