프로그래머스 알고리즘 LV.1 - 약수의 합

roadzmoon76·2022년 1월 30일
0

알고리즘

목록 보기
3/6

https://programmers.co.kr/learn/courses/30/lessons/12928

📕 나의 풀이

function solution(n) {
    let sum = 0;
    for (let i = 1; i <= n; i++) {
        if (n % i === 0) {
            sum += i;
        }
    }
    return sum;
}
  • 일단 메소드 없이 기본기로만 짜봄
  • 조건에서 n은 0부터라서 sum의 초기값을 0으로 설정해두고 n이 0일땐 for문의 조건에 안맞아서 아예 안들어가게 만들어놓음

📘 다른 사람 풀이

  • 수를 넣어 따져보니 계속 a로 n을 나눠보면서 나누어 떨어지는 수라면 b에 그수를 더해주는 로직을 재귀함수로 구현했음
  • 기본적으로 n을 나누는 수인 a가 1씩 더해지므로 근본적인 경우의 수는 내 풀이와 같은 듯
  • 다만 결국은 b가 출력될때까지 계속 되는 논리회로인데 a가 n의 2배가 되어야 그만두므로 n의 2배까지 경우의 수를 돌려야해서 효율적이지 않은 것 같다. 결국엔 a=n이 될때까지만 돌려야 제일 효율적이게 되는것 같다.

위 풀이를 참고한 나의 풀이

function solution(n, a=0, b=0) {
    return n <= a - 1 ? b : solution(n, a + 1, b += n % a ? 0 : a);
}
  • a가 n+1이 되면 멈추게 해서 a가 2n이 될때까지 돌아가야 하는 경우보다 계산량을 줄여봤다

📘 다른 사람 풀이 2

  • 6번째 줄에서 계산량을 줄이기 위해 우리가 실제로 약수를 구할때처럼 그 짝꿍까지 바로 더해주는게 인상깊었다
  • 또한 어차피 짝꿍까지 더해주니 for문을 딱 반인 제곱근의 정수 부분까지만 돌리는게 참신했다
  • 또한 for문을 돌리고 나왔을때 하나 커져있는 i를 9번째 줄에서 i--를 통해 다시 조정해주고
  • n의 제곱근이 정수인경우는 중복더해졌으니 리턴값에서 빼주는것도 꼼꼼했다
profile
크론병걸린 자퇴생, 개발자되기

0개의 댓글