목록 · 검토 대상 변경 원문(버그를 일부러 넣은 가상 코드)
diff --git a/points.py b/points.py
index 76fe848..4a7c16f 100644
--- a/points.py
+++ b/points.py
@@ -3,22 +3,41 @@
규칙(사장님 메모):
- 결제 금액의 5%를 포인트로 적립한다(1포인트 = 1원, 소수점 버림).
- 적립한 날을 1일째로 쳐서 365일째 되는 날까지 쓸 수 있다.
+- 생일 당일 결제는 2배(10%) 적립.
+- 한 사람이 하루에 적립할 수 있는 포인트는 최대 5,000.
+- 포인트를 쓸 때는 오래된 적립분부터 차감한다.
"""
from datetime import date
POINT_RATE = 0.05
EXPIRE_DAYS = 365
+DAILY_CAP = 5000
class Wallet:
- def __init__(self, name):
+ """손님 한 명의 포인트 지갑."""
+
+ def __init__(self, name, birthday=None):
self.name = name
+ self.birthday = birthday
+ self.rate = POINT_RATE
self.entries = [] # [적립일, 남은 포인트]
+ def _is_birthday(self, today):
+ return (
+ self.birthday is not None
+ and (today.month, today.day) == (self.birthday.month, self.birthday.day)
+ )
+
def earn(self, amount, today):
- pts = int(amount * POINT_RATE)
- self.entries.append([today, pts])
- return pts
+ """결제 금액만큼 포인트를 쌓고, 쌓인 포인트를 돌려준다."""
+ if self._is_birthday(today):
+ self.rate = self.rate * 2
+ points = int(amount * self.rate)
+ earned_today = sum(p for d, p in self.entries if d == today)
+ points = min(points, DAILY_CAP - earned_today)
+ self.entries.append([today, points])
+ return points
def balance(self, today):
total = 0
@@ -26,3 +45,16 @@ class Wallet:
if (today - d).days < EXPIRE_DAYS - 1:
total += p
return total
+
+ def use(self, points, today):
+ """포인트를 쓴다. 오래된 적립분부터 깎는다."""
+ if points > self.balance(today):
+ raise ValueError("포인트가 부족합니다")
+ left = points
+ for entry in sorted(self.entries, key=lambda e: e[0]):
+ if left == 0:
+ break
+ take = min(entry[1], left)
+ entry[1] -= take
+ left -= take
+ return points