Untitled

 avatar
unknown
plain_text
5 months ago
2.1 kB
3
Indexable
import java.util.*;

/**
 * Банкомат.
 * Инициализируется набором купюр и умеет выдавать купюры для заданной суммы, либо отвечать отказом.
 * При выдаче купюры списываются с баланса банкомата.
 * Допустимые номиналы: 50₽, 100₽, 500₽, 1000₽, 5000₽.
 */

class ATM {
    private Map<Integer, Integer> availableCash = new HashMap<>(Map.of(
            50, 0,
            100, 0,
            500, 0,
            1000, 0,
            5000, 0
    ));
    private Integer sumOfCash = 0;

    public void minusCash(Integer sum, List<Integer> result) {
        sumOfCash -= sum;
        result.forEach(cash -> availableCash.put(cash, availableCash.get(cash) - 1));
    }

    public void reloadATMMoney(Map<Integer, Integer> reloadedMoney) {
        availableCash.putAll(reloadedMoney);
        reloadedMoney.forEach((key, value) -> sumOfCash += value * key);
    }

    public List<Integer> getCash(Integer sum) {
        Integer initialSum = sum;
        if (sumOfCash < sum) {
            throw new IllegalArgumentException("В банкомате недостаточно денег");
        }

        List<Integer> result = new ArrayList<>();
        for (Map.Entry<Integer, Integer> entry : availableCash.entrySet()) {
            while (sum >= entry.getKey() && entry.getValue() > 0) {
                result.add(entry.getKey());
                sum -= entry.getKey();
            }
        }

        if (sum > 0) {
            throw new IllegalArgumentException("Введена неправильная сумма денег");
        }

        minusCash(initialSum, result);
        return result;
    }

    public static void main(String[] args) {
        ATM atm = new ATM();

        atm.reloadATMMoney(
                Map.of(
                        50, 2,
                        100, 2,
                        500, 4,
                        1000, 5,
                        5000, 6
                )
        );
        System.out.println(atm.getCash(2000));
    }
}
Editor is loading...
Leave a Comment