프로그래머스: 약수의 합

송유나·2021년 1월 18일
0

1. 문제


2. 풀이 과정

  • 문제를 보자마자 너무 반가웠다!
    이전에 소수찾기 문제에서 제곱근을 활용한 부분을 이해하기 위해 쏟아부었던 시간을 보상받는 느낌이었기 때문!!
    그래서 전에 정리했던 제곱근을 활용해서 문제를 풀어보고자 하였다.
  1. 약수를 배열에 저장
    =>for문으로 돌리되 증가하는 변수 i의 값은 n의 제곱근까지만 증가하도록해서 쓸데없이 for문이 많이 진행되지 않도록 하였다.
  2. map을 활용하여 배열에 저장된 수를 다 더해줌

3. 코드

function solution(n) {
    var answer = 0;
    var aliquot = []
    
    for(var i=1; i*i<=n; i++){
        if(n%i==0){
            aliquot.push(i, n/i)
        }
    }
    
    var sqrt = Math.sqrt(n)
    if(Number.isInteger(sqrt) == true) aliquot.splice(aliquot.indexOf(sqrt), 1)
    
    aliquot.map(num => answer += num)
    
    return answer;
}
  • 몇몇 테스트케이스를 통과 못하는 상황 발생ㅠ 탐색 후 예외처리 해줌
    🚩예외처리: aliquot.push(i, n/i)에서 만약 n이 36이고 i가 6이라고 가정한다면 배열에 6이 두번 들어가는 상황이 발생하기 때문에 테스트를 통과하지 못했던 것.
    =>for문안에 코드를 작성하여 예외처리를 할 수도 있었으나 그렇게 한다면 비효율적이라 생각하여 밑에 코드를 따로 추가해서 한 번만 체크하도록 작성하였다.

4. 배운 것

  • Math.sqrt(): 숫자의 제곱근을 반환
    Math.sqrt(9); // 3
  • Number.isInteger(): 값이 정수인지 판별하는 메서드
    Number.isInteger(9); // true

5. 후기

  • 매일 너무 못하는 것 같아 자괴감에 빠지면서 힘들고 그랬는데 그래도 그렇게 투자한 시간들이 때때로 오늘처럼 갑자기 빛을 보는 순간이 있다. 정말 별거 아니지만 이 순간들이 있어서 더 열심히 하게된다.

  • 이 문제를 풀면서 내가 문제를 풀기위한 코드만 작성하는 것이 아닌 효율성을 생각하면서 코드를 작성하고 있다는 사실을 알고 놀랍기도 했지만 어색하기도 했다.
    이전에 전혀 상상할 수 없었던 나의 모습이기 때문엥ㅎㅎㅎ너무 신기하다.
    물론 그렇게 해서 내가 작성한 코드가 진짜 효율적인지 확신은 못하지만 메서드 사용법도 몰라 문제푸는 데에만 전전긍긍하던 일주일 전을 생각하면 감격스럽다😊

profile
개발자를 꿈꾸는 햇병아리입니다.

0개의 댓글