[ 프로그래머스 ] : 약수의 개수와 덧셈 (제곱근이 정수면 약수의 개수가 홀수다!!!!!!!)




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

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




<개념 & 문제 풀이법 생각>

우선 약수를 먼저 구하는게 중요한데, 이 문제가 한번 꼰게, 원래는 n을 받아서 i로 나눠주면 약수가 나오는데

시작점이 n이 아니고 어떤 숫자라서 for를 한번 더 넣어준게.. 내가 문제 푼 포인트였던것 같다.

콘솔에 잘 찍어서 약수를 구했고, 약수를 구했는데 만약 같은 숫자로 이루어져있는 약수라면 1만 더하고, 아니라면 2를 더해서

count를 세고, 그 다음에 후처리를 해줬다.

사실 이번 블로깅은 내가 푼 문제에 대한 것때문이 아니라

다른 사람 풀이에 기억해놓으면 문제풀때 좋을내용이 잇어서 가져와봤다..

case1에 그 내용이 있음.

my solution

function solution(left, right) {
  var answer = 0;
  let count = 0;
  for(let i = left; i<= right; i++){
    count = 0;
    for(let k=1; k <= right-left+2; k++){
      if(i % k === 0 ){  //약수면
        // console.log(`----${i}의 약수-------`)
        // console.log(`(${k},${i/k})`);
        if(k !== i/k){  //약수가 다른 숫자라면
          count = count + 2;
        }else{
          count++;
        }
      } 
    }
    // console.log(i,"의 약수 갯수", count);
    if(count % 2 === 0){  //약수의 갯수가 짝수라면
      answer += i
    }else{
      answer -= i
    }
  }
  return answer;
}




CASE 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.isInteger(Math.sqrt(i))

Number.isInteger 에 대한 mdn은 여기… 전달된 값이 정수인지 판단해준다.








© 2018. by sora

Powered by sora