본문 바로가기
Developer/Algorithm

프로그래머스 코딩테스트 연습 - 약수의 개수와 덧셈 (JavaScript)

by roqkfrlfhr 2022. 5. 16.

프로그래머스 코딩테스트 연습 - 약수의 개수와 덧셈 (JavaScript)

 

Programmers(프로그래머스)의 코딩테스트 연습문제 Level 1 중,

[약수의 개수와 덧셈] 문제를 JavaScript를 사용하여 해결해 보도록 하겠습니다.

 

문제

문제 설명

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

 

제한사항

  • 1 ≤ left ≤ right ≤ 1,000

 

입출력 예

left right result
13 17 43
24 27 52

 

입출력 예 설명

입출력 예 #1

  • 다음 표는 13부터 17까지의 수들의 약수를 모두 나타낸 것입니다.
약수 약수의 개수
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 해야 합니다.

입출력 예 #2

  • 다음 표는 24부터 27까지의 수들의 약수를 모두 나타낸 것입니다.
약수 약수의 개수
24 1, 2, 3, 4, 6, 8, 12, 24 8
25 1, 5, 25 3
26 1, 2, 13, 26 4
27 1, 3, 9, 27 4
  • 따라서, 24 - 25 + 26 + 27 = 52를 return 해야 합니다.

 

작성한 답

solution.js

function solution(left, right) {
    return Array.from({ length: right - left + 1 }, (_, i) => left + i)
        .reduce((ac, v) => ac + (Number.isInteger(Math.sqrt(v)) ? -v : v), 0);
}

 

설명

먼저 left부터 right 까지의 모든 수를 담은 배열을 만드는 것으로 시작했습니다.

Array.from({ length: right - left + 1 }, (_, i) => left + i)

를 사용하여 left부터 right 까지의 모든 수를 담을 수 있도록 길이를 지정하여 생성하면서 각 요소들을 left부터 1 씩 증가하여 담았습니다.

 

그리고 해당 배열에 reduce를 사용하여 각 요소를 빼거나 더하여 결과를 얻을 수 있는데,

약수의 갯수를 구한 다음 홀수인지 짝수인지 알 수도 있지만,

어떠한 수의 제곱근이 정수면 약수의 갯수가 홀수이고, 정수가 아니라면 짝수라는 것을 이용하였습니다.

 

약수의 갯수가 홀수인지 짝수인지가 이 문제를 푸는 핵심이기에

저처럼 배열을 미리 생성하는 방법이 아니라 for 문을 사용한 반복문을 사용하시는 방법 등을 사용해서도 문제를 해결할 수 있습니다.

 

 

도움이 되셨다면 공감, 댓글 부탁드립니다!

궁금하신 점이나 요청사항은 언제든지 말씀해주세요!

피드백도 언제나 환영입니다!

 

감사합니다.


댓글