개인공부
2021년 5월 22일 프로그래머스(약수의 개수와 덧셈)
bmanerdaniel
2021. 5. 22. 16:03
반응형
약수의 개수와 덧셈
//내가 작성한 코드
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)에 -= 혹은 +=를 통해 답을 뽑아낸다.
반응형