본문 바로가기

개인공부

2021년 5월 22일 프로그래머스(약수의 개수와 덧셈)

반응형

약수의 개수와 덧셈

 

//내가 작성한 코드

function solution(left, right) {
    let result = '';
    let count = 0;
    for(let i = left; i <= right; i++){
        count = 0;
        for(let j = 1; j <= i; j++){
            if(i % j === 0){
                count++;
            }
        }
        if(count % 2 === 0){
            result = result + `+${i}`
        }else{
            result = result + `-${i}`
        }
    }return eval(result);
}
Pseudo Code

left부터 right까지 반복문으로 순회하는데
left를 1부터 자기자신까지 나누어서 나머지가 0인 숫자의 수를 count++한다.
짝수면 `+${left}`
홀수면 `-${left}`
result = ''; 여기에 더해주자
이것을 eval해 볼까?

위 작성한 수도코드를 바탕으로 코드를 작성하였고 결과는 통과였다! 

 

이거 말고 다른 방법이 있을까라는 생각이 들었지만 항상 예상을 뒤엎는 결과가 있기에 다른 사람의 풀이로 들어갔다.

 

......충격적인 풀이가 있었는데.....

function solution(left, right) {
    var answer = 0;
    for (let i = left; i <= right; i++) {
        if (Number.isInteger(Math.sqrt(i))) { //?????이게 뭐지??????
            answer -= i;
        } else {
            answer += i;
        }
    }
    return answer;
}

해당 풀이의 핵심은 "어떠한 수의 제곱근이 정수이면 약수의 개수가 홀수 라는 것"

 

이게 되나? 라는 생각에  입출력 예시를 찾아보았다.

 

수  약수의 개수
13	2
14	4
15	4
16	5
17	2



수  약수의 개수
24	8
25	3        
26	4
27	4


//정말 16과 25만 약수의 개수가 홀수이다.

 

배운 점

어떠한 수의 제곱근이 정수이면 약수의 개수가 홀수이다.
정수의 확인은 Number.isInteger() 메서드를 통해 할 수 있다.
문자열로 result("")를 구하여 eval()하였지만 보통은 result(0)에 -= 혹은 +=를 통해 답을 뽑아낸다.
반응형