Отрабытывает корректно, но при проверке валидатор выдает сообщение о тайм-ауте. Пары с нулевым значениями из denominations удаляются, жадный алгоритм и алгоритм для выдачи имеющимися купюрами реализовал. Что еще нужно исправить?
Upd. Кажется, догадался. Не удается запустить CashMachine с параметрами в Run/Debug Configuration -> Program Arguments. А как это можно сделать, кроме, как прописать main-е соответствующие команды?
package com.javarush.task.task26.task2613;
import com.javarush.task.task26.task2613.exception.NotEnoughMoneyException;
import java.util.HashMap;
import java.util.Iterator;
import java.util.Map;
import java.util.TreeMap;
public class test {
public static void main(String[] args) throws NotEnoughMoneyException {
Map<Integer, Integer> denominations = new HashMap<>();
{
denominations.put(500, 3);
denominations.put(200, 4);
//denominations.put(100, 1);
//denominations.put(50, 12);
}
int expectedAmount = Integer.parseInt(args[0]);
Map<Integer, Integer> amount = new HashMap<>();
TreeMap<Integer, Integer> atm = new TreeMap<>(denominations);
// жадный алгоритм
int sum = 0;
for (Map.Entry<Integer, Integer> entry : atm.descendingMap().entrySet()) {
int cur = entry.getKey();
int number = entry.getValue();
while (number > 0) {
if (sum + cur > expectedAmount)
break;
sum += cur;
atm.put(cur, --number);
if (amount.containsKey(cur)) {
int n = amount.get(cur) + 1;
amount.put(cur, n);
} else amount.put(cur, 1);
}
if (sum == expectedAmount)
break;
}
// пробуем набрать имеющимися в банкомате купюрами
if (sum != expectedAmount) {
sum = 0;
amount = new HashMap<>();
atm = new TreeMap<>(denominations);
for (Map.Entry<Integer, Integer> entry : atm.descendingMap().entrySet()) {
int key = entry.getKey();
int value = entry.getValue();
if (expectedAmount % key == 0) {
int number = expectedAmount / key;
if (number <= value) {
sum = key * number;
amount.put(key, number);
atm.put(key, value - number);
break;
}
}
}
if (sum == 0)
throw new NotEnoughMoneyException();
}
for (Iterator<Map.Entry<Integer, Integer>> it = atm.entrySet().iterator(); it.hasNext();) {
if (it.next().getValue() == 0)
it.remove();
}
denominations = atm;
System.out.println("В банкомате осталось:");
for (Map.Entry<Integer, Integer> pair : denominations.entrySet())
System.out.println(pair.getKey() + "-" + pair.getValue());
System.out.println("_______________________________________");
System.out.println("Выдано:");
for (Map.Entry<Integer, Integer> pair : amount.entrySet())
System.out.println(pair.getKey() + "-" + pair.getValue());
}
}