목록 · 검토 대상 변경 원문(버그를 일부러 넣은 가상 코드)

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