From 4a5733d5e97b05bb1677ac1edfd3a479d5c434a6 Mon Sep 17 00:00:00 2001 From: sttuffe Date: Sat, 10 Jan 2026 13:24:34 +0900 Subject: [PATCH 01/16] =?UTF-8?q?docs:=20readme=20=EC=B4=88=EC=95=88=20?= =?UTF-8?q?=EC=9E=91=EC=84=B1?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- README.md | 37 +++++++++++++++++++ .../controller/LottoController.java | 4 ++ 2 files changed, 41 insertions(+) create mode 100644 src/main/java/planetlotto/controller/LottoController.java diff --git a/README.md b/README.md index 8a4f22ed0..5bc9a9f84 100644 --- a/README.md +++ b/README.md @@ -1 +1,38 @@ # java-planetlotto-precourse + +# 개요 + +# 구현 기능 목록 + +## 입력 +### 구입 금앱 입력 +- [ ] 안내 메세지 출력 후, 사용자 입력 받음 +- [ ] 입력 유효성 검사 + +### 당첨 번호 입력 +- [ ] 안내 메세지 출력 후, 사용자 입력 받음 +- [ ] 입력 유효성 검사 + +### 보너스 번호 입력 +- [ ] 안내 메세지 출력 후, 사용자 입력 받음 +- [ ] 입력 유효성 검사 + +## 출력 + +### 발행된 로또 결과 출력 + +### 추첨 결과 출력 + + +## 비즈니스 로직 + +### 로또 발행 +- [ ] 발행할 로또 수량 계산 +- [ ] 수량만큼 로또 발행 + - [ ] 1~30 범위의 중복되지 않는 랜덤한 5개의 수 추출 + - [ ] 로또 번호와 중복되지않는 보너스 번호 1개 추출 + +### 로또 추첨 +- [ ] 발행된 로또들을 당첨 규칙에 따라 등수 판별 +- [ ] 당첨된 로또들의 당첨 금액을 집계 + diff --git a/src/main/java/planetlotto/controller/LottoController.java b/src/main/java/planetlotto/controller/LottoController.java new file mode 100644 index 000000000..c61dbbc0c --- /dev/null +++ b/src/main/java/planetlotto/controller/LottoController.java @@ -0,0 +1,4 @@ +package planetlotto.controller; + +public class LottoController { +} From 359400e5165605b6cb9baa12461d186885950615 Mon Sep 17 00:00:00 2001 From: sttuffe Date: Sat, 10 Jan 2026 13:41:40 +0900 Subject: [PATCH 02/16] =?UTF-8?q?feat:=20=EC=95=88=EB=82=B4=EB=A9=94?= =?UTF-8?q?=EC=84=B8=EC=A7=80=20=EC=B6=9C=EB=A0=A5=20=ED=9B=84=20=EA=B5=AC?= =?UTF-8?q?=EC=9E=85=EA=B8=88=EC=95=A1=20=EC=9E=85=EB=A0=A5=EB=B0=9B?= =?UTF-8?q?=EB=8A=94=20=EA=B8=B0=EB=8A=A5=20=EC=B6=94=EA=B0=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- README.md | 16 ++++++++++++---- src/main/java/planetlotto/Application.java | 6 +++++- .../controller/LottoController.java | 9 +++++++++ src/main/java/planetlotto/domain/Amount.java | 18 ++++++++++++++++++ src/main/java/planetlotto/domain/Lotto.java | 6 ++++++ .../java/planetlotto/service/IssueService.java | 4 ++++ src/main/java/planetlotto/view/InputView.java | 1 + .../java/planetlotto/domain/AmountTest.java | 10 ++++++++++ 8 files changed, 65 insertions(+), 5 deletions(-) create mode 100644 src/main/java/planetlotto/domain/Amount.java create mode 100644 src/main/java/planetlotto/domain/Lotto.java create mode 100644 src/main/java/planetlotto/service/IssueService.java create mode 100644 src/test/java/planetlotto/domain/AmountTest.java diff --git a/README.md b/README.md index 5bc9a9f84..f011c5f4d 100644 --- a/README.md +++ b/README.md @@ -5,15 +5,22 @@ # 구현 기능 목록 ## 입력 + ### 구입 금앱 입력 -- [ ] 안내 메세지 출력 후, 사용자 입력 받음 + +- [x] 안내 메세지 출력 후, 사용자 입력 받음 - [ ] 입력 유효성 검사 + - [ ] 입력이 숫자가 아닌경우 예외처리 + - [ ] 입력이 양의 정수가 아닌 경우 예외처리 + - [ ] 금액이 500원으로 나누어 떨어지지 않으면 예외처리 ### 당첨 번호 입력 + - [ ] 안내 메세지 출력 후, 사용자 입력 받음 - [ ] 입력 유효성 검사 ### 보너스 번호 입력 + - [ ] 안내 메세지 출력 후, 사용자 입력 받음 - [ ] 입력 유효성 검사 @@ -23,16 +30,17 @@ ### 추첨 결과 출력 - ## 비즈니스 로직 ### 로또 발행 + - [ ] 발행할 로또 수량 계산 - [ ] 수량만큼 로또 발행 - - [ ] 1~30 범위의 중복되지 않는 랜덤한 5개의 수 추출 - - [ ] 로또 번호와 중복되지않는 보너스 번호 1개 추출 +- [ ] 1~30 범위의 중복되지 않는 랜덤한 5개의 수 추출 +- [ ] 로또 번호와 중복되지않는 보너스 번호 1개 추출 ### 로또 추첨 + - [ ] 발행된 로또들을 당첨 규칙에 따라 등수 판별 - [ ] 당첨된 로또들의 당첨 금액을 집계 diff --git a/src/main/java/planetlotto/Application.java b/src/main/java/planetlotto/Application.java index 27d0a8f96..769a38778 100644 --- a/src/main/java/planetlotto/Application.java +++ b/src/main/java/planetlotto/Application.java @@ -1,7 +1,11 @@ package planetlotto; +import planetlotto.controller.LottoController; + public class Application { public static void main(String[] args) { - // TODO: 프로그램 구현 + LottoController controller = new LottoController(); + + controller.run(); } } diff --git a/src/main/java/planetlotto/controller/LottoController.java b/src/main/java/planetlotto/controller/LottoController.java index c61dbbc0c..e091fc1a3 100644 --- a/src/main/java/planetlotto/controller/LottoController.java +++ b/src/main/java/planetlotto/controller/LottoController.java @@ -1,4 +1,13 @@ package planetlotto.controller; +import planetlotto.view.InputView; + public class LottoController { + public LottoController() { + } + + public void run() { + int amount = InputView.askAmount(); + + } } diff --git a/src/main/java/planetlotto/domain/Amount.java b/src/main/java/planetlotto/domain/Amount.java new file mode 100644 index 000000000..25ca0de71 --- /dev/null +++ b/src/main/java/planetlotto/domain/Amount.java @@ -0,0 +1,18 @@ +package planetlotto.domain; + +public class Amount { + private final int amount; + + private Amount(int amount) { + validateAmount(amount); + this.amount = amount; + } + + public static Amount of(int amount) { + return new Amount(amount); + } + + private void validateAmount(int amount) { + + } +} diff --git a/src/main/java/planetlotto/domain/Lotto.java b/src/main/java/planetlotto/domain/Lotto.java new file mode 100644 index 000000000..7a7f50fd0 --- /dev/null +++ b/src/main/java/planetlotto/domain/Lotto.java @@ -0,0 +1,6 @@ +package planetlotto.domain; + +public class Lotto { + + +} diff --git a/src/main/java/planetlotto/service/IssueService.java b/src/main/java/planetlotto/service/IssueService.java new file mode 100644 index 000000000..7fa4fbd72 --- /dev/null +++ b/src/main/java/planetlotto/service/IssueService.java @@ -0,0 +1,4 @@ +package planetlotto.service; + +public class IssueService { +} diff --git a/src/main/java/planetlotto/view/InputView.java b/src/main/java/planetlotto/view/InputView.java index c1eb55343..7158d76de 100644 --- a/src/main/java/planetlotto/view/InputView.java +++ b/src/main/java/planetlotto/view/InputView.java @@ -39,4 +39,5 @@ public static int askBonusNumber() { throw new IllegalArgumentException("보너스 번호는 숫자여야 합니다."); } } + } diff --git a/src/test/java/planetlotto/domain/AmountTest.java b/src/test/java/planetlotto/domain/AmountTest.java new file mode 100644 index 000000000..9f3596dee --- /dev/null +++ b/src/test/java/planetlotto/domain/AmountTest.java @@ -0,0 +1,10 @@ +package planetlotto.domain; + +import org.junit.jupiter.api.Test; + +public class AmountTest { + @Test + void 구입금액을_정상적으로_입력하면_객체정상생성() { + + } +} From aa55d3f7bd5ce97eb81a9109f883da324040a608 Mon Sep 17 00:00:00 2001 From: sttuffe Date: Sat, 10 Jan 2026 13:48:49 +0900 Subject: [PATCH 03/16] =?UTF-8?q?feat:=20=EA=B5=AC=EC=9E=85=20=EA=B8=88?= =?UTF-8?q?=EC=95=A1=EC=97=90=20=EB=8C=80=ED=95=9C=20=EC=9C=A0=ED=9A=A8?= =?UTF-8?q?=EC=84=B1=20=EA=B2=80=EC=82=AC=20=EC=B6=94=EA=B0=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- README.md | 8 ++++---- .../planetlotto/controller/LottoController.java | 1 - src/main/java/planetlotto/domain/Amount.java | 10 ++++++++++ src/test/java/planetlotto/domain/AmountTest.java | 15 +++++++++++++++ 4 files changed, 29 insertions(+), 5 deletions(-) diff --git a/README.md b/README.md index f011c5f4d..902c1db75 100644 --- a/README.md +++ b/README.md @@ -9,10 +9,10 @@ ### 구입 금앱 입력 - [x] 안내 메세지 출력 후, 사용자 입력 받음 -- [ ] 입력 유효성 검사 - - [ ] 입력이 숫자가 아닌경우 예외처리 - - [ ] 입력이 양의 정수가 아닌 경우 예외처리 - - [ ] 금액이 500원으로 나누어 떨어지지 않으면 예외처리 +- [x] 입력 유효성 검사 + - [x] 입력이 숫자가 아닌경우 예외처리 + - [x] 입력이 양의 정수가 아닌 경우 예외처리 + - [x] !금액이 500원으로 나누어 떨어지지 않으면 예외처리 ### 당첨 번호 입력 diff --git a/src/main/java/planetlotto/controller/LottoController.java b/src/main/java/planetlotto/controller/LottoController.java index e091fc1a3..22ef8f72c 100644 --- a/src/main/java/planetlotto/controller/LottoController.java +++ b/src/main/java/planetlotto/controller/LottoController.java @@ -8,6 +8,5 @@ public LottoController() { public void run() { int amount = InputView.askAmount(); - } } diff --git a/src/main/java/planetlotto/domain/Amount.java b/src/main/java/planetlotto/domain/Amount.java index 25ca0de71..15c753a63 100644 --- a/src/main/java/planetlotto/domain/Amount.java +++ b/src/main/java/planetlotto/domain/Amount.java @@ -12,7 +12,17 @@ public static Amount of(int amount) { return new Amount(amount); } + public int getAmount() { + return amount; + } + private void validateAmount(int amount) { + if (amount <= 0) { + throw new IllegalArgumentException(); + } + if (amount % 500 != 0) { + throw new IllegalArgumentException(); + } } } diff --git a/src/test/java/planetlotto/domain/AmountTest.java b/src/test/java/planetlotto/domain/AmountTest.java index 9f3596dee..bc3a8c416 100644 --- a/src/test/java/planetlotto/domain/AmountTest.java +++ b/src/test/java/planetlotto/domain/AmountTest.java @@ -1,10 +1,25 @@ package planetlotto.domain; +import org.assertj.core.api.Assertions; import org.junit.jupiter.api.Test; public class AmountTest { @Test void 구입금액을_정상적으로_입력하면_객체정상생성() { + String input = "1000"; + + Amount amount = Amount.of(Integer.parseInt(input)); + + Assertions.assertThat(amount.getAmount()) + .isEqualTo(1000); + } + + @Test + void 구입금액이_로또가격으로_나누어떨어지지않으면_예외처리() { + String input = "1100"; + + Assertions.assertThatThrownBy(() -> Amount.of(Integer.parseInt(input))) + .hasMessage("[ERROR] "); } } From f5143dbaeb2379fedd37ebc6c60b4dc07487be4f Mon Sep 17 00:00:00 2001 From: sttuffe Date: Sat, 10 Jan 2026 13:55:41 +0900 Subject: [PATCH 04/16] =?UTF-8?q?feat:=20=EC=9E=98=EB=AA=BB=EB=90=9C=20?= =?UTF-8?q?=EA=B0=92=EC=9D=84=20=EC=9E=85=EB=A0=A5=ED=95=A0=20=EA=B2=BD?= =?UTF-8?q?=EC=9A=B0=20=ED=95=B4=EB=8B=B9=EB=B6=80=EB=B6=84=EB=B6=80?= =?UTF-8?q?=ED=84=B0=20=EC=9E=AC=EC=9E=85=EB=A0=A5=20=EB=B0=9B=EB=8A=94=20?= =?UTF-8?q?=EA=B8=B0=EB=8A=A5=20=EC=B6=94=EA=B0=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/main/java/planetlotto/Application.java | 4 +- .../controller/LottoController.java | 40 ++++++++++++++++++- src/main/java/planetlotto/domain/Lottos.java | 4 ++ 3 files changed, 45 insertions(+), 3 deletions(-) create mode 100644 src/main/java/planetlotto/domain/Lottos.java diff --git a/src/main/java/planetlotto/Application.java b/src/main/java/planetlotto/Application.java index 769a38778..8fc09c65b 100644 --- a/src/main/java/planetlotto/Application.java +++ b/src/main/java/planetlotto/Application.java @@ -1,10 +1,12 @@ package planetlotto; import planetlotto.controller.LottoController; +import planetlotto.service.IssueService; public class Application { public static void main(String[] args) { - LottoController controller = new LottoController(); + IssueService issueService = new IssueService(); + LottoController controller = new LottoController(issueService); controller.run(); } diff --git a/src/main/java/planetlotto/controller/LottoController.java b/src/main/java/planetlotto/controller/LottoController.java index 22ef8f72c..c10cf892a 100644 --- a/src/main/java/planetlotto/controller/LottoController.java +++ b/src/main/java/planetlotto/controller/LottoController.java @@ -1,12 +1,48 @@ package planetlotto.controller; +import java.util.function.Supplier; +import planetlotto.domain.Amount; +import planetlotto.service.IssueService; import planetlotto.view.InputView; +import planetlotto.view.OutputView; public class LottoController { - public LottoController() { + private static final String INVALID_INPUT_ERROR = "유효하지 않은 입력 값입니다. 다시 입력해 주세요."; + private final IssueService issueService; + + public LottoController(IssueService issueService) { + this.issueService = issueService; } public void run() { - int amount = InputView.askAmount(); + Amount amount = readAmount(); + + } + + private Amount readAmount() { + return retry(() -> { + int amountValue = InputView.askAmount(); + return Amount.of(amountValue); + }); + } + + private T retry(Supplier supplier) { + while (true) { + try { + return supplier.get(); + } catch (IllegalArgumentException exception) { + printExceptionMessage(exception); + } + } + } + + private void printExceptionMessage(IllegalArgumentException exception) { + String message = exception.getMessage(); + + if ((message == null) || message.isBlank()) { + message = INVALID_INPUT_ERROR; + } + + OutputView.printErrorMessage(message); } } diff --git a/src/main/java/planetlotto/domain/Lottos.java b/src/main/java/planetlotto/domain/Lottos.java new file mode 100644 index 000000000..382a0e9a8 --- /dev/null +++ b/src/main/java/planetlotto/domain/Lottos.java @@ -0,0 +1,4 @@ +package planetlotto.domain; + +public class Lottos { +} From 7129fe447286b4ff4f4b9e825e9b4f99ab5beb6d Mon Sep 17 00:00:00 2001 From: sttuffe Date: Sat, 10 Jan 2026 14:09:08 +0900 Subject: [PATCH 05/16] =?UTF-8?q?feat:=20=EB=B0=9C=ED=96=89=ED=95=A0=20?= =?UTF-8?q?=EB=A1=9C=EB=98=90=20=EC=88=98=EB=9F=89=EC=9D=84=20=EA=B3=84?= =?UTF-8?q?=EC=82=B0=ED=95=98=EB=8A=94=20=EA=B8=B0=EB=8A=A5=20=EC=B6=94?= =?UTF-8?q?=EA=B0=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- README.md | 2 +- .../controller/LottoController.java | 3 ++- src/main/java/planetlotto/domain/Amount.java | 5 +++++ .../java/planetlotto/domain/LottoPolicy.java | 18 +++++++++++++++ src/main/java/planetlotto/domain/Lottos.java | 7 ++++++ .../planetlotto/service/IssueService.java | 14 ++++++++++++ .../java/planetlotto/domain/AmountTest.java | 22 ++++++++++++++++--- 7 files changed, 66 insertions(+), 5 deletions(-) create mode 100644 src/main/java/planetlotto/domain/LottoPolicy.java diff --git a/README.md b/README.md index 902c1db75..d657d092f 100644 --- a/README.md +++ b/README.md @@ -34,7 +34,7 @@ ### 로또 발행 -- [ ] 발행할 로또 수량 계산 +- [x] 발행할 로또 수량 계산 - [ ] 수량만큼 로또 발행 - [ ] 1~30 범위의 중복되지 않는 랜덤한 5개의 수 추출 - [ ] 로또 번호와 중복되지않는 보너스 번호 1개 추출 diff --git a/src/main/java/planetlotto/controller/LottoController.java b/src/main/java/planetlotto/controller/LottoController.java index c10cf892a..bbd5b90cc 100644 --- a/src/main/java/planetlotto/controller/LottoController.java +++ b/src/main/java/planetlotto/controller/LottoController.java @@ -2,6 +2,7 @@ import java.util.function.Supplier; import planetlotto.domain.Amount; +import planetlotto.domain.Lottos; import planetlotto.service.IssueService; import planetlotto.view.InputView; import planetlotto.view.OutputView; @@ -16,7 +17,7 @@ public LottoController(IssueService issueService) { public void run() { Amount amount = readAmount(); - + Lottos purchasedLottos = issueService.issueByAmount(amount); } private Amount readAmount() { diff --git a/src/main/java/planetlotto/domain/Amount.java b/src/main/java/planetlotto/domain/Amount.java index 15c753a63..5e507ed46 100644 --- a/src/main/java/planetlotto/domain/Amount.java +++ b/src/main/java/planetlotto/domain/Amount.java @@ -25,4 +25,9 @@ private void validateAmount(int amount) { throw new IllegalArgumentException(); } } + + public int availableQuantityByPolicy(int i) { + return amount / LottoPolicy.TICKET_PRICE.get(); + + } } diff --git a/src/main/java/planetlotto/domain/LottoPolicy.java b/src/main/java/planetlotto/domain/LottoPolicy.java new file mode 100644 index 000000000..43a50f428 --- /dev/null +++ b/src/main/java/planetlotto/domain/LottoPolicy.java @@ -0,0 +1,18 @@ +package planetlotto.domain; + +public enum LottoPolicy { + SIZE(5), + MIN_NUMBER(1), + MAX_NUMBER(30), + TICKET_PRICE(500); + + private final int value; + + LottoPolicy(int value) { + this.value = value; + } + + public int get() { + return value; + } +} diff --git a/src/main/java/planetlotto/domain/Lottos.java b/src/main/java/planetlotto/domain/Lottos.java index 382a0e9a8..f4ea1aadc 100644 --- a/src/main/java/planetlotto/domain/Lottos.java +++ b/src/main/java/planetlotto/domain/Lottos.java @@ -1,4 +1,11 @@ package planetlotto.domain; +import java.util.List; + public class Lottos { + private final List lottos; + + public Lottos(List lottos) { + this.lottos = lottos; + } } diff --git a/src/main/java/planetlotto/service/IssueService.java b/src/main/java/planetlotto/service/IssueService.java index 7fa4fbd72..4bca6f1ad 100644 --- a/src/main/java/planetlotto/service/IssueService.java +++ b/src/main/java/planetlotto/service/IssueService.java @@ -1,4 +1,18 @@ package planetlotto.service; +import java.util.ArrayList; +import planetlotto.domain.Amount; +import planetlotto.domain.LottoPolicy; +import planetlotto.domain.Lottos; + public class IssueService { + + public Lottos issueByAmount(Amount amount) { + int quantity = amount.availableQuantityByPolicy(LottoPolicy.TICKET_PRICE.get()); + + //TODO + return new Lottos(new ArrayList<>()); + } + + } diff --git a/src/test/java/planetlotto/domain/AmountTest.java b/src/test/java/planetlotto/domain/AmountTest.java index bc3a8c416..852eb32e4 100644 --- a/src/test/java/planetlotto/domain/AmountTest.java +++ b/src/test/java/planetlotto/domain/AmountTest.java @@ -1,7 +1,11 @@ package planetlotto.domain; -import org.assertj.core.api.Assertions; +import static org.assertj.core.api.Assertions.assertThat; +import static org.assertj.core.api.Assertions.assertThatThrownBy; + import org.junit.jupiter.api.Test; +import org.junit.jupiter.params.ParameterizedTest; +import org.junit.jupiter.params.provider.ValueSource; public class AmountTest { @Test @@ -10,7 +14,7 @@ public class AmountTest { Amount amount = Amount.of(Integer.parseInt(input)); - Assertions.assertThat(amount.getAmount()) + assertThat(amount.getAmount()) .isEqualTo(1000); } @@ -18,8 +22,20 @@ public class AmountTest { void 구입금액이_로또가격으로_나누어떨어지지않으면_예외처리() { String input = "1100"; - Assertions.assertThatThrownBy(() -> Amount.of(Integer.parseInt(input))) + assertThatThrownBy(() -> Amount.of(Integer.parseInt(input))) .hasMessage("[ERROR] "); } + + + @ParameterizedTest() + @ValueSource(strings = {"1000", "1500"}) + void 구입금액에따른_로또발행수량을_정상적으로_계산(String input) { + Amount amount = Amount.of(Integer.parseInt(input)); + + int quantity = amount.availableQuantityByPolicy(LottoPolicy.TICKET_PRICE.get()); + + assertThat(quantity) + .isEqualTo(Integer.parseInt(input) / LottoPolicy.TICKET_PRICE.get()); + } } From a3b178c871f08e59eb8f59ea4ffabbdc5bf395a1 Mon Sep 17 00:00:00 2001 From: sttuffe Date: Sat, 10 Jan 2026 14:18:19 +0900 Subject: [PATCH 06/16] =?UTF-8?q?feat:=20=EC=88=98=EB=9F=89=EB=A7=8C?= =?UTF-8?q?=ED=81=BC=20=EB=A1=9C=EB=98=90=EB=A5=BC=20=EB=B0=9C=ED=96=89?= =?UTF-8?q?=ED=95=98=EB=8A=94=20=EA=B8=B0=EB=8A=A5=20=EC=B6=94=EA=B0=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- README.md | 5 ++--- .../controller/LottoController.java | 2 ++ src/main/java/planetlotto/domain/Lotto.java | 12 ++++++++++- .../planetlotto/service/IssueService.java | 20 ++++++++++++++++--- 4 files changed, 32 insertions(+), 7 deletions(-) diff --git a/README.md b/README.md index d657d092f..7acee2f3f 100644 --- a/README.md +++ b/README.md @@ -35,9 +35,8 @@ ### 로또 발행 - [x] 발행할 로또 수량 계산 -- [ ] 수량만큼 로또 발행 -- [ ] 1~30 범위의 중복되지 않는 랜덤한 5개의 수 추출 -- [ ] 로또 번호와 중복되지않는 보너스 번호 1개 추출 +- [x] 수량만큼 로또 발행 +- [x] 1~30 범위의 중복되지 않는 랜덤한 5개의 수 추출 ### 로또 추첨 diff --git a/src/main/java/planetlotto/controller/LottoController.java b/src/main/java/planetlotto/controller/LottoController.java index bbd5b90cc..929852e44 100644 --- a/src/main/java/planetlotto/controller/LottoController.java +++ b/src/main/java/planetlotto/controller/LottoController.java @@ -18,6 +18,8 @@ public LottoController(IssueService issueService) { public void run() { Amount amount = readAmount(); Lottos purchasedLottos = issueService.issueByAmount(amount); + + System.out.println(); } private Amount readAmount() { diff --git a/src/main/java/planetlotto/domain/Lotto.java b/src/main/java/planetlotto/domain/Lotto.java index 7a7f50fd0..f3cecc2c7 100644 --- a/src/main/java/planetlotto/domain/Lotto.java +++ b/src/main/java/planetlotto/domain/Lotto.java @@ -1,6 +1,16 @@ package planetlotto.domain; +import java.util.Comparator; +import java.util.List; + public class Lotto { + private final List numbers; + + public Lotto(List numbers) { + numbers.sort(Comparator.naturalOrder()); + this.numbers = numbers; + } + - } + diff --git a/src/main/java/planetlotto/service/IssueService.java b/src/main/java/planetlotto/service/IssueService.java index 4bca6f1ad..25efc9fde 100644 --- a/src/main/java/planetlotto/service/IssueService.java +++ b/src/main/java/planetlotto/service/IssueService.java @@ -1,7 +1,10 @@ package planetlotto.service; -import java.util.ArrayList; +import camp.nextstep.edu.missionutils.Randoms; +import java.util.List; +import java.util.stream.IntStream; import planetlotto.domain.Amount; +import planetlotto.domain.Lotto; import planetlotto.domain.LottoPolicy; import planetlotto.domain.Lottos; @@ -10,9 +13,20 @@ public class IssueService { public Lottos issueByAmount(Amount amount) { int quantity = amount.availableQuantityByPolicy(LottoPolicy.TICKET_PRICE.get()); - //TODO - return new Lottos(new ArrayList<>()); + return issueLottosByQuantity(quantity); } + private Lottos issueLottosByQuantity(int quantity) { + List lottos = IntStream.range(0, quantity) + .mapToObj(i -> new Lotto(getLottoNumbers())) + .toList(); + + return new Lottos(lottos); + } + + private List getLottoNumbers() { + return Randoms.pickUniqueNumbersInRange(LottoPolicy.MIN_NUMBER.get(), LottoPolicy.MAX_NUMBER.get(), + LottoPolicy.SIZE.get()); + } } From 442c56f7bd30c33b9611ba1ac2a65f9265dd21f9 Mon Sep 17 00:00:00 2001 From: sttuffe Date: Sat, 10 Jan 2026 14:34:56 +0900 Subject: [PATCH 07/16] =?UTF-8?q?feat:=20=EB=8B=B9=EC=B2=A8=20=EA=B8=B0?= =?UTF-8?q?=EB=B3=B8=20=EB=B2=88=ED=98=B8=EB=A5=BC=20=EC=9E=85=EB=A0=A5?= =?UTF-8?q?=EB=B0=9B=EB=8A=94=20=EA=B8=B0=EB=8A=A5=20=EC=B6=94=EA=B0=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- README.md | 7 ++- .../controller/LottoController.java | 23 ++++++++- src/main/java/planetlotto/domain/Lotto.java | 50 ++++++++++++++++++- .../planetlotto/domain/WinningNumbers.java | 17 +++++++ 4 files changed, 92 insertions(+), 5 deletions(-) create mode 100644 src/main/java/planetlotto/domain/WinningNumbers.java diff --git a/README.md b/README.md index 7acee2f3f..9c8736de3 100644 --- a/README.md +++ b/README.md @@ -16,8 +16,11 @@ ### 당첨 번호 입력 -- [ ] 안내 메세지 출력 후, 사용자 입력 받음 -- [ ] 입력 유효성 검사 +- [x] 안내 메세지 출력 후, 사용자 입력 받음 +- [x] 입력 유효성 검사 + - [x] 1~30범위가 아닌 수가 있는 경우 예외처리 + - [x] 중복된 수가 있는 경우 예외처리 + - [x] 5개의 숫자가 아닌 경우 예외처리 ### 보너스 번호 입력 diff --git a/src/main/java/planetlotto/controller/LottoController.java b/src/main/java/planetlotto/controller/LottoController.java index 929852e44..b5d6b6bdb 100644 --- a/src/main/java/planetlotto/controller/LottoController.java +++ b/src/main/java/planetlotto/controller/LottoController.java @@ -1,8 +1,11 @@ package planetlotto.controller; +import java.util.List; import java.util.function.Supplier; import planetlotto.domain.Amount; +import planetlotto.domain.Lotto; import planetlotto.domain.Lottos; +import planetlotto.domain.WinningNumbers; import planetlotto.service.IssueService; import planetlotto.view.InputView; import planetlotto.view.OutputView; @@ -19,7 +22,8 @@ public void run() { Amount amount = readAmount(); Lottos purchasedLottos = issueService.issueByAmount(amount); - System.out.println(); + WinningNumbers winningNumbers = readWinningNumbers(); + } private Amount readAmount() { @@ -29,6 +33,23 @@ private Amount readAmount() { }); } + private WinningNumbers readWinningNumbers() { + Lotto baseNumbers = readWinningBase(); + + //TODO + return new WinningNumbers(baseNumbers, 0); + } + + + private Lotto readWinningBase() { + return retry(() -> { + List winningBase = InputView.askWinningLotto(); + + return Lotto.of(winningBase); + }); + } + + private T retry(Supplier supplier) { while (true) { try { diff --git a/src/main/java/planetlotto/domain/Lotto.java b/src/main/java/planetlotto/domain/Lotto.java index f3cecc2c7..5e6f57acf 100644 --- a/src/main/java/planetlotto/domain/Lotto.java +++ b/src/main/java/planetlotto/domain/Lotto.java @@ -1,16 +1,62 @@ package planetlotto.domain; +import java.util.ArrayList; import java.util.Comparator; +import java.util.HashSet; import java.util.List; +import java.util.Set; public class Lotto { private final List numbers; public Lotto(List numbers) { - numbers.sort(Comparator.naturalOrder()); - this.numbers = numbers; + List newNumbers = new ArrayList<>(numbers); + newNumbers.sort(Comparator.naturalOrder()); + this.numbers = newNumbers; } + public static Lotto of(List numbers) { + validate(numbers); + return new Lotto(numbers); + } + + private static void validate(List numbers) { + validateNumberCount(numbers); + validateNumberRange(numbers); + validateDuplicateNumber(numbers); + } + + private static void validateNumberRange(List numbers) { + if (hasOutOfRange(numbers)) { + throw new IllegalArgumentException(); + } + } + + private static boolean hasOutOfRange(List numbers) { + return numbers.stream() + .anyMatch(Lotto::isOutOfRange); + } + + private static boolean isOutOfRange(Integer number) { + return number < LottoPolicy.MIN_NUMBER.get() || LottoPolicy.MAX_NUMBER.get() < number; + } + + private static void validateDuplicateNumber(List numbers) { + if (hasDuplicates(numbers)) { + throw new IllegalArgumentException(); + } + } + + private static boolean hasDuplicates(List numbers) { + Set uniqueNumbers = new HashSet<>(numbers); + return uniqueNumbers.size() != numbers.size(); + } + + private static void validateNumberCount(List numbers) { + if (numbers.size() != LottoPolicy.SIZE.get()) { + throw new IllegalArgumentException(); + } + } } diff --git a/src/main/java/planetlotto/domain/WinningNumbers.java b/src/main/java/planetlotto/domain/WinningNumbers.java new file mode 100644 index 000000000..085d73366 --- /dev/null +++ b/src/main/java/planetlotto/domain/WinningNumbers.java @@ -0,0 +1,17 @@ +package planetlotto.domain; + +public class WinningNumbers { + private final Lotto baseNumbers; + private final int bonusNumber; + + public WinningNumbers(Lotto base, int bonus) { + this.baseNumbers = base; + this.bonusNumber = bonus; + } + + public static WinningNumbers of(Lotto base, int bonus) { + return new WinningNumbers(base, bonus); + } + + +} From 0f029f3dddeb74a1dc75245318e0bb9ea7140793 Mon Sep 17 00:00:00 2001 From: sttuffe Date: Sat, 10 Jan 2026 14:52:08 +0900 Subject: [PATCH 08/16] =?UTF-8?q?feat:=20=EB=8B=B9=EC=B2=A8=EB=B2=88?= =?UTF-8?q?=ED=98=B8=EB=A5=BC=20=EC=9E=85=EB=A0=A5=EB=B0=9B=EB=8A=94=20?= =?UTF-8?q?=EA=B8=B0=EB=8A=A5=20=EC=B6=94=EA=B0=80:?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- README.md | 6 ++- .../controller/LottoController.java | 8 ++-- src/main/java/planetlotto/domain/Lotto.java | 8 +++- .../planetlotto/domain/WinningNumbers.java | 16 ++++++++ .../domain/WinningNumbersTest.java | 41 +++++++++++++++++++ 5 files changed, 72 insertions(+), 7 deletions(-) create mode 100644 src/test/java/planetlotto/domain/WinningNumbersTest.java diff --git a/README.md b/README.md index 9c8736de3..bdc1c0755 100644 --- a/README.md +++ b/README.md @@ -24,8 +24,10 @@ ### 보너스 번호 입력 -- [ ] 안내 메세지 출력 후, 사용자 입력 받음 -- [ ] 입력 유효성 검사 +- [x] 안내 메세지 출력 후, 사용자 입력 받음 +- [x] 입력 유효성 검사 + - [x] 1~30범위가 아닌 수가 있는 경우 예외처리 + - [x] 기본번호와 중복되는 경우 예외처리 ## 출력 diff --git a/src/main/java/planetlotto/controller/LottoController.java b/src/main/java/planetlotto/controller/LottoController.java index b5d6b6bdb..010b59150 100644 --- a/src/main/java/planetlotto/controller/LottoController.java +++ b/src/main/java/planetlotto/controller/LottoController.java @@ -36,10 +36,12 @@ private Amount readAmount() { private WinningNumbers readWinningNumbers() { Lotto baseNumbers = readWinningBase(); - //TODO - return new WinningNumbers(baseNumbers, 0); - } + return retry(() -> { + int bonusNumber = InputView.askBonusNumber(); + return WinningNumbers.of(baseNumbers, bonusNumber); + }); + } private Lotto readWinningBase() { return retry(() -> { diff --git a/src/main/java/planetlotto/domain/Lotto.java b/src/main/java/planetlotto/domain/Lotto.java index 5e6f57acf..8fe11d63d 100644 --- a/src/main/java/planetlotto/domain/Lotto.java +++ b/src/main/java/planetlotto/domain/Lotto.java @@ -10,14 +10,14 @@ public class Lotto { private final List numbers; public Lotto(List numbers) { + validate(numbers); + List newNumbers = new ArrayList<>(numbers); newNumbers.sort(Comparator.naturalOrder()); this.numbers = newNumbers; } public static Lotto of(List numbers) { - validate(numbers); - return new Lotto(numbers); } @@ -58,5 +58,9 @@ private static void validateNumberCount(List numbers) { throw new IllegalArgumentException(); } } + + public boolean contains(int bonus) { + return this.numbers.contains(bonus); + } } diff --git a/src/main/java/planetlotto/domain/WinningNumbers.java b/src/main/java/planetlotto/domain/WinningNumbers.java index 085d73366..9fc3c9fdc 100644 --- a/src/main/java/planetlotto/domain/WinningNumbers.java +++ b/src/main/java/planetlotto/domain/WinningNumbers.java @@ -1,6 +1,8 @@ package planetlotto.domain; public class WinningNumbers { + private static final String ERROR_OUT_OF_RANGE_BONUS_NUMBER = "보너스 번호는 1부터 30 사이의 숫자여야 합니다."; + private static final String ERROR_DUPLICATES = "보너스 번호는 기본 당첨 번호와 중복되지 않게 해주세요."; private final Lotto baseNumbers; private final int bonusNumber; @@ -9,9 +11,23 @@ public WinningNumbers(Lotto base, int bonus) { this.bonusNumber = bonus; } + public static WinningNumbers of(Lotto base, int bonus) { + validateBonusNumber(bonus); + validateDuplicates(base, bonus); return new WinningNumbers(base, bonus); } + public static void validateBonusNumber(int bonusNumber) { + if (bonusNumber < LottoPolicy.MIN_NUMBER.get() || LottoPolicy.MAX_NUMBER.get() < bonusNumber) { + throw new IllegalArgumentException(ERROR_OUT_OF_RANGE_BONUS_NUMBER); + } + } + + private static void validateDuplicates(Lotto base, int bonus) { + if (base.contains(bonus)) { + throw new IllegalArgumentException(ERROR_DUPLICATES); + } + } } diff --git a/src/test/java/planetlotto/domain/WinningNumbersTest.java b/src/test/java/planetlotto/domain/WinningNumbersTest.java new file mode 100644 index 000000000..89a020f24 --- /dev/null +++ b/src/test/java/planetlotto/domain/WinningNumbersTest.java @@ -0,0 +1,41 @@ +package planetlotto.domain; + +import static org.assertj.core.api.Assertions.assertThatCode; +import static org.assertj.core.api.Assertions.assertThatThrownBy; + +import java.util.List; +import org.junit.jupiter.api.Test; +import org.junit.jupiter.params.ParameterizedTest; +import org.junit.jupiter.params.provider.ValueSource; + +public class WinningNumbersTest { + private WinningNumbers winningNumbers; + + + @Test + void 기본당첨번호_6개와_보너스번호_1개로_당첨번호_정상생성() { + Lotto baseNumbers = new Lotto(List.of(1, 2, 3, 4, 5)); + int bonusNumber = 7; + + assertThatCode(() -> WinningNumbers.of(baseNumbers, bonusNumber)) + .doesNotThrowAnyException(); + } + + @ParameterizedTest + @ValueSource(ints = {-1, 0, 31}) + void 보너스_번호가_1부터_30_아닌_경우_예외처리(int bounsNumberValue) { + Lotto baseNumbers = new Lotto(List.of(1, 2, 3, 4, 5)); + int bonusNumber = bounsNumberValue; + + assertThatThrownBy(() -> WinningNumbers.of(baseNumbers, bonusNumber)); + } + + @Test + void 보너스번호가_기본당첨번호와_중복인_경우_예외처리() { + Lotto baseNumbers = new Lotto(List.of(1, 2, 3, 4, 5)); + int bonusNumber = 5; + + assertThatThrownBy(() -> WinningNumbers.of(baseNumbers, bonusNumber)); + } + +} From 0f830bc60be6cb71ff3a054bc750b7d2a55825a4 Mon Sep 17 00:00:00 2001 From: sttuffe Date: Sat, 10 Jan 2026 15:27:17 +0900 Subject: [PATCH 09/16] =?UTF-8?q?feat:=20=EB=B0=9C=ED=96=89=EB=90=9C=20?= =?UTF-8?q?=EB=A1=9C=EB=98=90=EB=93=A4=EC=9D=98=20=EB=8B=B9=EC=B2=A8=20?= =?UTF-8?q?=ED=8C=90=EB=B3=84=20=EA=B8=B0=EB=8A=A5=20=EC=B6=94=EA=B0=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- README.md | 3 +- .../controller/LottoController.java | 4 ++ .../java/planetlotto/domain/DrawResult.java | 29 ++++++++++++ src/main/java/planetlotto/domain/Lotto.java | 7 +++ src/main/java/planetlotto/domain/Lottos.java | 13 ++++++ .../planetlotto/domain/WinningNumbers.java | 7 +++ .../java/planetlotto/domain/WinningRules.java | 45 +++++++++++++++++++ .../java/planetlotto/domain/AmountTest.java | 4 +- .../java/planetlotto/domain/LottosTest.java | 33 ++++++++++++++ 9 files changed, 141 insertions(+), 4 deletions(-) create mode 100644 src/main/java/planetlotto/domain/DrawResult.java create mode 100644 src/main/java/planetlotto/domain/WinningRules.java create mode 100644 src/test/java/planetlotto/domain/LottosTest.java diff --git a/README.md b/README.md index bdc1c0755..bf6833e01 100644 --- a/README.md +++ b/README.md @@ -45,6 +45,7 @@ ### 로또 추첨 -- [ ] 발행된 로또들을 당첨 규칙에 따라 등수 판별 +- [x] 발행된 로또들을 당첨 규칙에 따라 등수 판별 + - [ ] 당첨된 로또들의 당첨 금액을 집계 diff --git a/src/main/java/planetlotto/controller/LottoController.java b/src/main/java/planetlotto/controller/LottoController.java index 010b59150..5e649191e 100644 --- a/src/main/java/planetlotto/controller/LottoController.java +++ b/src/main/java/planetlotto/controller/LottoController.java @@ -3,6 +3,7 @@ import java.util.List; import java.util.function.Supplier; import planetlotto.domain.Amount; +import planetlotto.domain.DrawResult; import planetlotto.domain.Lotto; import planetlotto.domain.Lottos; import planetlotto.domain.WinningNumbers; @@ -24,6 +25,9 @@ public void run() { WinningNumbers winningNumbers = readWinningNumbers(); + DrawResult drawResult = purchasedLottos.drawBy(winningNumbers); + + } private Amount readAmount() { diff --git a/src/main/java/planetlotto/domain/DrawResult.java b/src/main/java/planetlotto/domain/DrawResult.java new file mode 100644 index 000000000..01aeb6412 --- /dev/null +++ b/src/main/java/planetlotto/domain/DrawResult.java @@ -0,0 +1,29 @@ +package planetlotto.domain; + +import java.util.EnumMap; +import java.util.Map; + +public class DrawResult { + private final Map drawResultMap; + + private DrawResult(Map drawResultMap) { + this.drawResultMap = new EnumMap<>(drawResultMap); + } + + public static DrawResult create() { + Map drawResultMap = new EnumMap<>(WinningRules.class); + for (WinningRules rule : WinningRules.values()) { + drawResultMap.put(rule, 0); + } + return new DrawResult(drawResultMap); + } + + public void addWinner(WinningRules winningRules) { + drawResultMap.merge(winningRules, 1, Integer::sum); + } + + public int countOf(WinningRules winningRules) { + return drawResultMap.get(winningRules); + } + +} diff --git a/src/main/java/planetlotto/domain/Lotto.java b/src/main/java/planetlotto/domain/Lotto.java index 8fe11d63d..20875bf82 100644 --- a/src/main/java/planetlotto/domain/Lotto.java +++ b/src/main/java/planetlotto/domain/Lotto.java @@ -62,5 +62,12 @@ private static void validateNumberCount(List numbers) { public boolean contains(int bonus) { return this.numbers.contains(bonus); } + + public int countMatchesWith(Lotto other) { + long matchCount = this.numbers.stream() + .filter(other::contains) + .count(); + return (int) matchCount; + } } diff --git a/src/main/java/planetlotto/domain/Lottos.java b/src/main/java/planetlotto/domain/Lottos.java index f4ea1aadc..8b29f58ef 100644 --- a/src/main/java/planetlotto/domain/Lottos.java +++ b/src/main/java/planetlotto/domain/Lottos.java @@ -8,4 +8,17 @@ public class Lottos { public Lottos(List lottos) { this.lottos = lottos; } + + + public DrawResult drawBy(WinningNumbers winningNumbers) { + DrawResult drawResult = DrawResult.create(); + + for (Lotto lotto : lottos) { + WinningRules winningRules = winningNumbers.checkWin(lotto); + drawResult.addWinner(winningRules); + } + + return drawResult; + } + } diff --git a/src/main/java/planetlotto/domain/WinningNumbers.java b/src/main/java/planetlotto/domain/WinningNumbers.java index 9fc3c9fdc..16a6afb27 100644 --- a/src/main/java/planetlotto/domain/WinningNumbers.java +++ b/src/main/java/planetlotto/domain/WinningNumbers.java @@ -30,4 +30,11 @@ private static void validateDuplicates(Lotto base, int bonus) { throw new IllegalArgumentException(ERROR_DUPLICATES); } } + + public WinningRules checkWin(Lotto issuedLotto) { + int matchCount = baseNumbers.countMatchesWith(issuedLotto); + boolean bonusMatch = issuedLotto.contains(bonusNumber); + + return WinningRules.of(matchCount, bonusMatch); + } } diff --git a/src/main/java/planetlotto/domain/WinningRules.java b/src/main/java/planetlotto/domain/WinningRules.java new file mode 100644 index 000000000..e237a7bb1 --- /dev/null +++ b/src/main/java/planetlotto/domain/WinningRules.java @@ -0,0 +1,45 @@ +package planetlotto.domain; + +import java.util.Arrays; +import java.util.function.BiPredicate; + +public enum WinningRules { + /* + 1등: 5개 번호 일치 / 100,000,000원 +2등: 4개 번호 + 보너스 번호 일치 / 10,000,000원 +3등: 4개 번호 일치 / 1,500,000원 +4등: 3개 번호 일치 + 보너스 번호 일치 / 500,000원 +5등: 2개 번호 일치 + 보너스 번호 일치 / 5,000원 + */ + FIRST(5, 100_000_000, (count, bonus) -> count == 5), + SECOND(4, 10_000_000, (count, bonus) -> count == 4 && bonus), + THIRD(4, 1_500_000, (count, bonus) -> count == 4 && !bonus), + FOURTH(3, 500_000, (count, bonus) -> count == 3 && bonus), + FIFTH(2, 5_000, (count, bonus) -> count == 2 && bonus), + NO_WIN(0, 0, (count, bonus) -> false); + + private final int matchCount; + private final int prize; + private final BiPredicate condition; + + WinningRules(int matchCount, int prize, BiPredicate condition) { + this.matchCount = matchCount; + this.prize = prize; + this.condition = condition; + } + + public static WinningRules of(int matchCount, boolean bonusMatch) { + return Arrays.stream(values()) + .filter(rule -> rule.condition.test(matchCount, bonusMatch)) + .findFirst() + .orElse(NO_WIN); + } + + public int getPrize() { + return prize; + } + + public int getMatchCount() { + return matchCount; + } +} diff --git a/src/test/java/planetlotto/domain/AmountTest.java b/src/test/java/planetlotto/domain/AmountTest.java index 852eb32e4..d05c702df 100644 --- a/src/test/java/planetlotto/domain/AmountTest.java +++ b/src/test/java/planetlotto/domain/AmountTest.java @@ -22,9 +22,7 @@ public class AmountTest { void 구입금액이_로또가격으로_나누어떨어지지않으면_예외처리() { String input = "1100"; - assertThatThrownBy(() -> Amount.of(Integer.parseInt(input))) - .hasMessage("[ERROR] "); - + assertThatThrownBy(() -> Amount.of(Integer.parseInt(input))); } diff --git a/src/test/java/planetlotto/domain/LottosTest.java b/src/test/java/planetlotto/domain/LottosTest.java new file mode 100644 index 000000000..ced9e9fbd --- /dev/null +++ b/src/test/java/planetlotto/domain/LottosTest.java @@ -0,0 +1,33 @@ +package planetlotto.domain; + +import static org.assertj.core.api.Assertions.assertThat; + +import java.util.List; +import org.junit.jupiter.api.DisplayName; +import org.junit.jupiter.api.Test; + +public class LottosTest { + + @Test + @DisplayName("로또를 추첨하여 당첨 결과를 정상 반환") + void 로또를_추첨하여_당첨_결과를_정상_반환() { + Lotto base = new Lotto(List.of(1, 2, 3, 4, 5)); + WinningNumbers winningNumbers = WinningNumbers.of(base, 6); + + Lottos lottos = new Lottos(List.of( + new Lotto(List.of(1, 2, 3, 4, 5)), + new Lotto(List.of(1, 2, 3, 4, 6)), + new Lotto(List.of(1, 2, 3, 4, 7)), + new Lotto(List.of(1, 2, 3, 6, 7)) + )); + + DrawResult result = lottos.drawBy(winningNumbers); + + assertThat(result.countOf(WinningRules.FIRST)).isEqualTo(1); + assertThat(result.countOf(WinningRules.SECOND)).isEqualTo(1); + assertThat(result.countOf(WinningRules.THIRD)).isEqualTo(1); + assertThat(result.countOf(WinningRules.FOURTH)).isEqualTo(1); + assertThat(result.countOf(WinningRules.FIFTH)).isZero(); + assertThat(result.countOf(WinningRules.NO_WIN)).isEqualTo(0); + } +} From c4ca7b7f2b246c57d3457483dc91393745c28a8c Mon Sep 17 00:00:00 2001 From: sttuffe Date: Sat, 10 Jan 2026 15:34:08 +0900 Subject: [PATCH 10/16] =?UTF-8?q?feat:=20=EC=B6=94=EC=B2=A8=20=EA=B2=B0?= =?UTF-8?q?=EA=B3=BC=20=EC=B6=9C=EB=A0=A5=20=EA=B8=B0=EB=8A=A5=20=EC=B6=94?= =?UTF-8?q?=EA=B0=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../controller/LottoController.java | 2 +- .../java/planetlotto/domain/DrawResult.java | 23 +++++++++++-------- .../java/planetlotto/domain/WinningRules.java | 4 ++-- 3 files changed, 17 insertions(+), 12 deletions(-) diff --git a/src/main/java/planetlotto/controller/LottoController.java b/src/main/java/planetlotto/controller/LottoController.java index 5e649191e..f28a33ff1 100644 --- a/src/main/java/planetlotto/controller/LottoController.java +++ b/src/main/java/planetlotto/controller/LottoController.java @@ -27,7 +27,7 @@ public void run() { DrawResult drawResult = purchasedLottos.drawBy(winningNumbers); - + OutputView.printResult(drawResult.get()); } private Amount readAmount() { diff --git a/src/main/java/planetlotto/domain/DrawResult.java b/src/main/java/planetlotto/domain/DrawResult.java index 01aeb6412..2c98e78fc 100644 --- a/src/main/java/planetlotto/domain/DrawResult.java +++ b/src/main/java/planetlotto/domain/DrawResult.java @@ -1,29 +1,34 @@ package planetlotto.domain; -import java.util.EnumMap; +import java.util.Collections; +import java.util.HashMap; import java.util.Map; public class DrawResult { - private final Map drawResultMap; + private final Map drawResultMap; - private DrawResult(Map drawResultMap) { - this.drawResultMap = new EnumMap<>(drawResultMap); + private DrawResult(Map drawResultMap) { + this.drawResultMap = new HashMap<>(drawResultMap); } public static DrawResult create() { - Map drawResultMap = new EnumMap<>(WinningRules.class); + Map drawResultMap = new HashMap<>(); for (WinningRules rule : WinningRules.values()) { - drawResultMap.put(rule, 0); + drawResultMap.put(rule.ordinal(), 0); } return new DrawResult(drawResultMap); } - public void addWinner(WinningRules winningRules) { - drawResultMap.merge(winningRules, 1, Integer::sum); + public void addWinner(WinningRules winningRule) { + drawResultMap.merge(winningRule.ordinal(), 1, Integer::sum); } public int countOf(WinningRules winningRules) { - return drawResultMap.get(winningRules); + return drawResultMap.get(winningRules.ordinal()); + } + + public Map get() { + return Collections.unmodifiableMap(new HashMap<>(this.drawResultMap)); } } diff --git a/src/main/java/planetlotto/domain/WinningRules.java b/src/main/java/planetlotto/domain/WinningRules.java index e237a7bb1..f8990e17c 100644 --- a/src/main/java/planetlotto/domain/WinningRules.java +++ b/src/main/java/planetlotto/domain/WinningRules.java @@ -11,12 +11,12 @@ public enum WinningRules { 4등: 3개 번호 일치 + 보너스 번호 일치 / 500,000원 5등: 2개 번호 일치 + 보너스 번호 일치 / 5,000원 */ + NO_WIN(0, 0, (count, bonus) -> count == 0), FIRST(5, 100_000_000, (count, bonus) -> count == 5), SECOND(4, 10_000_000, (count, bonus) -> count == 4 && bonus), THIRD(4, 1_500_000, (count, bonus) -> count == 4 && !bonus), FOURTH(3, 500_000, (count, bonus) -> count == 3 && bonus), - FIFTH(2, 5_000, (count, bonus) -> count == 2 && bonus), - NO_WIN(0, 0, (count, bonus) -> false); + FIFTH(2, 5_000, (count, bonus) -> count == 2 && bonus); private final int matchCount; private final int prize; From 4c11baf32e206587c2b52850db4bd4c9494b41ca Mon Sep 17 00:00:00 2001 From: sttuffe Date: Sat, 10 Jan 2026 15:38:10 +0900 Subject: [PATCH 11/16] =?UTF-8?q?feat:=20=EB=B0=9C=ED=96=89=EB=90=9C=20?= =?UTF-8?q?=EB=A1=9C=EB=98=90=EB=A5=BC=20=EC=B6=9C=EB=A0=A5=ED=95=98?= =?UTF-8?q?=EB=8A=94=20=EA=B8=B0=EB=8A=A5=20=EC=B6=94=EA=B0=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/main/java/planetlotto/controller/LottoController.java | 2 ++ src/main/java/planetlotto/domain/Lotto.java | 4 ++++ src/main/java/planetlotto/domain/Lottos.java | 5 +++++ 3 files changed, 11 insertions(+) diff --git a/src/main/java/planetlotto/controller/LottoController.java b/src/main/java/planetlotto/controller/LottoController.java index f28a33ff1..589bf5d7f 100644 --- a/src/main/java/planetlotto/controller/LottoController.java +++ b/src/main/java/planetlotto/controller/LottoController.java @@ -23,6 +23,8 @@ public void run() { Amount amount = readAmount(); Lottos purchasedLottos = issueService.issueByAmount(amount); + OutputView.printPurchasedLottos(purchasedLottos.getLottosList()); + WinningNumbers winningNumbers = readWinningNumbers(); DrawResult drawResult = purchasedLottos.drawBy(winningNumbers); diff --git a/src/main/java/planetlotto/domain/Lotto.java b/src/main/java/planetlotto/domain/Lotto.java index 20875bf82..ae5cdf11d 100644 --- a/src/main/java/planetlotto/domain/Lotto.java +++ b/src/main/java/planetlotto/domain/Lotto.java @@ -69,5 +69,9 @@ public int countMatchesWith(Lotto other) { .count(); return (int) matchCount; } + + public List getList() { + return List.copyOf(this.numbers); + } } diff --git a/src/main/java/planetlotto/domain/Lottos.java b/src/main/java/planetlotto/domain/Lottos.java index 8b29f58ef..efd7b6491 100644 --- a/src/main/java/planetlotto/domain/Lottos.java +++ b/src/main/java/planetlotto/domain/Lottos.java @@ -21,4 +21,9 @@ public DrawResult drawBy(WinningNumbers winningNumbers) { return drawResult; } + public List> getLottosList() { + return lottos.stream() + .map(Lotto::getList) + .toList(); + } } From cde523e950e0a0cabaabebf74abd284082f3c2e0 Mon Sep 17 00:00:00 2001 From: sttuffe Date: Sat, 10 Jan 2026 16:11:54 +0900 Subject: [PATCH 12/16] =?UTF-8?q?feat:=20=EB=A1=9C=EB=98=90=EA=B0=80=20?= =?UTF-8?q?=EB=B0=9C=ED=96=89=EB=90=9C=20=EB=82=A0=EC=A7=9C=EB=A5=BC=20?= =?UTF-8?q?=EA=B8=B0=EC=96=B5=ED=95=98=EB=8F=84=EB=A1=9D=20=EC=B6=94?= =?UTF-8?q?=EA=B0=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/main/java/planetlotto/domain/Lotto.java | 16 ++++++++++++++-- .../java/planetlotto/service/IssueService.java | 2 +- src/test/java/planetlotto/domain/LottosTest.java | 10 +++++----- .../planetlotto/domain/WinningNumbersTest.java | 6 +++--- 4 files changed, 23 insertions(+), 11 deletions(-) diff --git a/src/main/java/planetlotto/domain/Lotto.java b/src/main/java/planetlotto/domain/Lotto.java index ae5cdf11d..ed32b0959 100644 --- a/src/main/java/planetlotto/domain/Lotto.java +++ b/src/main/java/planetlotto/domain/Lotto.java @@ -1,5 +1,7 @@ package planetlotto.domain; +import java.time.DayOfWeek; +import java.time.LocalDate; import java.util.ArrayList; import java.util.Comparator; import java.util.HashSet; @@ -7,18 +9,28 @@ import java.util.Set; public class Lotto { + private final DayOfWeek dayOfWeek; private final List numbers; - public Lotto(List numbers) { + public Lotto(List numbers, DayOfWeek dayOfWeek) { validate(numbers); List newNumbers = new ArrayList<>(numbers); newNumbers.sort(Comparator.naturalOrder()); this.numbers = newNumbers; + this.dayOfWeek = dayOfWeek; } public static Lotto of(List numbers) { - return new Lotto(numbers); + int dayOfWeekIndex = (int) (Math.random() * 7) + 1; + + return new Lotto(numbers, DayOfWeek.of(dayOfWeekIndex)); + } + + public static Lotto ofToday(List numbers) { + + LocalDate today = LocalDate.now(); + return new Lotto(numbers, today.getDayOfWeek()); } private static void validate(List numbers) { diff --git a/src/main/java/planetlotto/service/IssueService.java b/src/main/java/planetlotto/service/IssueService.java index 25efc9fde..0af3ae428 100644 --- a/src/main/java/planetlotto/service/IssueService.java +++ b/src/main/java/planetlotto/service/IssueService.java @@ -19,7 +19,7 @@ public Lottos issueByAmount(Amount amount) { private Lottos issueLottosByQuantity(int quantity) { List lottos = IntStream.range(0, quantity) - .mapToObj(i -> new Lotto(getLottoNumbers())) + .mapToObj(i -> Lotto.of(getLottoNumbers())) .toList(); return new Lottos(lottos); diff --git a/src/test/java/planetlotto/domain/LottosTest.java b/src/test/java/planetlotto/domain/LottosTest.java index ced9e9fbd..8e7008d1c 100644 --- a/src/test/java/planetlotto/domain/LottosTest.java +++ b/src/test/java/planetlotto/domain/LottosTest.java @@ -11,14 +11,14 @@ public class LottosTest { @Test @DisplayName("로또를 추첨하여 당첨 결과를 정상 반환") void 로또를_추첨하여_당첨_결과를_정상_반환() { - Lotto base = new Lotto(List.of(1, 2, 3, 4, 5)); + Lotto base = Lotto.of(List.of(1, 2, 3, 4, 5)); WinningNumbers winningNumbers = WinningNumbers.of(base, 6); Lottos lottos = new Lottos(List.of( - new Lotto(List.of(1, 2, 3, 4, 5)), - new Lotto(List.of(1, 2, 3, 4, 6)), - new Lotto(List.of(1, 2, 3, 4, 7)), - new Lotto(List.of(1, 2, 3, 6, 7)) + Lotto.of(List.of(1, 2, 3, 4, 5)), + Lotto.of(List.of(1, 2, 3, 4, 6)), + Lotto.of(List.of(1, 2, 3, 4, 7)), + Lotto.of(List.of(1, 2, 3, 6, 7)) )); DrawResult result = lottos.drawBy(winningNumbers); diff --git a/src/test/java/planetlotto/domain/WinningNumbersTest.java b/src/test/java/planetlotto/domain/WinningNumbersTest.java index 89a020f24..4c4b911eb 100644 --- a/src/test/java/planetlotto/domain/WinningNumbersTest.java +++ b/src/test/java/planetlotto/domain/WinningNumbersTest.java @@ -14,7 +14,7 @@ public class WinningNumbersTest { @Test void 기본당첨번호_6개와_보너스번호_1개로_당첨번호_정상생성() { - Lotto baseNumbers = new Lotto(List.of(1, 2, 3, 4, 5)); + Lotto baseNumbers = Lotto.of(List.of(1, 2, 3, 4, 5)); int bonusNumber = 7; assertThatCode(() -> WinningNumbers.of(baseNumbers, bonusNumber)) @@ -24,7 +24,7 @@ public class WinningNumbersTest { @ParameterizedTest @ValueSource(ints = {-1, 0, 31}) void 보너스_번호가_1부터_30_아닌_경우_예외처리(int bounsNumberValue) { - Lotto baseNumbers = new Lotto(List.of(1, 2, 3, 4, 5)); + Lotto baseNumbers = Lotto.of(List.of(1, 2, 3, 4, 5)); int bonusNumber = bounsNumberValue; assertThatThrownBy(() -> WinningNumbers.of(baseNumbers, bonusNumber)); @@ -32,7 +32,7 @@ public class WinningNumbersTest { @Test void 보너스번호가_기본당첨번호와_중복인_경우_예외처리() { - Lotto baseNumbers = new Lotto(List.of(1, 2, 3, 4, 5)); + Lotto baseNumbers = Lotto.of(List.of(1, 2, 3, 4, 5)); int bonusNumber = 5; assertThatThrownBy(() -> WinningNumbers.of(baseNumbers, bonusNumber)); From d68703d32c356b1c5333af69d9746c45c0bfb927 Mon Sep 17 00:00:00 2001 From: sttuffe Date: Sat, 10 Jan 2026 16:14:48 +0900 Subject: [PATCH 13/16] =?UTF-8?q?docs:=20=EB=88=84=EB=9D=BD=EB=90=9C=20rea?= =?UTF-8?q?dme=20=EC=97=85=EB=8D=B0=EC=9D=B4=ED=8A=B8?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- README.md | 18 ++++++++++++++++-- 1 file changed, 16 insertions(+), 2 deletions(-) diff --git a/README.md b/README.md index bf6833e01..083e84528 100644 --- a/README.md +++ b/README.md @@ -33,8 +33,18 @@ ### 발행된 로또 결과 출력 +- [x] 발행된 로또들을 형식에 맞춰 출력 +- + ### 추첨 결과 출력 +- [x] 당첨 결과를 통해 당첨 금액 집계 +- [x] 수익률 산출 +- [x] 정해진 형식에 맞추어 당첨 통계 출력 + - [x] 당첨 통계 메세지 출력 + - [x] 당첨 내역 출력 + - [x] 총 수익률 출력 + ## 비즈니스 로직 ### 로또 발행 @@ -45,7 +55,11 @@ ### 로또 추첨 -- [x] 발행된 로또들을 당첨 규칙에 따라 등수 판별 +- [x] 발행 로또에 대해 당첨 검사 + - [x] 각 로또 번호가 당첨 번호와 일치하는지 비교 + - [x] 각 로또 번호가 보너스 번호와 일치하는지 비교 + - [x] 당첨 번호 일치 갯수와 보너스 번호 일치 여부를 통해 결과 산출 +- [x] 발행 수량만큼 반복 검사 -- [ ] 당첨된 로또들의 당첨 금액을 집계 +- [x] 당첨된 로또들의 당첨 금액을 집계 From 10c8f33d3a5dac3ad1a00d5f149e555f3001ef74 Mon Sep 17 00:00:00 2001 From: sttuffe Date: Sat, 10 Jan 2026 16:42:09 +0900 Subject: [PATCH 14/16] =?UTF-8?q?fix:=20=EB=A1=9C=EB=98=90=EA=B0=80=20?= =?UTF-8?q?=EB=B0=9C=ED=96=89=EB=90=9C=20=EB=82=A0=EC=A7=9C=EB=A5=BC=20?= =?UTF-8?q?=EC=A0=9C=EB=8C=80=EB=A1=9C=20=EC=A7=91=EA=B3=84=ED=95=98?= =?UTF-8?q?=EC=A7=80=20=EB=AA=BB=ED=95=98=EB=8A=94=20=EB=B2=84=EA=B7=B8=20?= =?UTF-8?q?=EC=88=98=EC=A0=95:?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- README.md | 5 ++++ .../controller/LottoController.java | 1 + .../java/planetlotto/domain/DrawResult.java | 23 +++++++++++++++++-- src/main/java/planetlotto/domain/Lotto.java | 4 ++++ src/main/java/planetlotto/domain/Lottos.java | 2 +- .../java/planetlotto/view/OutputView.java | 12 ++++++---- 6 files changed, 40 insertions(+), 7 deletions(-) diff --git a/README.md b/README.md index 083e84528..93dd9c6d3 100644 --- a/README.md +++ b/README.md @@ -63,3 +63,8 @@ - [x] 당첨된 로또들의 당첨 금액을 집계 + +### 날짜 집계 기능 추가 + +- [x] 로또가 발행된 날짜 기록 +- [x] 당첨된 로또들의 발행 날짜 기록 \ No newline at end of file diff --git a/src/main/java/planetlotto/controller/LottoController.java b/src/main/java/planetlotto/controller/LottoController.java index 589bf5d7f..8b90f5007 100644 --- a/src/main/java/planetlotto/controller/LottoController.java +++ b/src/main/java/planetlotto/controller/LottoController.java @@ -30,6 +30,7 @@ public void run() { DrawResult drawResult = purchasedLottos.drawBy(winningNumbers); OutputView.printResult(drawResult.get()); +// OutputView.printDateResult(drawResult.getDayOfWeekMap()); } private Amount readAmount() { diff --git a/src/main/java/planetlotto/domain/DrawResult.java b/src/main/java/planetlotto/domain/DrawResult.java index 2c98e78fc..a67ad4883 100644 --- a/src/main/java/planetlotto/domain/DrawResult.java +++ b/src/main/java/planetlotto/domain/DrawResult.java @@ -1,14 +1,29 @@ package planetlotto.domain; +import java.time.DayOfWeek; import java.util.Collections; +import java.util.EnumMap; import java.util.HashMap; import java.util.Map; public class DrawResult { private final Map drawResultMap; + private final Map issueLottoDayOfWeekMap; private DrawResult(Map drawResultMap) { - this.drawResultMap = new HashMap<>(drawResultMap); + Map drawDayResultMap = new HashMap<>(); + + for (WinningRules rule : WinningRules.values()) { + drawDayResultMap.put(rule.ordinal(), 0); + } + this.drawResultMap = drawDayResultMap; + + Map issueLottoDayOfWeekMap = new EnumMap<>(DayOfWeek.class); + + for (DayOfWeek dayOfWeek : DayOfWeek.values()) { + issueLottoDayOfWeekMap.put(dayOfWeek, 0); + } + this.issueLottoDayOfWeekMap = issueLottoDayOfWeekMap; } public static DrawResult create() { @@ -19,8 +34,9 @@ public static DrawResult create() { return new DrawResult(drawResultMap); } - public void addWinner(WinningRules winningRule) { + public void addWinner(WinningRules winningRule, DayOfWeek dayOfWeek) { drawResultMap.merge(winningRule.ordinal(), 1, Integer::sum); + issueLottoDayOfWeekMap.merge(dayOfWeek, 1, Integer::sum); } public int countOf(WinningRules winningRules) { @@ -31,4 +47,7 @@ public Map get() { return Collections.unmodifiableMap(new HashMap<>(this.drawResultMap)); } +// public Map> getDayOfWeekMap() { +// return Collections.unmodifiableMap(drawResultDayOfWeekMap); +// } } diff --git a/src/main/java/planetlotto/domain/Lotto.java b/src/main/java/planetlotto/domain/Lotto.java index ed32b0959..a59a74049 100644 --- a/src/main/java/planetlotto/domain/Lotto.java +++ b/src/main/java/planetlotto/domain/Lotto.java @@ -85,5 +85,9 @@ public int countMatchesWith(Lotto other) { public List getList() { return List.copyOf(this.numbers); } + + public DayOfWeek getDayOfWeek() { + return dayOfWeek; + } } diff --git a/src/main/java/planetlotto/domain/Lottos.java b/src/main/java/planetlotto/domain/Lottos.java index efd7b6491..ec83aa7fc 100644 --- a/src/main/java/planetlotto/domain/Lottos.java +++ b/src/main/java/planetlotto/domain/Lottos.java @@ -15,7 +15,7 @@ public DrawResult drawBy(WinningNumbers winningNumbers) { for (Lotto lotto : lottos) { WinningRules winningRules = winningNumbers.checkWin(lotto); - drawResult.addWinner(winningRules); + drawResult.addWinner(winningRules, lotto.getDayOfWeek()); } return drawResult; diff --git a/src/main/java/planetlotto/view/OutputView.java b/src/main/java/planetlotto/view/OutputView.java index 0452898da..d3655816e 100644 --- a/src/main/java/planetlotto/view/OutputView.java +++ b/src/main/java/planetlotto/view/OutputView.java @@ -1,11 +1,12 @@ package planetlotto.view; +import static java.lang.System.lineSeparator; + +import java.time.DayOfWeek; import java.util.List; import java.util.Map; import java.util.stream.Collectors; -import static java.lang.System.lineSeparator; - public class OutputView { public static void printPurchasedLottos(final List> lottos) { final String header = String.format("%d개를 구매했습니다.", lottos.size()); @@ -21,8 +22,7 @@ public static void printPurchasedLottos(final List> lottos) { } /** - * index 0번은 미당첨 - * index 1~5번은 1~5등 + * index 0번은 미당첨 index 1~5번은 1~5등 */ public static void printResult(final Map countsByRank) { final List lines = List.of( @@ -44,4 +44,8 @@ public static void printResult(final Map countsByRank) { public static void printErrorMessage(final String message) { System.out.printf("[ERROR] %s%n", message); } + + public static void printDateResult(Map> dayOfWeekMap) { + + } } From b65dd59c21f622b2cd4f149d18a84111d983ec9b Mon Sep 17 00:00:00 2001 From: sttuffe Date: Sat, 10 Jan 2026 16:46:11 +0900 Subject: [PATCH 15/16] =?UTF-8?q?feat:=20=EB=82=A0=EC=A7=9C=EB=B3=84=20?= =?UTF-8?q?=EB=B0=9C=ED=96=89=EB=90=9C=20=EB=A1=9C=EB=98=90=EC=9D=98=20?= =?UTF-8?q?=EA=B0=9C=EC=88=98=EB=A5=BC=20=EC=B6=9C=EB=A0=A5=ED=95=98?= =?UTF-8?q?=EB=8A=94=20=EA=B8=B0=EB=8A=A5=20=EC=B6=94=EA=B0=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/main/java/planetlotto/controller/LottoController.java | 2 +- src/main/java/planetlotto/domain/DrawResult.java | 6 +++--- src/main/java/planetlotto/view/OutputView.java | 8 +++++++- 3 files changed, 11 insertions(+), 5 deletions(-) diff --git a/src/main/java/planetlotto/controller/LottoController.java b/src/main/java/planetlotto/controller/LottoController.java index 8b90f5007..aa672e5f4 100644 --- a/src/main/java/planetlotto/controller/LottoController.java +++ b/src/main/java/planetlotto/controller/LottoController.java @@ -30,7 +30,7 @@ public void run() { DrawResult drawResult = purchasedLottos.drawBy(winningNumbers); OutputView.printResult(drawResult.get()); -// OutputView.printDateResult(drawResult.getDayOfWeekMap()); + OutputView.printDateResult(drawResult.getDayOfWeekMap()); } private Amount readAmount() { diff --git a/src/main/java/planetlotto/domain/DrawResult.java b/src/main/java/planetlotto/domain/DrawResult.java index a67ad4883..e481ef121 100644 --- a/src/main/java/planetlotto/domain/DrawResult.java +++ b/src/main/java/planetlotto/domain/DrawResult.java @@ -47,7 +47,7 @@ public Map get() { return Collections.unmodifiableMap(new HashMap<>(this.drawResultMap)); } -// public Map> getDayOfWeekMap() { -// return Collections.unmodifiableMap(drawResultDayOfWeekMap); -// } + public Map getDayOfWeekMap() { + return Collections.unmodifiableMap(issueLottoDayOfWeekMap); + } } diff --git a/src/main/java/planetlotto/view/OutputView.java b/src/main/java/planetlotto/view/OutputView.java index d3655816e..8382204e9 100644 --- a/src/main/java/planetlotto/view/OutputView.java +++ b/src/main/java/planetlotto/view/OutputView.java @@ -45,7 +45,13 @@ public static void printErrorMessage(final String message) { System.out.printf("[ERROR] %s%n", message); } - public static void printDateResult(Map> dayOfWeekMap) { + public static void printDateResult(Map dayOfWeekMap) { + for (DayOfWeek dayOfWeek : dayOfWeekMap.keySet()) { + System.out.print(dayOfWeek + "-발행된 수량: "); + System.out.println(dayOfWeekMap.get(dayOfWeek)); + ; + + } } } From a88e8f4b385367313aea108203304a85b0aeaa8e Mon Sep 17 00:00:00 2001 From: sttuffe Date: Sat, 10 Jan 2026 16:49:07 +0900 Subject: [PATCH 16/16] =?UTF-8?q?docs:=20=EB=88=84=EB=9D=BD=EB=90=9C=20rea?= =?UTF-8?q?dme=20=EC=97=85=EB=8D=B0=EC=9D=B4=ED=8A=B8?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- README.md | 14 +++++++++++++- 1 file changed, 13 insertions(+), 1 deletion(-) diff --git a/README.md b/README.md index 93dd9c6d3..a1057a970 100644 --- a/README.md +++ b/README.md @@ -1,5 +1,12 @@ # java-planetlotto-precourse +# 개인 도전 과제 + +- 기능 확장 +- 날짜별 판매된 로또의 개수를 집계하는 기능을 추가했습니다. +- 시뮬레이션임을 고려, 로또가 판매되는 날짜는 랜덤하게 설정되도록 하였습니다. +- 날짜 집계는 출력 마지막 부분에서 출력됩니다. + # 개요 # 구현 기능 목록 @@ -45,6 +52,10 @@ - [x] 당첨 내역 출력 - [x] 총 수익률 출력 +### 날짜별 판매 통계 출력 + +- [x] 요일별 판매된 로또의 개수를 출력 + ## 비즈니스 로직 ### 로또 발행 @@ -67,4 +78,5 @@ ### 날짜 집계 기능 추가 - [x] 로또가 발행된 날짜 기록 -- [x] 당첨된 로또들의 발행 날짜 기록 \ No newline at end of file +- [x] 당첨된 로또들의 발행 날짜 기록 +