-
[ 프로그래머스 Lv. 1] 약수의 개수와 덧셈Algorithm 2023. 11. 6. 15:28
[ 문제 설명 ]
두 정수 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문 돌아가는 부분에서 사소한 부분으로 항상 실수하는 것 같다 이 부분은 꼭 고쳐야겠다..!
그리고 입출력의 예를 통해서 위처럼 제곱근이 있는 경우에만 약수가 홀수인 특성을 발견할 수 있듯이 입출력의 예를 통해서도 문제 풀이 힌트를 알 수 있으니 그냥 넘기지 말고 유심히 봐야겠다.
'Algorithm' 카테고리의 다른 글
[2023 KAKAO BLIND RECRUITMENT] 개인정보 수집 유효기간 (0) 2023.12.12 [ 프로그래머스 Lv. 2] 최댓값과 최솟값 (0) 2023.11.10 [프로그래머스 Lv. 1] 수박수박수박수박수박수? (0) 2023.10.31 [프로그래머스 Lv. 1] 가운데 글자 가져오기 (0) 2023.10.28 [프로그래머스 Lv. 1] 핸드폰 번호 가리기 (0) 2023.10.20