Oops, All Code!/🤯 Oops, My Algorithm!

♡̈ 04. 프로그래머스:: 기사단원의 무기

밍동망동 2024. 7. 8. 23:43

 

이건 내가 제일 처음 풀었던 약수 구하는 문제에서 한 단계 더 나아간 것 같다.

약수의 개수를 먼저 구하고, 공격력을 구해야할 듯하다.

 

어떻게 단계를 나눌지 엄청 고민했는데 결국 다음과 같이 나누었다.

1. 각 기사의 번호에 대한 약수 계산
2. 그 약수의 개수에 따른 공격력 결정
3. 공격력이 제한수치를 초과하면, 협약기관의 공격력 적용
4. 필요한 철의 무게 모두 합산
function solution(number, limit, power) {
    let totalWeight = 0;

    function getDivisorCount(num) {
        let count = 0;
        for (let i = 1; i <= Math.sqrt(num); i++) {
            if (num % i === 0) {
                count++;
                if (i !== num / i) {
                    count++;
                }
            }
        }
        return count;
    }

    for (let i = 1; i <= number; i++) {
        let attackPower = getDivisorCount(i);
        if (attackPower > limit) {
            attackPower = power;
        }
        totalWeight += attackPower;
    }

    return totalWeight;
}

 

 

새로운 코드

function solution(number, limit, power) {
    var answer = 0;
    for (let n = 1; n <= number; n++) {
        let count = 0;
        for (let j = 1; j * j <= n; j++) {
            if (j * j == n) count++;
            else if (n % j == 0) count += 2;
        }
        if (count > limit) count = power;
        answer += count;
    }
    return answer;
}

 

조금 더 간결한 코드이다.

j * j <= n을 이용해 제곱근까지 약수를 탐색한다.

 

단일 함수에서 모든 작업을 수행하지만, 직관력은 부족한 것 같다.

효율적이고 간결하지만, 직관성이 떨어지며 크게 성능차이가 나지 않기 때문에

나는 내가 작성한 코드가 낫다고 생각한다.