[프그] 약수의 개수와 덧셈

dano Lee·2024년 3월 19일
0

알고리즘 문제 풀이

목록 보기
51/52

문제

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

입출력 예

left - right - result
13 ~ 17 -> 43
24 ~ 27 -> 52

해답

  • for문을 사용할때마다 몇번을 반복할지 고민하게 되는데 해당 문제에는
    1 ≤ left ≤ right ≤ 1,000 이라는 제한사항이 제시되어 있었기 때문에 입력 받는 left,right 값을 비교하여 while 문을 작성하였다.
  • 처음엔 모든 약수를 더하는 코드를 짜게 되었는데 문제파악을 다시 하고나서 보니 각각의 left값에 따른 약수 개수에 따라 연산하는 문제였다.
  • 첫번째 코드는 가장 좋아요를 많이 받은 풀이이다. 물론 해당 풀이를 보았지만 isInteger과 Math.sqrt에 대한 이해가 부족하여 사용하지는 않았다.
  • 두번째 풀이를 보면 cnt의 값에따라 answer 변수의 값을 더하거나 빼주는 코드를 작성하였다. 이 풀이에서 눈여겨봐야할 점은 left++ 연산의 위치이다. 해당 연산이 윗줄에 있는지 아랫줄에 있는지에 따라 첫 left값을 포함하고 안하고를 결정하기 때문이다.
  • 도중에 막혀서 풀이를 찾아보고 나름 내 풀이로 해석한 코드이다.
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;
}
function solution(left, right) {
    let answer = 0;
    
    while(left <= right) {
    let cnt = 0;
        for(let i = 0; i <= right; i++){
            if(left >= i) {
                if(left % i === 0) {
                    cnt++
                }
            }
        }
        answer = cnt % 2 === 0 ? answer + left : answer - left 
        left++
    }
    return answer
}
profile
세상에 이로운 영향력을 퍼뜨리고 싶은 프론트엔드 개발자 입니다.

0개의 댓글