본문 바로가기
Algorithm/Programmers

[Programmers] 약수의 개수와 덧셈(JavaScript)

by 백승전 2022. 7. 27.

알림

 

본 포스팅은 공부 목적으로 작성된 글이며 상업적 목적으로 절대 사용되지 않았음을 밝힙니다.

 

문제

 

https://school.programmers.co.kr/learn/courses/30/lessons/77884

 

프로그래머스

코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요.

programmers.co.kr

 

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

 

코드

 

function solution(left, right) {
    var answer = 0;
    for(let i = left; i <= right; i++){
        var count = 0;
        for(let j = 1; j <= i; j++){
            if(i % j == 0) count++;
        }
        count % 2 == 0 ? answer += i : answer -= i;
    }
    return answer;
}

 

풀이

 

매개변수 left와 right를 받아옵니다.

그리고 left와 right를 포함하여 그 사이에 있는 숫자들의 약수의 '개수'를 구하여 짝수개면 해당 수를 더하고, 홀수면 빼서 결과값을 리턴하는 문제입니다.

 

따라서 left부터 시작하여 right까지 증가하는 반복문을 만들어주고, 약수의 개수부터 먼저 구해주기로 했는데요.

해당 숫자를 1부터 시작해서 그 숫자까지 나눠줬을 때 0이 되면(약수) 변수를 하나 더 만들어 카운트가 되게끔 했습니다.

즉, 해당 반복문이 돌 때마다 숫자들이 가지고 있는 약수의 개수를 구할 수 있게 됩니다.

 

두 번째로 약수의 개수가 2로 나눴을 때 나머지가 0이라면(짝수) 해당 숫자를 더해주고, 그 외엔(홀수) 해당 숫자를 빼서 리턴해주면 됩니다.

 

function solution(left, right) {
  let answer = 0;
  for (let num = left; num <= right; num++) {
    answer = Number.isInteger(Math.sqrt(num)) ? answer - num : answer + num;
  }
  return answer;
}

 

다른 분의 코드입니다.

어차피 저를 포함하여 해당 문제를 푼 뒤 블로그를 작성하는 개발자 분들이라면 해당 코드를 한 번씩 언급했을 텐데요.

정말 기발한 방법인 것 같습니다.

 

저는 약수를 구할 때마다 직접 카운트를 하였고, 카운트 된 수가 짝수인지 홀수인지 판별을 한, 문제 그대로를 따라간 풀이인 반면, 해당 코드는 '제곱근이 정수면 약수의 개수가 홀수'라는 수학 개념을 이용하였고, 덕분에 훨씬 깔끔해졌습니다.

 

Math.sqrt() 함수는 숫자의 제곱근을 반환하고, Number.isInteger() 메서드는 주어진 값이 정수인지 판별합니다.

따라서 참일 시(제곱근이 정수 > 홀수 > 참) 숫자를 빼고, 거짓일 시 더하여 결과값을 구할 수 있습니다.

댓글