diff --git a/cs/lemonade-change.cs b/cs/lemonade-change.cs new file mode 100644 index 0000000..51e64c6 --- /dev/null +++ b/cs/lemonade-change.cs @@ -0,0 +1,51 @@ +public class Solution { + private enum Bill { + FIVE, + TEN, + TWENTY + } + + private static Bill FromNumeric(int bill) => bill switch { + 5 => Bill.FIVE, + 10 => Bill.TEN, + 20 => Bill.TWENTY, + _ => throw new ArgumentOutOfRangeException(nameof(bill), "Invalid bill"), + }; + + public bool LemonadeChange(int[] bills) { + var counters = new Dictionary { + { Bill.FIVE, 0 }, + { Bill.TEN, 0 }, + { Bill.TWENTY, 0 } + }; + + foreach (var numericBill in bills) { + var bill = FromNumeric(numericBill); + ++counters[bill]; + + switch (bill) { + case Bill.FIVE: + /* no-op */ + break; + case Bill.TEN: + if (counters[Bill.FIVE] <= 0) { + return false; + } + --counters[Bill.FIVE]; + break; + case Bill.TWENTY: + if (counters[Bill.TEN] > 0 && counters[Bill.FIVE] > 0) { + --counters[Bill.FIVE]; + --counters[Bill.TEN]; + } else if (counters[Bill.FIVE] >= 3) { + counters[Bill.FIVE] -= 3; + } else { + return false; + } + break; + } + } + + return true; + } +}