본문 바로가기
코테

[JS] 약수의 합

by zenna 2024. 4. 16.
728x90
점수 : 1154 (+1)
테스트케이스 최대 소요시간 : 33.5MB

 

문제 : https://school.programmers.co.kr/learn/courses/30/lessons/12928#

 

제출답안

function solution(n) {
    if(n==1||n==0) return n;
    let sums = 1+n; 
    let untl = n;
    
    for(let f=2 ; f<untl;f++){
        if(n%f==0){ 
            untl = n/f; 
            if(untl != f){
                sums += f+untl;
            }else{ 
                sums += f;
                break;
            }
        } 
    } 
    
    return sums;
}

 

문제해설

2 : n이 1이거나 0인 경우, 아래의 로직을 타면 오답이 됩니다. 이 두 경우에는 n 자신을 리턴하여야 합니다.

3 : 리턴할 약수의 합계값입니다. 약수에는 자기 자신과 1이 무조건 포함되기 때문에, 1+n으로 시작합니다.

4 : 어떤 수가 n의 약수인지 확인하기 위하여 선언하는 f와 `n/f`인 untl 을 곱하면 n이 나옵니다. 아래 for문에서 약수 여부를 확인하되 untl까지만 확인합니다. 6의 경우 2 * 3 이기 때문에 untl은 3이 되고 그 뒤의 4와 5는 확인할 필요가 없으니까요. 

사실 다른 사람의 풀이를 쭉 읽어봤을 때, 이렇게 untl을 계속 갱신하기보다는 Math.sqrt(n)으로 정하고 들어가는게 간결했을 것 같습니다.

6. f는 4에서 설명했듯 이 for문에서 약수인지를 확인할 숫자입니다. 

7 : true라면 약수입니다.

8 : untl을 갱신해줍니다.

9 : false라면 25의 약수인 5의 경우와 같이 자기 자신의 제곱이 n인 경우입니다. 이러면 f를 두 번 더해주면 안됩니다. 

10 : sums에 약수인 f와 untl을 더해줍니다.

11~12 : 9에서 false인 경우입니다. sums에는 자기 자신 한번만 더해주고, for문을 더 순회하는 의미가 없으므로 break으로 종료합니다.

 

 


그러나.. 시간을 단축하기 위해 했던 것들은 아무 의미가 없었다. 아래 코드대로 하면 간결한 걸 알았지만 안 한건데 결론적으로 시간 차이가 없었다.(아니다. 사실 더 빨랐다.)

function solution(num) {
    let sum = 0;
    for (let i = 1; i <= num; i++) {
        if (num % i === 0) sum += i
    }
    return sum
}

결론 : 뻘짓했지뭐..

728x90

'코테' 카테고리의 다른 글

[JS] 시저 암호  (0) 2024.04.15
[Java] 정수 제곱근 판별  (0) 2024.04.11
[JS] 성격 유형 검사 (해설포함)  (0) 2024.04.10
[java] 붕대감기 (해설포함)  (1) 2024.04.09
[Java] 없는 숫자 더하기  (0) 2024.04.08

댓글