Coding test

[프로그래머스] 약수의 개수와 덧셈 (Level 1)

Jiwoo 2022. 4. 19. 17:43

문제

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

  • 제한사항
    1 ≤ leftright ≤ 1,000
     

나의 풀이

function solution(left, right) {
    // left ~ right 중
    // 약수 짝수인 수 = +n
    // 약수 홀수인 수 = -n
    // 모두 더한 숫자 반환

    let arr = [];

    // for: 숫자 하나씩 루프
    //  for: 숫자 2~n까지 나눔 -> 나머지=0 -> sum +1
    // sum % 2 = 0 -> arr.push(+i)
    // sum % 2 != 0 -> arr.push(-i)
    //arr 모든 후 합 반환

    for(let i = left; i <= right; i++) {

        let sum = 0;

        for(let j = 1; j <= i; j++) {

            if(i % j === 0) sum++; 
        }

        arr.push(sum % 2 ? -i : i);
    }

    return arr.reduce((ac,e) => ac += e, 0);
}

 

  • 정확도 테스트 결과

     

  • 살짝 수정해 본 코드

    function solution(left, right) { 
    
    let arr = []; 
    
    // 약수에 기본 1개(1)을 포함시키고 세보자 
    for(let i = left; i <= right; i++) { 
    
      let sum = 1; 
    
      for(let j = 2; j <= i; j++) { 
    
          if(i % j === 0) sum++; 
    
      } 
    
      arr.push(sum % 2 ? -i : i); 
    
      } 
    return arr.reduce((ac,e) => ac += e, 0); 
    }

     

    약수에 1은 기본 포함이므로 sum = 1로 놓는다면 실행시간이 줄지 않을까 싶어서 해봤는데
    오히려 실행 시간이 더 많이 나온 테스트가 많다...
    역시 정석대로 작성하는 것이 낫다.
     

    • 정확도 테스트 결과

       

다른 풀이

  1. 깔끔한 답안
function solution(left, right) {
  let answer = 0;

  for (let i = left; i <= right; i++) {
    let count = 0;
    for (let j = 1; j <= i; j++) {
      if (i % j === 0) count++;
    }
    if (count % 2) answer -= i;
    else answer += i;
  }

  return answer;
}

 
나처럼 굳이 값을 배열에 넣어서 합하지 않고 바로 바로 계산해주는 풀이법이다.
훨씬 깔끔하고 좋은데, 간혹 위 코드보다 오래 걸리는 테스트가 있다.
 

  • 정확도 테스트 결과

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

 

정수의 제곱근이 정수라는 것은 약수가 홀수 개라는 것을 이용한 코드인데
알면 쉽지만, 생각해내기 결코 쉽지 않은 풀이다.
실행 시간도 가장 적게 걸리는 베스트 코드

 

  • 정확도 테스트 결과