문제

문제 링크
image

나의 풀이

아이디어

  • n의 제곱근을 기준으로, 순서쌍은 대칭을 이룬다.
    예를 들어 n이 20이라면 (1, 20), (2, 10), … (10, 2), (20, 1) 이렇게 된다.
    그러므로 제곱근보다 작은 수까지만 반복문을 순회한다.
  • 반복문 내에서는 n이 어떤 자연수로 나누어떨어질 경우 카운팅한다.
  • 절반만 순회하였으므로 대칭되는 나머지 경우의 수를 더하기 위해 count * 2해주고, n의 제곱근이 자연수인 경우 순서쌍이 하나 더 발생하므로 + 1해준다.

    코드

    function solution(n) {
      let count = 0;
      for(let i = 1; i < Math.sqrt(n); ++i) { n % i === 0 && count++; }
      count = count * 2 + (Math.sqrt(n) === ~~(Math.sqrt(n)) ? 1 : 0);
      return count;
    }
    

다른 사람 풀이

function solution(n) {
    let ans = 0;
    for (let i = 1; i < Math.sqrt(n); i++)
        if (n%i === 0) ans+=2;

    return Number.isInteger(Math.sqrt(n)) ? ans+1 : ans;
}

반복문에서 바로 2씩 더해주고, 리턴문에 Number.isInteger 메서드를 사용한 부분이 나와 달랐다.

function solution(n) {
    return Array(n).fill(1).map((v,idx) => v + idx).filter(v => n % v === 0).length
}

1~n까지의 배열을 만든 뒤 filter 함수를 사용한 결과물의 length를 반환한 풀이.