본문 바로가기
Developer/Algorithm

Programmers 코딩테스트 연습 - 약수의 합 (JavaScript)

by roqkfrlfhr 2020. 9. 16.

Programmers 코딩테스트 연습 - 약수의 합 (JavaScript)

 

Programmers(프로그래머스)의 코딩테스트 연습문제 Level 1 중 약수의 합 문제를 JavaScript를 사용하여 문제를 풀어보도록 하겠습니다.

 

문제 설명

정수 n을 입력받아 n의 약수를 모두 더한 값을 리턴하는 함수, solution을 완성해주세요.

제한 사항

  • n은 0 이상 3000이하인 정수입니다.

 

입출력 예

n return
12 28
5 6

 

입출력 예 설명

입출력 예 #1
12의 약수는 1, 2, 3, 4, 6, 12입니다. 이를 모두 더하면 28입니다.

입출력 예 #2
5의 약수는 1, 5입니다. 이를 모두 더하면 6입니다.

 

 

작성한 답

solution.js

function solution(n) {
    var answer = 0;
    for(var i=1; i<=n/2; i++) if(n%i == 0) answer += i;
    return answer+n;
}

 

설명

정수 n을 입력받아 n의 약수를 모두 더한 값을 리턴하는 함수, solution을 완성하는 문제입니다.

정말 너무나도 쉬운 문제입니다. 약수가 무엇인지만 안다면, 또한 반복문을 안다면 그 누구든지 해결할 수 있는 문제입니다.

너무도 쉬운 문제라 해결하려면 정말 여러가지 방법으로 해결할 수 있지만, 멋지게 한줄로 있어보이는 코드로 작성할 수도 있지만,

시간 효율성을 생각했을 때 모두들 모를 수가 없는 정말 심플한 위에 작성한 코드가 좋다고 생각됩니다.

 

너무도 쉬운 문제이지만 설명을 드려 보도록 하겠습니다.

정수 n의 약수를 모두 더한 값을 저장할 변수 answer을 0으로 초기화합니다.

그리고 1부터 정수 n/2까지 모든 숫자가 정수 n의 약수인지를 확인하기위해 n을 각 숫자들로 나누어보고 0으로 나누어 떨어지는 약수라면 해당 숫자를 answer에 더해줍니다.

정수 n의 약수 중 가장 큰 수는 정수 n 자기 자신이고, 그 다음으로 큰 약수는 n/2보다 클 수 없기 때문에 n/2까지만 반복해주면 됩니다.

이렇게 1부터 정수 n까지 모든 숫자중 정수 n의 약수만을 answer에 모두 더해준 뒤 answer에 정수 n까지 더하여 반환하면 문제가 해결됩니다.

 

위에 설명드린 방식이 정수 n을 입력받아 n의 약수를 모두 더한 값을 return시키는 방법 자체이니 이 방법을 여러가지 코드로 다르게 해결할 수 있는 방법은 얼마든지 있으니 다른방법으로도 얼마든지 문제를 해결하실 수 있습니다.

가령 위에 먼저 작성한 for문으로 반복을 이용하는 것이 아닌 재귀의 방식으로 문제를 해결하는 예시 코드를 보여드리도록 하겠습니다.

function solution(n, answer=0, i=1) {
    return i<=n/2 ? solution(n, n%i==0 ? answer+i : answer, ++i) : answer+n;
}

처음 보여드렸던 코드와 똑같은 방식으로 작동하지만 재귀의 방식으로 풀어낸 코드입니다.

재귀를 사용하면 한줄의 코드로 더 좋아보이지만 효율성 테스트를 해보시면 재귀 특성 상 좀 더 느립니다.

저는 여러가지 방식으로 풀 수 있다는 것을 보여드리기 위해서 보여드렸습니다.

 

 

제가 틀린 부분이 있다거나 더 좋은 방법을 아시는 분이 계시다면 댓글로 공유 부탁드립니다!

 

 

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

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

 

감사합니다.


댓글