[Easy] 860. Lemonade Change

문제

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 ith customer pays, return true if you can provide every customer with the correct change, or false otherwise.

 

레모네이드 판매대에서 레모네이드 한 개당 가격은 5달러입니다. 고객들은 한 번에 하나씩 주문하기 위해 줄을 서 있습니다. 각 고객은 레모네이드를 한 개만 구입하고 5달러, 10달러, 20달러 지폐로 지불합니다. 순거래가 고객이 5달러를 지불하도록 각 고객에게 올바른 거스름돈을 제공해야 합니다.

처음에는 수중에 변화가 없습니다.

청구서[i]가 고객이 지불하는 청구서인 정수 배열이 주어지면 모든 고객에게 올바른 거스름돈을 제공할 수 있으면 true를 반환하고, 그렇지 않으면 false를 반환합니다.

 

예시

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.

 

해결 과정

five와 ten 변수를 생성하여, 5달러와 10달러의 개수를 센다.

for문을 돌면서 bills 배열을 순회한다.

  • bill이 5라면 five 변수를 1 증가시킨다.
  • bill이 10이라면 ten 변수를 1 증가시키고 five를 1 감소시킨다. 이때 five가 0이라면 false를 return 한다.
  • bill이 20이라면 ten 1 five 1, five 3 두 가지의 경우의 수를 생각한다.
  • ten이 0 보다 크다면 첫번째 경우를 생각하고, 그렇지 않을 경우 두 번째 경우를 생각한다.

순회가 끝날 때까지 return false에 들지 않았다면 return true를 한다.

 

해결 코드

/**
 * @param {number[]} bills
 * @return {boolean}
 */
var lemonadeChange = function (bills) {
  let five =0, ten = 0;
    for (let bill of bills){
        if (bill === 5) five++;
        else if (bill === 10) {
            ten++;
            if (five === 0) return false;
            else five--;
        }else { // 20 bill;
            let change = 15;
            if (ten>0) {
                ten--;
                change -= 10;
            }
            while(change>0){
                five--;
                if(five<0) return false;
                change -= 5;
            }
        }
    }
    return true;
};

'leetCode' 카테고리의 다른 글

[Medium] 155. Min Stack  (0) 2022.07.27
[Medium] 1845. Seat Reservation Manager  (0) 2022.07.26
[Medium] 2. Add Two Numbers  (0) 2022.07.19
[Medium] 138. Copy List with Random Pointer  (0) 2022.07.19
[Medium] 143. Reorder List  (0) 2022.07.19