코딩테스트 | (JavaScript) 프로그래머스 : 약수의 합

trevor1107·2021년 8월 18일
0

✅문제

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

❕ 제한사항

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

🎹📢입출력 예제

✍풀어보기

function solution(n) {
    let answer = 0;
    
    for(let i = 0; i <= n; ++i){
        if(n % i === 0){
            answer += i;
        }
    }
    
    return answer;
}

약수란 나누어떨어지는 값, 즉 나누었을 때 나머지가 0인 것들을 찾아내면 되는 단순한 문제였다. 고민할 시간조차 필요가 없었다!! 바로 제출했지 뭐야~

근데 너무 비효율적인 것 같아서 조금이나마 성능을 올리는 방법이 뭐가 있을까 하다가 아래와 같은 방법으로 바꿨다. 물론! 3000 이하의 숫자에서는 크게 차이가 없을 것이다.

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

약수로 나누어떨어지는 수는 값의 절반 이후에는 자신의 값만 존재하므로 반에 해당하는 값만 반복문을 돌리고 입력된 자신의 값을 더해준다.
입력된 값을 487742, 1111111로 가정하고 테스트했는데 역시나 결과가 나오는 시간이 많이 단축된다.


🎈다른 사람의 풀이

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

역시나 이번에도 굳이.. 재귀 함수로 푼 케이스가 좋아요를 가장 많이 받았다.
이제 삼항 연산자를 이용해서 푸는 저런 방식의 규칙이 보이기 시작한다.

return 반복 조건식 ? 결괏값 : 함수명(입력값, 반복 조건 값의 변화, 결괏값의 변화)

재귀 함수는 반복할 조건이 맞을 때까지 함수를 다시 실행시킨다.



참고 자료 및 사이트 (감사합니다)

profile
프론트엔드 개발자

0개의 댓글