[ 프로그래머스 Lv. 1] 약수의 개수와 덧셈
[ 문제 설명 ]
두 정수 left와 right가 매개변수로 주어집니다. left부터 right까지의 모든 수들 중에서, 약수의 개수가 짝수인 수는 더하고, 약수의 개수가 홀수인 수는 뺀 수를 return 하도록 solution 함수를 완성해주세요.
[ 제한 조건 ]
- 1 ≤ left ≤ right ≤ 1,000
[ 입출력 예 ]
수 | 약수 | 약수의 개수 |
13 | 1, 13 | 2 |
14 | 1,2,7,14 | 4 |
15 | 1,3,5,15 | 4 |
16 | 1,2,4,8,16 | 5 |
17 | 1,17 | 2 |
- 따라서, 13 + 14 + 15 - 16 + 17 = 43을 return 해야 합니다.
[ 문제 풀이 과정 ]
아래는 초기 오류가 났던 코드이다. 이중 for문을 사용해 left부터 right 까지의 각각의 약수의 수를 셀 수 있도록 짰지만 제대로 답이 나오지 않았다.
function solution(left, right) {
let answer = 0;
let num = 0; // 약수의 개수
for (let j = left; j <= right; j++){
for (let i = 1; i <= j; i++){
if (j % i == 0) num += 1;
}
answer += (num % 2 == 0) ? j : -j;
}
return answer;
위의 코드에서 약수의 개수를 나타내는 num 변수를 0으로 할당한 부분을 for문 안에 넣어 수정했더니 정상적으로 출력되었다..ㅎ num 변수를 for문 밖에다 선언해서 left ~right 까지의 각각 약수의 개수가 제대로 찍히지 않아 발생했던 문제였다.
function solution(left, right) {
let answer = 0;
for (let j = left; j <= right; j++) {
let num = 0; // 수정한 부분
for (let i = 1; i <= j; i++) {
if (j % i === 0) {
num += 1;
}
}
answer += (num % 2 === 0) ? j : -j;
}
return answer;
}
실행 결과 아래처럼 정상적으로 출력된다.
아래 코드는 또다른 두번째 문제 풀이 방법으로 다른 분의 풀이를 참고했다.
✔️ '제곱근이 있는 경우에만 약수가 홀수인 특성을 이용'해서 풀이한 내용이다.
만약 제곱근이 있다면 Number.isInteger 함수로 전달된 값이 정수인지를 확인해봤을 때 true가 나오게 되어 약수의 개수를 홀수로 판별할 수 있게 된다.
function solution(left, right) {
// Math.sqrt(9) : 3 (9의 제곱근 출력)
// .isInteger: 전달된 값이 정수인지를 확인 (true or false 출력)
let answer = 0;
for(let i = left; i <= right; i++){
const j = Number.isInteger(Math.sqrt(i))
answer += (j ? -1 : 1) * i
}
return answer;
}
[ Comment ]
일단 for문 돌아가는 부분에서 사소한 부분으로 항상 실수하는 것 같다 이 부분은 꼭 고쳐야겠다..!
그리고 입출력의 예를 통해서 위처럼 제곱근이 있는 경우에만 약수가 홀수인 특성을 발견할 수 있듯이 입출력의 예를 통해서도 문제 풀이 힌트를 알 수 있으니 그냥 넘기지 말고 유심히 봐야겠다.