[Leetcode]860. Lemonade Change

๊น€์ง€์›ยท2022๋…„ 4์›” 7์ผ
0

๐Ÿ“„ Description

At a lemonade stand, each lemonade costs $5. Customers are standing in a queue to buy from you and order one at a time (in the order specified by bills). Each customer will only buy one lemonade and pay with either a $5, $10, or $20 bill. You must provide the correct change to each customer so that the net transaction is that the customer pays $5.

Note that you do not have any change in hand at first.

Given an integer array bills where bills[i] is the bill the ithi^{th} customer pays, return true if you can provide every customer with the correct change, or false otherwise.

Example 1:

Input: bills = [5,5,5,10,20]
Output: true
Explanation: 
From the first 3 customers, we collect three $5 bills in order.
From the fourth customer, we collect a $10 bill and give back a $5.
From the fifth customer, we give a $10 bill and a $5 bill.
Since all customers got correct change, we output true.

Example 2:

Input: bills = [5,5,10,10,20]
Output: false
Explanation: 
From the first two customers in order, we collect two $5 bills.
For the next two customers in order, we collect a $10 bill and give back a $5 bill.
For the last customer, we can not give the change of $15 back because we only have two $10 bills.
Since not every customer received the correct change, the answer is false.

Constraints:

  • 1 <= bills.length <= 105
  • bills[i] is either 5, 10, or 20.

๐Ÿ”จ My Solution

๋ฌธ์ œ ํ•ด๊ฒฐ ํฌ์ธํŠธ!

  • $20์„ ๋ฐ›์•˜์„ ๋•Œ ์ค„ ์ˆ˜ ์žˆ๋Š” ๊ฑฐ์Šค๋ฆ„๋ˆ ์ข…๋ฅ˜๊ฐ€ ๋‹ค์Œ ๋‘ ๊ฐ€์ง€์ด๋‹ค.
    1. $5 ํ•œ ๊ฐœ & $10 ํ•œ ๊ฐœ
    2. $5 ์„ธ ๊ฐœ
  • ์œ„ ๋‘ ๊ฐ€์ง€ ๋ฐฉ๋ฒ• ์ค‘ ์–ด๋–ค ๋ฐฉ๋ฒ•์„ ์„ ํƒํ•˜๋Š” ๊ฒƒ์ด ํšจ์œจ์ ์ธ๊ฐ€? ๋ฅผ ์ƒ๊ฐํ•ด๋ณผ ๊ฒƒ.

๐Ÿ’ป My Submission

class Solution:
    def lemonadeChange(self, bills: List[int]) -> bool:
        change=0
        bill_dict={5:0,
                   10:0}
        
        for i in range(len(bills)):
            
            if bills[i]==5:
                bill_dict[bills[i]]+=1
            
            elif bills[i]==10:
                if bill_dict[5]<1: return False
                bill_dict[bills[i]]+=1
                bill_dict[5]-=1
                
            elif bills[i]==20:
                # (5,10) or (5,5,5)
                if bill_dict[5]>0 and bill_dict[10]>0:
                    bill_dict[10]-=1
                    bill_dict[5]-=1
                elif bill_dict[5]>=3:
                    bill_dict[5]-=3
                else: return False
                
                
        return True

๐Ÿ’Š Clean Code

    def lemonadeChange(self, bills):
        five = ten = 0
        for i in bills:
            if i == 5: five += 1
            elif i == 10: five, ten = five - 1, ten + 1
            elif ten > 0: five, ten = five - 1, ten - 1
            else: five -= 3
            if five < 0: return False
        return True

๐Ÿ’ก What I learned

  • ์–ด๋–ค ์ž๋ฃŒ๊ตฌ์กฐ์— ๋‹ด์„์ง€ ์ž˜ ํŒ๋‹จํ•˜๊ธฐ
  • ์–ด๋–ป๊ฒŒ ํ•˜๋ฉด readable ํ•œ ์ฝ”๋“œ๊ฐ€ ๋  ์ˆ˜ ์žˆ์„์ง€ ๊ณ ๋ฏผํ•˜๊ธฐ
  • ์ค‘๋ณต๋˜๋Š” ์กฐ๊ฑด๋ฌธ์ด ์—†๋„๋ก ํ•˜๊ธฐ

References

profile
Make your lives Extraordinary!

0๊ฐœ์˜ ๋Œ“๊ธ€