count the number of minimum squares to represent a number minimumsquarestorepresentanumber25 1 minimumsquarestorepresentanumber37 2 minimumsquarestorepresentanumber21 3 minimumsquarestorepresentanumber58 2 minimumsquarestorepresentanumber1 traceback most recent call last valueerror the value of input must not be a negative number minimumsquarestorepresentanumber0 1 minimumsquarestorepresentanumber12 34 traceback most recent call last valueerror the value of input must be a natural number count the number of minimum squares to represent a number minimum_squares_to_represent_a_number 25 1 minimum_squares_to_represent_a_number 37 2 minimum_squares_to_represent_a_number 21 3 minimum_squares_to_represent_a_number 58 2 minimum_squares_to_represent_a_number 1 traceback most recent call last valueerror the value of input must not be a negative number minimum_squares_to_represent_a_number 0 1 minimum_squares_to_represent_a_number 12 34 traceback most recent call last valueerror the value of input must be a natural number
import math
import sys


def minimum_squares_to_represent_a_number(number: int) -> int:
    
    if number != int(number):
        raise ValueError("the value of input must be a natural number")
    if number < 0:
        raise ValueError("the value of input must not be a negative number")
    if number == 0:
        return 1
    answers = [-1] * (number + 1)
    answers[0] = 0
    for i in range(1, number + 1):
        answer = sys.maxsize
        root = int(math.sqrt(i))
        for j in range(1, root + 1):
            current_answer = 1 + answers[i - (j**2)]
            answer = min(answer, current_answer)
        answers[i] = answer
    return answers[number]


if __name__ == "__main__":
    import doctest

    doctest.testmod()