-
#AIL_23.12.10 // Programmers_약수의 개수와 덧셈AIL( Algorithm I Learned) 2023. 12. 10. 18:06
## AIL_ 약수의 개수와 덧셈
*** 문제 설명
두 정수 left와 right가 매개변수로 주어집니다. left부터 right까지의 모든 수들 중에서, 약수의 개수가 짝수인 수는 더하고, 약수의 개수가 홀수인 수는 뺀 수를 return 하도록 solution 함수를 완성해주세요.
*** 제한사항
1 ≤ left ≤ right ≤ 1,000
*** 입출력 예
left right result 13 17 43 24 27 52
*** 입출력 예 설명
** 입출력 예 #1_다음 표는 13부터 17까지의 수들의 약수를 모두 나타낸 것입니다.
수 약수 약수의 갯수 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
** 입출력 예 #2_다음 표는 24부터 27까지의 수들의 약수를 모두 나타낸 것입니다.
수 약수 약수의 개수 24 1, 2, 3, 4, 6, 8, 12, 24 8 25 1, 5, 25 3 26 1, 2, 13, 26 4 27 1, 3, 9, 27 4
## solution.JavaScript
1. 문제의 접근 방식
주어진 문제는 각 숫자의 약수 개수를 구하고, 그 개수에 따라 덧셈 또는 뺄셈을 수행하는 방식으로 해결할 수 있습니다.
2. 문제풀이
function solution(left, right) { var answer = 0; for (let num = left; num <= right; num++) { let divisorCount = 0; // 각 숫자의 약수 개수를 구하는 부분 for (let i = 1; i <= num; i++) { if (num % i === 0) { divisorCount++; } } // 약수 개수가 짝수인 경우 덧셈, 홀수인 경우 뺄셈을 수행 answer += (divisorCount % 2 === 0) ? +num : -num; } return answer; } /* 테스트 1 입력값 〉 13, 17 기댓값 〉 43 실행 결과 〉 테스트를 통과하였습니다. 테스트 2 입력값 〉 24, 27 기댓값 〉 52 실행 결과 〉 테스트를 통과하였습니다. */
1. `solution` 함수 선언을 통해 `left`와 `right` 두개의 매개 변수를 받고, 함수 내부에서는 결과를 누적할 변수인 `answer`를 0으로 초기화 합니다.
function solution(left, right) { var answer = 0;
2. `for` 외부 반복문을 통해 `left`부터 `right`까지의 각 숫자 (`num`)를 반복합니다. 각 숫자에 대해 현재 `num`에 대한 약수의 개수를 세는데 사용할 변수 `divisorCount`가 0으로 초기화됩니다.
for (let num = left; num <= right; num++) { let divisorCount = 0;
3. `for` 내부 반복문을 통해 약수의 개수를 셉니다. 1부터 현재 숫자 `num`까지 반복하고, 각 반복에서 `num`이 `i`로 나누어 떨어지면 (`num % i === 0 `), `divisorCount` 가 증가합니다. 내부 반복문은 현재 `num`에 대한 약수의 개수를 세는 역할을 합니다.
for (let i = 1; i <= num; i++) { if (num % i === 0) { divisorCount++; } }
4. 삼항연산자 조건부 덧셈/뺄셈을 통해, 현재 `num`에 대한 약수 개수를 센 후, 해당 약수의 개수가 짝수인지 홀수인지 확인합니다. 만약 짝수라면 현재 `num`을 `answer`에 더하고, 홀수라면 `anwser`에서 현재 `num`을 뺍니다.
answer += (divisorCount % 2 === 0) ? +num : -num; }
5. 마지막으로 누적된 `answer`를 반환합니다.
return answer; }
3. 다른사람의 문제풀이 및 접근방식 분석
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; } /* 테스트 1 입력값 〉 13, 17 기댓값 〉 43 실행 결과 〉 테스트를 통과하였습니다. 테스트 2 입력값 〉 24, 27 기댓값 〉 52 실행 결과 〉 테스트를 통과하였습니다. */
1. `anser` 변수를 0으로 초기화합니다. 이 변수는 최종 결과에 누적됩니다.
function solution(left, right) { var answer = 0;
2. `for` 반복문을 통해 숫자를 순회합니다. `left`부터 `right`까지의 범위까지 반복문을 돌며 각 숫자 `i`에 대해 아래와 같이 작업을 수행합니다.
for (let i = left; i <= right; i++) {
3. `if (Number.isInteger(Math.sqrt(i)))` 부분은 현재 숫자 `i`의 제곱근이 정수인지 확인하는 조건문입니다. 여기서 `Math.sqrt(i)`는 숫자 `i`의 제곱근을 계산하고, `Number.isInteger()`는 주어진 값이 정수인지 여부를 판별하는 함수입니다. => 이 조건문은 주어진 숫자 `i`의 제곱근이 정수인 경우와 아닌 경우를 구분하여 덧셈과 뺄셈을 수행합니다.
if (Number.isInteger(Math.sqrt(i))) { answer -= i; } else { answer += i; } }
4. 마지막으로 누적된 `answer`를 반환합니다
return answer; }
# Number.isInteger() 메서드란?
주어진 값이 정수인지 여부를 확인하는 메서드로, 정수이면 `true`를 반환하고, 아니라면 `false`를 반환합니다.
# Number.isInteger() 사용방법
Number.isInteger(value);
# Number.isInteger() 장단점
** 장점
명시적으로 정수 여부를 확인할 수 있어 정확한 판별이 가능합니다. `isInteger`는 정수 여부만을 확인하므로 소수점 이하 등에 영향을 받지 않습니다.
** 단점
`Number.isInteger(NaN)` 과 같이 정의되지 않은 값에 대해서도 `false`를 반환하므로 주의가 필요합니다.
# Number.isInteger() 사용시기
** 활용시기
주어진 값이 정수인지 여부를 명확하게 확인해야 할 때 사용됩니다. 부동소수점 수에 영향받지 않고 정확한 정수 여부를 판단할 수 있습니다.
** 사례
숫자가 정수인 경우에만 특정 로직을 수행해야 할 때, 반복문에서 정수를 다룰 때 정확한 조건을 검사할 때.
** 주의사항
Number.isInteger(NaN)와 같이 정의되지 않은 값에 대해서도 false를 반환하므로 주의가 필요합니다. 부동소수점 연산의 정확도에 의해 영향을 받지 않는다면 활용이 용이합니다.
# Math.sqrt() 메서드란?
주어진 숫자의 제곱근을 반환하는 함수로, 양의 실수가 아닌 음수를 인자로 받으면 `NaN`을 반환합니다.
# Math.sqrt() 사용방법
Math.sqrt(value);
# Math.sqrt() 장단점
** 장점
숫자의 제곱근을 쉽게 구할 수 있습니다.
** 단점
음수를 인자로 주면 `NaN`을 반환하므로 주의가 필요하며 부동소수점 연산에서 발생하는 반올림 등의 오차에 영향을 받을 수 있습니다.
# Math.sqrt() 사용시기
** 활용시기
주어진 숫자의 제곱근을 구해야 할 때 사용됩니다.특히, 약수 개수가 홀수인지 짝수인지를 판단하는데 활용됩니다.
** 사례
약수의 개수, 소인수분해 등 수학적 계산에 사용될 때, 특정 숫자에 대한 제곱근을 비교하여 판단해야 할 때.
** 주의사항
음수에 대한 처리를 고려해야 합니다. 음수에 대한 Math.sqrt()는 NaN을 반환합니다. 부동소수점 연산의 정확도에 영향을 받을 수 있으므로 주의가 필요합니다.
'AIL( Algorithm I Learned)' 카테고리의 다른 글
#AIL_23.12.12 // Programmers_문자열 다루기 기본 (0) 2023.12.12 #AIL_23.12.11 // Programmers_문자열 내림차순으로 배치하기 (1) 2023.12.11 #AIL_23.12.08 // Programmers_수박수박수박수박수박수? (1) 2023.12.08 #AIL_23.12.07 // Programmers_가운데 글자 가져오기 (0) 2023.12.07 #AIL_23.12.06 // Programmers_하노이의 탑 (1) 2023.12.06