ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • [ 프로그래머스 Lv. 1] 약수의 개수와 덧셈
    Algorithm 2023. 11. 6. 15:28

    [ 문제 설명 ]

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

     

    [ 제한 조건 ]

    • 1 ≤ left  right ≤ 1,000

    [ 입출력 예 ]

    약수 약수의 개수
    13 1, 13 2
    14 1,2,7,14 4
    15 1,3,5,15 4
    16 1,2,4,8,16 5
    17 1,17 2
    • 따라서, 13 + 14 + 15 - 16 + 17 = 43을 return 해야 합니다.

    [ 문제 풀이 과정 ]

     아래는 초기 오류가 났던 코드이다. 이중 for문을 사용해 left부터 right 까지의 각각의 약수의 수를 셀 수 있도록 짰지만 제대로 답이 나오지 않았다. 

    function solution(left, right) {
        let answer = 0;
        let num = 0; // 약수의 개수
        
        for (let j = left; j <= right; j++){
         for  (let i = 1; i <= j; i++){
            if (j % i == 0) num += 1; 
          }
          answer += (num % 2 == 0) ? j : -j;
        }
        
        return answer;

     

     

    위의 코드에서 약수의 개수를 나타내는 num 변수를 0으로 할당한 부분을 for문 안에 넣어 수정했더니 정상적으로 출력되었다..ㅎ num 변수를 for문 밖에다 선언해서 left ~right 까지의 각각 약수의 개수가 제대로 찍히지 않아 발생했던 문제였다. 

    function solution(left, right) {
        let answer = 0;
        
        for (let j = left; j <= right; j++) {
            let num = 0; // 수정한 부분
            for (let i = 1; i <= j; i++) {
                if (j % i === 0) {
                    num += 1;
                }
            }
            answer += (num % 2 === 0) ? j : -j;
        }
        return answer;
    }

     

    실행 결과 아래처럼 정상적으로 출력된다. 

     

    아래 코드는 또다른 두번째 문제 풀이 방법으로 다른 분의 풀이를 참고했다. 

    ✔️ '제곱근이 있는 경우에만 약수가 홀수인 특성을 이용'해서 풀이한 내용이다.

    만약 제곱근이 있다면 Number.isInteger 함수로 전달된 값이 정수인지를 확인해봤을 때 true가 나오게 되어 약수의 개수를 홀수로 판별할 수 있게 된다. 

    function solution(left, right) {
        // Math.sqrt(9) : 3 (9의 제곱근 출력) 
        // .isInteger: 전달된 값이 정수인지를 확인 (true or false 출력)
        let answer = 0;
        for(let i = left; i <= right; i++){
            const j = Number.isInteger(Math.sqrt(i))
            answer += (j ? -1 : 1) * i
        }
        return answer;
    }

    [ Comment ]

    일단 for문 돌아가는 부분에서 사소한 부분으로 항상 실수하는 것 같다 이 부분은 꼭 고쳐야겠다..!

    그리고 입출력의 예를 통해서 위처럼 제곱근이 있는 경우에만 약수가 홀수인 특성을 발견할 수 있듯이 입출력의 예를 통해서도 문제 풀이 힌트를 알 수 있으니 그냥 넘기지 말고 유심히 봐야겠다. 

Designed by Tistory.