순서쌍 구하기

오찬주·2024년 2월 25일
0

JAVASCRIPT

목록 보기
4/8
post-thumbnail

프로그래머스 120836번

나는 언제쯤 .. 입문을 벗어날 수 있을까 .. (사실 입문도 어려워한다는 사실 ,,,)

이게 무슨 문제일까.. 생각하지만 사실상 자연수 n의 약수를 구하는 문제라고 생각하면 쉽다!!! (아마도)

내가 생각한 순서는 다음과 같다

  1. 자연수 n이 주어질 때 자연수 n번까지 반복문을 돌려서 1부터 n까지 자연수 n을 나눈다.
  2. 나누었을 때 나머지가 0이라면 자연수 n의 약수인 것이기에 answer에 값을 하나씩 더해준다.
function solution(n) {
  var answer = 0;
  for (var i = 0; i <= n; i++) {
    if (n % i == 0) {
      answer++;
    }
  }
  return answer;
}

다른 사람의 문제 풀이 방식을 보니 .. 좀 어렵다..

문제 풀이 알고리즘은 다음과 같다.

  1. 변수 ans를 0으로 초기화한다. ans는 약수의 개수를 저장한다.

  2. 반복문을 통해 1부터 해당 숫자의 제곱근(Math.sqrt(n)으로 구할 수 있음!)까지의 수를 순회한다.

    💡 이 때, 제곱근까지만 순회하는 이유는 약수의 특성 상 제곱근 이상의 수는 이미 앞에서 나온 약수의 반대편에 있기 때문이다.

  3. 반복문 내에서, 주어진 수 n을 현재 순회중인 수 i로 나누어 떨어지는지 확인한다. 나누어 떨어지면 ans에 2를 더한다. 이유는 i가 n의 약수이므로, n/i도 약수이기 때문!

  4. 반복문이 끝나면, 주어진 수 n의 제곱근이 정수인지 확인한다. 만약 정수라면, n의 제곱근은 중복되는 약수이므로 ans에 1을 더해준다.

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

이 문제 풀이에서는 내가 모르는 메소드가 없었다. 이미 다 푼 문제들에서 나온 메소드들이었다. (Math.sqrt, Number.isInteger) 이를 잘 활용해 문제를 효율적으로 푸는 것이 중요하다는 것을 다시금 깨닫는다.

profile
프론트엔드 엔지니어를 희망합니다 :-)

0개의 댓글