프로그래머스 LV1 약수의 개수와 덧셈

장성우·2023년 7월 7일

문제풀이

목록 보기
2/9

문제 링크
https://school.programmers.co.kr/learn/courses/30/lessons/77884

문제 설명

두 정수 left, right 가 매개변수로 주어진다.
left ~ right 까지 있는 모든 수들 중 약수의 개수가 짝수면 +, 홀수면 -
한 값을 return 하는 함수를 작성하시오.

  • 내 풀이
    범위에 해당 하는 수들의 약수의 개수를 구해가면서 짝수면 +, 홀수면 - 한다.
function solution(left, right) {
  let total = 0
  for(let i = left; i <= right; i++ {
    let len = createArrayDivisor(i).length
  len % 2 === 0 ? total += i : total -= i
  }
  return total
}

// n의 약수의 배열을 반환
function createArrayDivisor(n) {
  let arr = []
  for(let i = 1; i <= n; i++ {
    n % i === 0 ? arr.push(i) : 'continue'
  }
  return arr
}

const re = solution(13, 17)
console.log(re)
// 43

그리고 약수를 찾는 알고리즘에 대해서 더 알아보았다.

위에서는 약수를 구하기 위해서 1부터 n까지 해당하는 모든 수들을 계속 n에 대해 나누면서 나머지가 0이 되는 수를 찾았다.
이때 시간복잡도는 O(N)의 복잡도는 가진다.

  • 제곱근을 이용한 약수 구하기
    정수 n의 약수의 개수를 구하는 다른 방법은 제곱근을 이용하는 방법이다.
    n의 제곱근을 구한 다음 n을 1부터 제곱근까지 나누어서 0이 되는 수를 먼저 찾는다.
    나온 수들을 다시 n에 대해 나누었을 경우 나오는 값들 또한 n의 약수이다.
function divisor(n) {
  // 제곱근 구하기
  let squareRoot = Math.floor(Math.sqrt(n))
  let arr = []

  for(let i = 1; i <= squareRoot; i++) {
    if(n % i === 0) arr.push(i)
  }
  
  let newArr = arr.map(el => n / el)
  arr = arr.concat(newArr)
  
  // 정렬, 중복 제거
  arr.sort((a, b) => a - b)
  const set = new Set(arr)
  arr = [...set]
  
  console.log(arr)
}
  • 프로그래머스에 있는 또 다른 풀이
    어떤 수가 있을 때 그 수의 제곱근이 정수면 약수의 개수가 홀수인 성질을 이용
function solution(left, right) {
  let total = 0
  for(let i = left; i <= right; i++) {
    if(Number.isInteger(Math.sqrt(i))) total -= i  
    else total += i
  }
  return total
}

Number.isInteger(n) : n의 값이 정수면 true, 정수가 아니면 false 반환
Math.sqrt(n) : n의 제곱근 반환

profile
HiHeLlo!1

0개의 댓글