문제
두 정수 left와 right가 매개변수로 주어집니다. left부터 right까지의 모든 수들 중에서, 약수의 개수가 짝수인 수는 더하고, 약수의 개수가 홀수인 수는 뺀 수를 return 하도록 solution 함수를 완성해주세요.
풀이
#include <string>
#include <vector>
#include <cmath>
using namespace std;
int solution(int left, int right) {
int answer = 0;
for(int i = left; i <= right; ++i)
{
int root = static_cast<int>(sqrt(i));
if(root * root == i)
{
answer -= i;
}
else
{
answer += i;
}
}
return answer;
}
풀이 방식
- sqrt(i) : 정수 i의 제곱근을 구해서 i가 제곱수인지 확인
Ex) sqrt(16) = 4 -> 4 X 4 = 16 제곱수 O
sqrt(10) = 3.-- -> 3 X 3 != 10 제곱수 X
- 제곱수인지 확인하는 이유 : 제곱수만 약수의 개수가 홀수이기 때문!!! (중복 발생)
- static_cast : sqrt(i)는 double이므로 int형으로 안전하게 형변환해 정수와 비교하기 위해 사용