약수의 개수와 덧셈

김재혁·2025년 4월 22일

문제

두 정수 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형으로 안전하게 형변환해 정수와 비교하기 위해 사용

0개의 댓글