레모네이드 상점에서 레모네이드를 5달러에 판매한다고 한다.
손님은 줄을 서서 레모네이드를 구매하는데 한번에 한잔씩만 구매하는 상황이다.
손님은 레모네이드 가격 지불로 5, 10 ,20 달러중 하나로 지불하게 되고 레모네이드 상점은 손님이 지불한 가격에 맞춰 알맞은 거스름돈을 돌려줘야한다.
현재 레모네이드 상점은 거스름돈을 하나도 가지고 있지 않고, 손님이 지불하기 위해 준 지폐를 거스름돈으로 이용하는 상황이다.
손님들의 거스름돈을 모두 올바르게 줄 수 있다면 true , 아니라면 false를 리턴하는 문제이다.
Example을 보자
const lemonadeChange = function (bills) {
let change = {
5: 0,
10: 0,
20: 0,
};
for (let i = 0; i < bills.length; i++) {
if (bills[i] === 5) {
change[bills[i]]++;
} else if (bills[i] === 10) {
if (change["5"] === 0) return false;
change["5"]--;
change["10"]++;
} else if (bills[i] === 20) {
if (change["10"] >= 1 && change["5"] >= 1) {
change["10"] -= 1;
change["5"] -= 1;
} else if (change["5"] >= 3) {
change["5"] -= 3;
} else {
return false;
}
}
}
return true;
};
먼저 현재 상점에는 거스름돈이 없으므로 change라는 객체에 5, 10, 20달러의 수를 0으로 초기화 해주었다.
그 다음 bills 배열을 순회하면서 거스름돈을 줄 수 있는지 체크를 한다.
크게 처음에는 3가지 상황이 발생하는데 손님이 5달러를 지불한경우, 10달러를 지불한 경우, 20달러를 지불한 경우이다.
5달러를 지불한 경우는 거스름돈을 줄 필요가 없으므로 change['5']의 값을 1증가 시켜준다.
10달러를 지불한 경우에는 한가지 경우를 더 체크를 해야하는데
만약 change['5']의 값이 0이라면 거스름돈을 줄 수 없으므로 바로 false를 리턴해준다
20달러를 지불한 경우에는 두가지 경우를 체크해야한다
1. change['10'] >=1 이고 change['5'] >= 1 인 경우 거스름돈을 줄 수 있으므로
change['10']과 change['5']의 값을 1씩 빼준다.
2. change['5'] >= 3 인 경우 거스름돈을 줄 수 있으므로 change['5']의 값을 3 빼준다.
만약 for문을 끝까지 순회한다면 모든 손님에게 거스름돈을 줄 수 있는 것이므로 true를 리턴해주면 된다.
submit을 해보니
정답이었다!