diff --git a/greedy_methods/minimum_coin_change.py b/greedy_methods/minimum_coin_change.py index db2c381bc84a..6bf895d964be 100644 --- a/greedy_methods/minimum_coin_change.py +++ b/greedy_methods/minimum_coin_change.py @@ -1,3 +1,6 @@ +import sys +from doctest import testmod + """ Test cases: Do you want to enter your denominations ? (Y/N) :N @@ -41,10 +44,16 @@ """ -def find_minimum_change(denominations: list[int], value: str) -> list[int]: +def find_minimum_change(denominations: list[int], value: int) -> list[int]: """ - Find the minimum change from the given denominations and value - >>> find_minimum_change([1, 5, 10, 20, 50, 100, 200, 500, 1000,2000], 18745) + Find the minimum change from the given denominations and value. + Args: + denominations (list[int]): List of available denominations. + value (int): The amount of money to be changed. + Returns: + list[int]: List of denominations representing the minimal change. + Examples: + >>> find_minimum_change([1, 5, 10, 20, 50, 100, 200, 500, 1000, 2000], 18745) [2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 500, 200, 20, 20, 5] >>> find_minimum_change([1, 2, 5, 10, 20, 50, 100, 500, 2000], 987) [500, 100, 100, 100, 100, 50, 20, 10, 5, 2] @@ -55,46 +64,53 @@ def find_minimum_change(denominations: list[int], value: str) -> list[int]: >>> find_minimum_change([1, 5, 100, 500, 1000], 456) [100, 100, 100, 100, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 1] """ - total_value = int(value) - + # Sort denominations in descending order (biggest first) + denominations.sort(reverse=True) # Initialize Result answer = [] - - # Traverse through all denomination - for denomination in reversed(denominations): - # Find denominations - while int(total_value) >= int(denomination): - total_value -= int(denomination) - answer.append(denomination) # Append the "answers" array - + # Find minimal change using largest denominations first + for denomination in denominations: + while value >= denomination: + value -= denomination + answer.append(denomination) return answer # Driver Code if __name__ == "__main__": + # Run doctest + testmod() denominations = [] - value = "0" - + value = 0 if ( - input("Do you want to enter your denominations ? (yY/n): ").strip().lower() + input("Do you want to enter your denominations ? (y/n): ").strip().lower() == "y" ): - n = int(input("Enter the number of denominations you want to add: ").strip()) - - for i in range(n): - denominations.append(int(input(f"Denomination {i}: ").strip())) - value = input("Enter the change you want to make in Indian Currency: ").strip() + try: + n = int( + input("Enter the number of denominations you want to add: ").strip() + ) + for i in range(n): + denominations.append(int(input(f"Denomination {i + 1}: ").strip())) + value = int( + input("Enter the change you want to make in Indian Currency: ").strip() + ) + except ValueError: + print("Invalid input. Please enter valid numbers.") + sys.exit(1) else: - # All denominations of Indian Currency if user does not enter + # Default denominations for Indian Currency denominations = [1, 2, 5, 10, 20, 50, 100, 500, 2000] - value = input("Enter the change you want to make: ").strip() - - if int(value) == 0 or int(value) < 0: + try: + value = int(input("Enter the change you want to make: ").strip()) + except ValueError: + print("Invalid input. Please enter a valid number.") + sys.exit(1) + # Ensure denominations are sorted in descending order + denominations.sort(reverse=True) + if value <= 0: print("The total value cannot be zero or negative.") - else: print(f"Following is minimal change for {value}: ") answer = find_minimum_change(denominations, value) - # Print result - for i in range(len(answer)): - print(answer[i], end=" ") + print(" ".join(map(str, answer))) # Optimized printing format