From 5cdb2f7d06b2d4eb9b653b4c74a930ee4af65efe Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=EA=B9=80=EC=A3=BC=EC=96=B8?= Date: Mon, 4 Nov 2024 12:48:04 +0900 Subject: [PATCH 01/23] =?UTF-8?q?doc:=20README.md=20=EC=9E=91=EC=84=B1?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- README.md | 187 ++++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 187 insertions(+) diff --git a/README.md b/README.md index 5fa2560b46..107f46027a 100644 --- a/README.md +++ b/README.md @@ -1 +1,188 @@ # java-lotto-precourse +# 미션 - 로또 + +## 기능 요구 사항 + +로또 게임 기능을 구현해야 한다. 로또 게임은 아래와 같은 규칙으로 진행된다. + +``` +- 로또 번호의 숫자 범위는 1~45까지이다. +- 1개의 로또를 발행할 때 중복되지 않는 6개의 숫자를 뽑는다. +- 당첨 번호 추첨 시 중복되지 않는 숫자 6개와 보너스 번호 1개를 뽑는다. +- 당첨은 1등부터 5등까지 있다. 당첨 기준과 금액은 아래와 같다. + - 1등: 6개 번호 일치 / 2,000,000,000원 + - 2등: 5개 번호 + 보너스 번호 일치 / 30,000,000원 + - 3등: 5개 번호 일치 / 1,500,000원 + - 4등: 4개 번호 일치 / 50,000원 + - 5등: 3개 번호 일치 / 5,000원 +``` + +- 로또 구입 금액을 입력하면 구입 금액에 해당하는 만큼 로또를 발행해야 한다. +- 로또 1장의 가격은 1,000원이다. +- 당첨 번호와 보너스 번호를 입력받는다. +- 사용자가 구매한 로또 번호와 당첨 번호를 비교하여 당첨 내역 및 수익률을 출력하고 로또 게임을 종료한다. +- 사용자가 잘못된 값을 입력할 경우 `IllegalArgumentException`를 발생시키고, "[ERROR]"로 시작하는 에러 메시지를 출력 후 종료한다. + +### 입출력 요구 사항 + +#### 입력 + +- 로또 구입 금액을 입력 받는다. 구입 금액은 1,000원 단위로 입력 받으며 1,000원으로 나누어 떨어지지 않는 경우 예외 처리한다. + +``` +14000 +``` + +- 당첨 번호를 입력 받는다. 번호는 쉼표(,)를 기준으로 구분한다. + +``` +1,2,3,4,5,6 +``` + +- 보너스 번호를 입력 받는다. + +``` +7 +``` + +#### 출력 + +- 발행한 로또 수량 및 번호를 출력한다. 로또 번호는 오름차순으로 정렬하여 보여준다. + +``` +8개를 구매했습니다. +[8, 21, 23, 41, 42, 43] +[3, 5, 11, 16, 32, 38] +[7, 11, 16, 35, 36, 44] +[1, 8, 11, 31, 41, 42] +[13, 14, 16, 38, 42, 45] +[7, 11, 30, 40, 42, 43] +[2, 13, 22, 32, 38, 45] +[1, 3, 5, 14, 22, 45] +``` + +- 당첨 내역을 출력한다. + +``` +3개 일치 (5,000원) - 1개 +4개 일치 (50,000원) - 0개 +5개 일치 (1,500,000원) - 0개 +5개 일치, 보너스 볼 일치 (30,000,000원) - 0개 +6개 일치 (2,000,000,000원) - 0개 +``` + +- 수익률은 소수점 둘째 자리에서 반올림한다. (ex. 100.0%, 51.5%, 1,000,000.0%) + +``` +총 수익률은 62.5%입니다. +``` + +- 예외 상황 시 에러 문구를 출력해야 한다. 단, 에러 문구는 "[ERROR]"로 시작해야 한다. + +``` +[ERROR] 로또 번호는 1부터 45 사이의 숫자여야 합니다. +``` + +#### 실행 결과 예시 + +``` +구입금액을 입력해 주세요. +8000 + +8개를 구매했습니다. +[8, 21, 23, 41, 42, 43] +[3, 5, 11, 16, 32, 38] +[7, 11, 16, 35, 36, 44] +[1, 8, 11, 31, 41, 42] +[13, 14, 16, 38, 42, 45] +[7, 11, 30, 40, 42, 43] +[2, 13, 22, 32, 38, 45] +[1, 3, 5, 14, 22, 45] + +당첨 번호를 입력해 주세요. +1,2,3,4,5,6 + +보너스 번호를 입력해 주세요. +7 + +당첨 통계 +--- +3개 일치 (5,000원) - 1개 +4개 일치 (50,000원) - 0개 +5개 일치 (1,500,000원) - 0개 +5개 일치, 보너스 볼 일치 (30,000,000원) - 0개 +6개 일치 (2,000,000,000원) - 0개 +총 수익률은 62.5%입니다. +``` + +--- + +## 프로그래밍 요구 사항 + +- JDK 11 버전에서 실행 가능해야 한다. **JDK 11에서 정상적으로 동작하지 않을 경우 0점 처리한다.** +- 프로그램 실행의 시작점은 `Application`의 `main()`이다. +- `build.gradle` 파일을 변경할 수 없고, 외부 라이브러리를 사용하지 않는다. +- [Java 코드 컨벤션](https://github.com/woowacourse/woowacourse-docs/tree/master/styleguide/java) 가이드를 준수하며 프로그래밍한다. +- 프로그램 종료 시 `System.exit()`를 호출하지 않는다. +- 프로그램 구현이 완료되면 `ApplicationTest`의 모든 테스트가 성공해야 한다. **테스트가 실패할 경우 0점 처리한다.** +- 프로그래밍 요구 사항에서 달리 명시하지 않는 한 파일, 패키지 이름을 수정하거나 이동하지 않는다. +- indent(인덴트, 들여쓰기) depth를 3이 넘지 않도록 구현한다. 2까지만 허용한다. + - 예를 들어 while문 안에 if문이 있으면 들여쓰기는 2이다. + - 힌트: indent(인덴트, 들여쓰기) depth를 줄이는 좋은 방법은 함수(또는 메서드)를 분리하면 된다. +- 3항 연산자를 쓰지 않는다. +- 함수(또는 메서드)가 한 가지 일만 하도록 최대한 작게 만들어라. +- JUnit 5와 AssertJ를 이용하여 본인이 정리한 기능 목록이 정상 동작함을 테스트 코드로 확인한다. + +### 추가된 요구 사항 + +- 함수(또는 메서드)의 길이가 15라인을 넘어가지 않도록 구현한다. + - 함수(또는 메서드)가 한 가지 일만 잘 하도록 구현한다. +- else 예약어를 쓰지 않는다. + - 힌트: if 조건절에서 값을 return하는 방식으로 구현하면 else를 사용하지 않아도 된다. + - else를 쓰지 말라고 하니 switch/case로 구현하는 경우가 있는데 switch/case도 허용하지 않는다. +- Java Enum을 적용한다. +- 도메인 로직에 단위 테스트를 구현해야 한다. 단, UI(System.out, System.in, Scanner) 로직은 제외한다. + - 핵심 로직을 구현하는 코드와 UI를 담당하는 로직을 분리해 구현한다. + - 단위 테스트 작성이 익숙하지 않다면 `test/java/lotto/LottoTest`를 참고하여 학습한 후 테스트를 구현한다. + +### 라이브러리 + +- [`camp.nextstep.edu.missionutils`](https://github.com/woowacourse-projects/mission-utils)에서 제공하는 `Randoms` 및 `Console` API를 사용하여 구현해야 한다. + - Random 값 추출은 `camp.nextstep.edu.missionutils.Randoms`의 `pickUniqueNumbersInRange()`를 활용한다. + - 사용자가 입력하는 값은 `camp.nextstep.edu.missionutils.Console`의 `readLine()`을 활용한다. + +#### 사용 예시 + +```java +List numbers = Randoms.pickUniqueNumbersInRange(1, 45, 6); +``` + +### Lotto 클래스 + +- 제공된 `Lotto` 클래스를 활용해 구현해야 한다. +- `Lotto`에 매개 변수가 없는 생성자를 추가할 수 없다. +- `numbers`의 접근 제어자인 private을 변경할 수 없다. +- `Lotto`에 필드(인스턴스 변수)를 추가할 수 없다. +- `Lotto`의 패키지 변경은 가능하다. + +```java +public class Lotto { + private final List numbers; + + public Lotto(List numbers) { + validate(numbers); + this.numbers = numbers; + } + + private void validate(List numbers) { + if (numbers.size() != 6) { + throw new IllegalArgumentException(); + } + } + + // TODO: 추가 기능 구현 +} +``` + +--- + 및 제출 방법은 [프리코스 과제 제출](https://github.com/woowacourse/woowacourse-docs/tree/master/precourse) 문서를 참고한다. \ No newline at end of file From 56af0ed25fbe506090aefc4cb33146a140086c86 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=EA=B9=80=EC=A3=BC=EC=96=B8?= Date: Mon, 4 Nov 2024 13:15:00 +0900 Subject: [PATCH 02/23] =?UTF-8?q?feat:=20=EB=A1=9C=EB=98=90=20=EA=B5=AC?= =?UTF-8?q?=EB=A7=A4=20=EA=B8=88=EC=95=A1=20=EC=9E=85=EB=A0=A5=20=EA=B8=B0?= =?UTF-8?q?=EB=8A=A5?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/main/java/lotto/view/InputVIew.java | 10 ++++++++++ 1 file changed, 10 insertions(+) create mode 100644 src/main/java/lotto/view/InputVIew.java diff --git a/src/main/java/lotto/view/InputVIew.java b/src/main/java/lotto/view/InputVIew.java new file mode 100644 index 0000000000..7d145e49af --- /dev/null +++ b/src/main/java/lotto/view/InputVIew.java @@ -0,0 +1,10 @@ +package lotto.view; + +import camp.nextstep.edu.missionutils.Console; + +public class InputVIew { + public String inputPurchaseAmount() { + System.out.println("구입금액을 입력해 주세요."); + return Console.readLine(); + } +} From 01df74cacd1165fd641ec3836d8b16afc9c3e3ff Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=EA=B9=80=EC=A3=BC=EC=96=B8?= Date: Mon, 4 Nov 2024 13:15:15 +0900 Subject: [PATCH 03/23] =?UTF-8?q?feat:=20=EA=B5=AC=EB=A7=A4=20=EA=B8=88?= =?UTF-8?q?=EC=95=A1=20=EA=B2=80=EC=A6=9D=20=ED=81=B4=EB=9E=98=EC=8A=A4=20?= =?UTF-8?q?=EA=B5=AC=ED=98=84?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/main/java/lotto/model/Amount.java | 22 ++++++++++++++++++++++ 1 file changed, 22 insertions(+) create mode 100644 src/main/java/lotto/model/Amount.java diff --git a/src/main/java/lotto/model/Amount.java b/src/main/java/lotto/model/Amount.java new file mode 100644 index 0000000000..28f7b338fb --- /dev/null +++ b/src/main/java/lotto/model/Amount.java @@ -0,0 +1,22 @@ +package lotto.model; + +public class Amount { + private final int amount; + private final int UNIT_AMOUNT = 1000; + + public Amount(String input){ + int amountNumber = parseInput(input); + validateDivisible(amountNumber); + this.amount = amountNumber; + } + + private void validateDivisible(int amountNumber){ + if(amountNumber / UNIT_AMOUNT != 0){ + throw new IllegalArgumentException("[ERROR] 로또는 개당 1000원 입니다."); + } + } + + private int parseInput(String input){ + return Integer.parseInt(input); + } +} From 1332baef3cb9dccab86d887751d9162d078bfd2c Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=EA=B9=80=EC=A3=BC=EC=96=B8?= Date: Mon, 4 Nov 2024 13:31:31 +0900 Subject: [PATCH 04/23] =?UTF-8?q?chore:=20Lotto=20=ED=81=B4=EB=9E=98?= =?UTF-8?q?=EC=8A=A4=20model=20=ED=8C=A8=ED=82=A4=EC=A7=80=EB=A1=9C=20?= =?UTF-8?q?=EC=9D=B4=EB=8F=99?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/main/java/lotto/{ => model}/Lotto.java | 2 +- src/test/java/lotto/LottoTest.java | 1 + 2 files changed, 2 insertions(+), 1 deletion(-) rename src/main/java/lotto/{ => model}/Lotto.java (95%) diff --git a/src/main/java/lotto/Lotto.java b/src/main/java/lotto/model/Lotto.java similarity index 95% rename from src/main/java/lotto/Lotto.java rename to src/main/java/lotto/model/Lotto.java index 88fc5cf12b..da4f30ba10 100644 --- a/src/main/java/lotto/Lotto.java +++ b/src/main/java/lotto/model/Lotto.java @@ -1,4 +1,4 @@ -package lotto; +package lotto.model; import java.util.List; diff --git a/src/test/java/lotto/LottoTest.java b/src/test/java/lotto/LottoTest.java index 309f4e50ae..c8ca9d63e1 100644 --- a/src/test/java/lotto/LottoTest.java +++ b/src/test/java/lotto/LottoTest.java @@ -1,5 +1,6 @@ package lotto; +import lotto.model.Lotto; import org.junit.jupiter.api.DisplayName; import org.junit.jupiter.api.Test; From 73039d60a33031ee0cd13d38e925c8336eb306dd Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=EA=B9=80=EC=A3=BC=EC=96=B8?= Date: Mon, 4 Nov 2024 13:32:02 +0900 Subject: [PATCH 05/23] =?UTF-8?q?feat:=20=EB=A1=9C=EB=98=90=20=EA=B5=AC?= =?UTF-8?q?=EB=A7=A4=20=EA=B0=9C=EC=88=98=20=EC=B6=9C=EB=A0=A5=20=EA=B8=B0?= =?UTF-8?q?=EB=8A=A5?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/main/java/lotto/model/Amount.java | 8 +++++++- src/main/java/lotto/view/OutputView.java | 9 +++++++++ 2 files changed, 16 insertions(+), 1 deletion(-) create mode 100644 src/main/java/lotto/view/OutputView.java diff --git a/src/main/java/lotto/model/Amount.java b/src/main/java/lotto/model/Amount.java index 28f7b338fb..b49cba1bde 100644 --- a/src/main/java/lotto/model/Amount.java +++ b/src/main/java/lotto/model/Amount.java @@ -2,16 +2,18 @@ public class Amount { private final int amount; + private final int count; private final int UNIT_AMOUNT = 1000; public Amount(String input){ int amountNumber = parseInput(input); validateDivisible(amountNumber); this.amount = amountNumber; + this.count = amount / UNIT_AMOUNT; } private void validateDivisible(int amountNumber){ - if(amountNumber / UNIT_AMOUNT != 0){ + if(amountNumber % UNIT_AMOUNT != 0){ throw new IllegalArgumentException("[ERROR] 로또는 개당 1000원 입니다."); } } @@ -19,4 +21,8 @@ private void validateDivisible(int amountNumber){ private int parseInput(String input){ return Integer.parseInt(input); } + + public int getCount(){ + return this.count; + } } diff --git a/src/main/java/lotto/view/OutputView.java b/src/main/java/lotto/view/OutputView.java new file mode 100644 index 0000000000..3f429470db --- /dev/null +++ b/src/main/java/lotto/view/OutputView.java @@ -0,0 +1,9 @@ +package lotto.view; + +import lotto.model.Amount; + +public class OutputView { + public void printAmount(Amount amount){ + System.out.println(amount.getCount() + "개를 구입하셨습니다."); + } +} From 415c9c64291433cd3e1c1ff4bf017191db954131 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=EA=B9=80=EC=A3=BC=EC=96=B8?= Date: Mon, 4 Nov 2024 13:41:52 +0900 Subject: [PATCH 06/23] =?UTF-8?q?fix:=20=EB=A1=9C=EB=98=90=20=EA=B5=AC?= =?UTF-8?q?=EB=A7=A4=20=EA=B0=9C=EC=88=98=20=EC=B6=9C=EB=A0=A5=20=EB=A9=94?= =?UTF-8?q?=EC=84=9C=EB=93=9C=20=EB=AA=85=20=EC=88=98=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/main/java/lotto/view/OutputView.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/main/java/lotto/view/OutputView.java b/src/main/java/lotto/view/OutputView.java index 3f429470db..b47698024e 100644 --- a/src/main/java/lotto/view/OutputView.java +++ b/src/main/java/lotto/view/OutputView.java @@ -3,7 +3,7 @@ import lotto.model.Amount; public class OutputView { - public void printAmount(Amount amount){ + public void printCount(Amount amount){ System.out.println(amount.getCount() + "개를 구입하셨습니다."); } } From 461bbfae2c263b447f178de93689277a4ca14371 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=EA=B9=80=EC=A3=BC=EC=96=B8?= Date: Mon, 4 Nov 2024 13:53:54 +0900 Subject: [PATCH 07/23] =?UTF-8?q?feat:=20=EB=A1=9C=EB=98=90=20=EB=B2=88?= =?UTF-8?q?=ED=98=B8=20=EC=83=9D=EC=84=B1=20=EA=B8=B0=EB=8A=A5?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/main/java/lotto/model/LottoList.java | 24 ++++++++++++++++++++++++ 1 file changed, 24 insertions(+) create mode 100644 src/main/java/lotto/model/LottoList.java diff --git a/src/main/java/lotto/model/LottoList.java b/src/main/java/lotto/model/LottoList.java new file mode 100644 index 0000000000..c9bce2f946 --- /dev/null +++ b/src/main/java/lotto/model/LottoList.java @@ -0,0 +1,24 @@ +package lotto.model; + +import camp.nextstep.edu.missionutils.Randoms; + +import java.util.ArrayList; +import java.util.List; + +public class LottoList { + private List lottoList = new ArrayList<>(); + + public LottoList(int count){ + for (int i = 0; i < count; i++) { + lottoList.add(new Lotto(makeNumbers())); + } + } + + private List makeNumbers(){ + return Randoms.pickUniqueNumbersInRange(1, 45, 6); + } + + public List getLottoList() { + return lottoList; + } +} From a652023d0bc21468f5acd8733366621e8bde0d25 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=EA=B9=80=EC=A3=BC=EC=96=B8?= Date: Mon, 4 Nov 2024 13:54:02 +0900 Subject: [PATCH 08/23] =?UTF-8?q?feat:=20=EB=A1=9C=EB=98=90=20=EB=B2=88?= =?UTF-8?q?=ED=98=B8=20=EC=B6=9C=EB=A0=A5=20=EA=B8=B0=EB=8A=A5?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/main/java/lotto/model/Lotto.java | 4 +++- src/main/java/lotto/view/OutputView.java | 10 ++++++++++ 2 files changed, 13 insertions(+), 1 deletion(-) diff --git a/src/main/java/lotto/model/Lotto.java b/src/main/java/lotto/model/Lotto.java index da4f30ba10..9fa3c4f4c1 100644 --- a/src/main/java/lotto/model/Lotto.java +++ b/src/main/java/lotto/model/Lotto.java @@ -16,5 +16,7 @@ private void validate(List numbers) { } } - // TODO: 추가 기능 구현 + public List getNumbers() { + return numbers; + } } diff --git a/src/main/java/lotto/view/OutputView.java b/src/main/java/lotto/view/OutputView.java index b47698024e..88b1fc91dc 100644 --- a/src/main/java/lotto/view/OutputView.java +++ b/src/main/java/lotto/view/OutputView.java @@ -1,9 +1,19 @@ package lotto.view; import lotto.model.Amount; +import lotto.model.Lotto; +import lotto.model.LottoList; + +import java.util.List; public class OutputView { public void printCount(Amount amount){ System.out.println(amount.getCount() + "개를 구입하셨습니다."); } + + public void printLottoList(LottoList lottoList){ + for (Lotto lotto : lottoList.getLottoList()) { + System.out.println(lotto.getNumbers()); + } + } } From d4a1044e2c1b5f37036357c24daba59c46984586 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=EA=B9=80=EC=A3=BC=EC=96=B8?= Date: Mon, 4 Nov 2024 13:54:24 +0900 Subject: [PATCH 09/23] =?UTF-8?q?feat:=20=EB=A1=9C=EB=98=90=20=EA=B5=AC?= =?UTF-8?q?=EB=A7=A4=20=EB=8B=A8=EA=B3=84=20=EC=99=84=EC=84=B1?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../lotto/controller/LottoController.java | 38 +++++++++++++++++++ 1 file changed, 38 insertions(+) create mode 100644 src/main/java/lotto/controller/LottoController.java diff --git a/src/main/java/lotto/controller/LottoController.java b/src/main/java/lotto/controller/LottoController.java new file mode 100644 index 0000000000..792e663567 --- /dev/null +++ b/src/main/java/lotto/controller/LottoController.java @@ -0,0 +1,38 @@ +package lotto.controller; + +import lotto.model.Amount; +import lotto.model.LottoList; +import lotto.view.InputVIew; +import lotto.view.OutputView; + +public class LottoController { + private final InputVIew inputVIew; + private final OutputView outputView; + private Amount amount; + private LottoList lottoList; + + public LottoController(InputVIew inputVIew, OutputView outputView) { + this.inputVIew = inputVIew; + this.outputView = outputView; + } + + public void startLotto(){ + purchaseLotto(); + } + + // 구매 단계 + private void purchaseLotto(){ + // 개수 + String input = inputVIew.inputPurchaseAmount(); + amount = new Amount(input); + outputView.printCount(amount); + + // 구매한 로또 번호 생성 및 출력 + lottoList = new LottoList(amount.getCount()); + outputView.printLottoList(lottoList); + } + + // 당첨 추첨 단계 + + // 결과 출력 단계 +} From 848a0382412d33a0aa473a7dab21609424b7fe22 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=EA=B9=80=EC=A3=BC=EC=96=B8?= Date: Mon, 4 Nov 2024 13:54:40 +0900 Subject: [PATCH 10/23] =?UTF-8?q?feat:=20=EB=A1=9C=EB=98=90=20=EA=B5=AC?= =?UTF-8?q?=EB=A7=A4=20=EB=8B=A8=EA=B3=84=20=EC=99=84=EC=84=B1?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/main/java/lotto/Application.java | 9 ++++++++- 1 file changed, 8 insertions(+), 1 deletion(-) diff --git a/src/main/java/lotto/Application.java b/src/main/java/lotto/Application.java index d190922ba4..c62c8bd621 100644 --- a/src/main/java/lotto/Application.java +++ b/src/main/java/lotto/Application.java @@ -1,7 +1,14 @@ package lotto; +import lotto.controller.LottoController; +import lotto.view.InputVIew; +import lotto.view.OutputView; + public class Application { public static void main(String[] args) { - // TODO: 프로그램 구현 + InputVIew inputVIew = new InputVIew(); + OutputView outputView = new OutputView(); + LottoController lottoController = new LottoController(inputVIew, outputView); + lottoController.startLotto(); } } From 432b597af78444bf41c912cf3bfc84eaebb2e267 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=EA=B9=80=EC=A3=BC=EC=96=B8?= Date: Mon, 4 Nov 2024 16:28:40 +0900 Subject: [PATCH 11/23] =?UTF-8?q?feat:=20=EB=8B=B9=EC=B2=A8=20=EB=B2=88?= =?UTF-8?q?=ED=98=B8=20=EC=9E=85=EB=A0=A5=20=EA=B8=B0=EB=8A=A5?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/main/java/lotto/view/InputVIew.java | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/src/main/java/lotto/view/InputVIew.java b/src/main/java/lotto/view/InputVIew.java index 7d145e49af..e3f746f70b 100644 --- a/src/main/java/lotto/view/InputVIew.java +++ b/src/main/java/lotto/view/InputVIew.java @@ -7,4 +7,9 @@ public String inputPurchaseAmount() { System.out.println("구입금액을 입력해 주세요."); return Console.readLine(); } + + public String inputLottoNumbers(){ + System.out.println("당첨 번호를 입력해 주세요."); + return Console.readLine(); + } } From 2d12e7e6aa8289cee2c149743dcf953b22f0a7d6 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=EA=B9=80=EC=A3=BC=EC=96=B8?= Date: Mon, 4 Nov 2024 16:29:35 +0900 Subject: [PATCH 12/23] =?UTF-8?q?feat:=20=EB=B3=B4=EB=84=88=EC=8A=A4=20?= =?UTF-8?q?=EB=B2=88=ED=98=B8=20=EC=9E=85=EB=A0=A5=20=EA=B8=B0=EB=8A=A5?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/main/java/lotto/view/InputVIew.java | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/src/main/java/lotto/view/InputVIew.java b/src/main/java/lotto/view/InputVIew.java index e3f746f70b..53c908d349 100644 --- a/src/main/java/lotto/view/InputVIew.java +++ b/src/main/java/lotto/view/InputVIew.java @@ -12,4 +12,9 @@ public String inputLottoNumbers(){ System.out.println("당첨 번호를 입력해 주세요."); return Console.readLine(); } + + public String inputBonusNumbers(){ + System.out.println("보너스 번호를 입력해 주세요."); + return Console.readLine(); + } } From 0ffb36d3a771d4de9be2ae34dab2a7a9fbe64122 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=EA=B9=80=EC=A3=BC=EC=96=B8?= Date: Mon, 4 Nov 2024 17:37:56 +0900 Subject: [PATCH 13/23] =?UTF-8?q?fix:=20InputView=20=ED=81=B4=EB=9E=98?= =?UTF-8?q?=EC=8A=A4=20=EC=9D=B4=EB=A6=84=20=EC=98=A4=ED=83=80=20=EC=88=98?= =?UTF-8?q?=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/main/java/lotto/view/{InputVIew.java => InputView.java} | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) rename src/main/java/lotto/view/{InputVIew.java => InputView.java} (95%) diff --git a/src/main/java/lotto/view/InputVIew.java b/src/main/java/lotto/view/InputView.java similarity index 95% rename from src/main/java/lotto/view/InputVIew.java rename to src/main/java/lotto/view/InputView.java index 53c908d349..934b0c2db0 100644 --- a/src/main/java/lotto/view/InputVIew.java +++ b/src/main/java/lotto/view/InputView.java @@ -2,7 +2,7 @@ import camp.nextstep.edu.missionutils.Console; -public class InputVIew { +public class InputView { public String inputPurchaseAmount() { System.out.println("구입금액을 입력해 주세요."); return Console.readLine(); From 6a0407f9e2ce4e9dbb67018f5d2c67c3669afe40 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=EA=B9=80=EC=A3=BC=EC=96=B8?= Date: Mon, 4 Nov 2024 17:38:45 +0900 Subject: [PATCH 14/23] =?UTF-8?q?feat:=20=EB=8B=B9=EC=B2=A8=20=EB=B2=88?= =?UTF-8?q?=ED=98=B8,=20=EB=B3=B4=EB=84=88=EC=8A=A4=20=EB=B2=88=ED=98=B8?= =?UTF-8?q?=20=EB=8B=B4=EB=8B=B9=20=ED=81=B4=EB=9E=98=EC=8A=A4?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/main/java/lotto/model/WinningNumbers.java | 36 +++++++++++++++++++ 1 file changed, 36 insertions(+) create mode 100644 src/main/java/lotto/model/WinningNumbers.java diff --git a/src/main/java/lotto/model/WinningNumbers.java b/src/main/java/lotto/model/WinningNumbers.java new file mode 100644 index 0000000000..541b33a124 --- /dev/null +++ b/src/main/java/lotto/model/WinningNumbers.java @@ -0,0 +1,36 @@ +package lotto.model; + +import java.util.Arrays; +import java.util.List; +import java.util.stream.Collectors; + +public class WinningNumbers { + private List winningNumbers; + private int bonusNumber; + + public WinningNumbers(String winningNumbersInput, String bonusNumberInput) { + this.winningNumbers = parseStringToIntegerList(winningNumbersInput); + this.bonusNumber = parseStringToInt(bonusNumberInput); + } + + private List parseStringToIntegerList(String winningNumbers) { + return Arrays.stream(winningNumbers.split(",")) + .map(Integer::parseInt) + .collect(Collectors.toList()); + + // 중복으로 들어가는 숫자 예외 처리 + } + + private int parseStringToInt(String bonusNumberInput){ + return Integer.parseInt(bonusNumberInput); + } + + public List getWinningNumbers() { + return winningNumbers; + } + + public int getBonusNumber() { + return bonusNumber; + } +} + From d59a612913ef2acd16fa84f49898b982b73fce86 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=EA=B9=80=EC=A3=BC=EC=96=B8?= Date: Mon, 4 Nov 2024 17:42:10 +0900 Subject: [PATCH 15/23] =?UTF-8?q?feat:=20=EB=8B=B9=EC=B2=A8=20=EA=B2=B0?= =?UTF-8?q?=EA=B3=BC=20=EC=83=9D=EC=84=B1=20=EA=B8=B0=EB=8A=A5?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/main/java/lotto/model/Rank.java | 46 +++++++++++++++++++ .../java/lotto/model/ResultCalculator.java | 40 ++++++++++++++++ src/main/java/lotto/view/OutputView.java | 2 - 3 files changed, 86 insertions(+), 2 deletions(-) create mode 100644 src/main/java/lotto/model/Rank.java create mode 100644 src/main/java/lotto/model/ResultCalculator.java diff --git a/src/main/java/lotto/model/Rank.java b/src/main/java/lotto/model/Rank.java new file mode 100644 index 0000000000..dce822ad52 --- /dev/null +++ b/src/main/java/lotto/model/Rank.java @@ -0,0 +1,46 @@ +package lotto.model; + +import java.util.Arrays; + +public enum Rank { + FIFTH(5, 3, false, "3개 일치 (5,000원) - ", 5000), + FOURTH(4, 4, false, "4개 일치 (50,000원) - ", 50000), + THIRD(3, 5, false, "5개 일치 (1,500,000원) - ", 1500000), + SECOND(2, 5, true, "5개 일치, 보너스 볼 일치 (30,000,000원) - ", 30000000), + FIRST(1, 6, false, "6개 일치 (2,000,000,000원) - ", 2000000000); + + private final int rank; + private final int matchCount; + private final boolean bonusMatchRequired; + private final String description; + private final int prize; + + Rank(int rank, int matchCount, boolean bonusMatchRequired, String description, int prize) { + this.rank = rank; + this.matchCount = matchCount; + this.bonusMatchRequired = bonusMatchRequired; + this.description = description; + this.prize = prize; + } + + // 당첨 조건에 맞는 Rank 반환 메서드 + public static Rank getRank(int count, boolean bonusMatch) { + return Arrays.stream(Rank.values()) + .filter(rank -> rank.matchCount == count && rank.bonusMatchRequired == bonusMatch) + .findFirst() + .orElseThrow(() -> new IllegalArgumentException("[ERROR] 해당 조건에 맞는 Rank가 없습니다")); + } + + // Getters (필요시 추가) + public int getRank() { + return rank; + } + + public String getDescription() { + return description; + } + + public int getPrize() { + return prize; + } +} diff --git a/src/main/java/lotto/model/ResultCalculator.java b/src/main/java/lotto/model/ResultCalculator.java new file mode 100644 index 0000000000..b9c143b8b6 --- /dev/null +++ b/src/main/java/lotto/model/ResultCalculator.java @@ -0,0 +1,40 @@ +package lotto.model; + +import java.util.HashMap; +import java.util.Map; +public class ResultCalculator { + private final LottoList lottoList; + private final WinningNumbers winningNumbers; + private final Map rankCounts; // 클래스 변수로 이동 + + public ResultCalculator(LottoList lottoList, WinningNumbers winningNumbers) { + this.lottoList = lottoList; + this.winningNumbers = winningNumbers; + this.rankCounts = new HashMap<>(); + } + + public void calculateResults() { + for (Lotto lotto : lottoList.getLottoList()) { + int count = countMatches(lotto); + boolean bonus = lotto.getNumbers().contains(winningNumbers.getBonusNumber()); + + Rank rank = Rank.getRank(count, bonus); + rankCounts.put(rank, rankCounts.getOrDefault(rank, 0) + 1); + } + } + + private int countMatches(Lotto lotto) { + int count = 0; + for (Integer number : lotto.getNumbers()) { + if (winningNumbers.getWinningNumbers().contains(number)) { + count++; + } + } + return count; + } + + +} + + + diff --git a/src/main/java/lotto/view/OutputView.java b/src/main/java/lotto/view/OutputView.java index 88b1fc91dc..c63fcdecff 100644 --- a/src/main/java/lotto/view/OutputView.java +++ b/src/main/java/lotto/view/OutputView.java @@ -4,8 +4,6 @@ import lotto.model.Lotto; import lotto.model.LottoList; -import java.util.List; - public class OutputView { public void printCount(Amount amount){ System.out.println(amount.getCount() + "개를 구입하셨습니다."); From 899afd7516c3b881f35fdfe4a5679cd5a3beff37 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=EA=B9=80=EC=A3=BC=EC=96=B8?= Date: Mon, 4 Nov 2024 22:55:04 +0900 Subject: [PATCH 16/23] =?UTF-8?q?feat:=20=EB=8B=B9=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?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/main/java/lotto/Application.java | 4 ++-- src/main/java/lotto/model/Rank.java | 2 +- src/main/java/lotto/view/OutputView.java | 11 ++++++++--- 3 files changed, 11 insertions(+), 6 deletions(-) diff --git a/src/main/java/lotto/Application.java b/src/main/java/lotto/Application.java index c62c8bd621..95738069a6 100644 --- a/src/main/java/lotto/Application.java +++ b/src/main/java/lotto/Application.java @@ -1,12 +1,12 @@ package lotto; import lotto.controller.LottoController; -import lotto.view.InputVIew; +import lotto.view.InputView; import lotto.view.OutputView; public class Application { public static void main(String[] args) { - InputVIew inputVIew = new InputVIew(); + InputView inputVIew = new InputView(); OutputView outputView = new OutputView(); LottoController lottoController = new LottoController(inputVIew, outputView); lottoController.startLotto(); diff --git a/src/main/java/lotto/model/Rank.java b/src/main/java/lotto/model/Rank.java index dce822ad52..0b4bdff08b 100644 --- a/src/main/java/lotto/model/Rank.java +++ b/src/main/java/lotto/model/Rank.java @@ -28,7 +28,7 @@ public static Rank getRank(int count, boolean bonusMatch) { return Arrays.stream(Rank.values()) .filter(rank -> rank.matchCount == count && rank.bonusMatchRequired == bonusMatch) .findFirst() - .orElseThrow(() -> new IllegalArgumentException("[ERROR] 해당 조건에 맞는 Rank가 없습니다")); + .orElse(null); } // Getters (필요시 추가) diff --git a/src/main/java/lotto/view/OutputView.java b/src/main/java/lotto/view/OutputView.java index c63fcdecff..fcfc6823b9 100644 --- a/src/main/java/lotto/view/OutputView.java +++ b/src/main/java/lotto/view/OutputView.java @@ -1,8 +1,6 @@ package lotto.view; -import lotto.model.Amount; -import lotto.model.Lotto; -import lotto.model.LottoList; +import lotto.model.*; public class OutputView { public void printCount(Amount amount){ @@ -14,4 +12,11 @@ public void printLottoList(LottoList lottoList){ System.out.println(lotto.getNumbers()); } } + + public void printLottoResults(ResultCalculator resultCalculator){ + for (Rank rank : Rank.values()) { + int count = resultCalculator.getRankCounts().getOrDefault(rank, 0); + System.out.println(rank.getDescription() + count + "개"); + } + } } From cc3adbf8c6b657a456807550361a879c5658fbc0 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=EA=B9=80=EC=A3=BC=EC=96=B8?= Date: Mon, 4 Nov 2024 23:25:55 +0900 Subject: [PATCH 17/23] =?UTF-8?q?feat:=20DEFUALT=20enum=20=EC=83=9D?= =?UTF-8?q?=EC=84=B1?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/main/java/lotto/model/Rank.java | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/src/main/java/lotto/model/Rank.java b/src/main/java/lotto/model/Rank.java index 0b4bdff08b..f616ed0d1e 100644 --- a/src/main/java/lotto/model/Rank.java +++ b/src/main/java/lotto/model/Rank.java @@ -3,6 +3,7 @@ import java.util.Arrays; public enum Rank { + DEFAULT(6, 0,false,"3개 미만", 0), FIFTH(5, 3, false, "3개 일치 (5,000원) - ", 5000), FOURTH(4, 4, false, "4개 일치 (50,000원) - ", 50000), THIRD(3, 5, false, "5개 일치 (1,500,000원) - ", 1500000), @@ -28,7 +29,7 @@ public static Rank getRank(int count, boolean bonusMatch) { return Arrays.stream(Rank.values()) .filter(rank -> rank.matchCount == count && rank.bonusMatchRequired == bonusMatch) .findFirst() - .orElse(null); + .orElse(DEFAULT); } // Getters (필요시 추가) From f33dfcdd0f6d42dc5126f2855fe34616d9f45597 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=EA=B9=80=EC=A3=BC=EC=96=B8?= Date: Mon, 4 Nov 2024 23:26:20 +0900 Subject: [PATCH 18/23] =?UTF-8?q?feat:=20=EC=88=98=EC=9D=B5=EB=A5=A0=20?= =?UTF-8?q?=EA=B3=84=EC=82=B0=20=EA=B8=B0=EB=8A=A5?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/main/java/lotto/model/ResultCalculator.java | 16 +++++++++++++++- 1 file changed, 15 insertions(+), 1 deletion(-) diff --git a/src/main/java/lotto/model/ResultCalculator.java b/src/main/java/lotto/model/ResultCalculator.java index b9c143b8b6..7f6de88275 100644 --- a/src/main/java/lotto/model/ResultCalculator.java +++ b/src/main/java/lotto/model/ResultCalculator.java @@ -5,7 +5,7 @@ public class ResultCalculator { private final LottoList lottoList; private final WinningNumbers winningNumbers; - private final Map rankCounts; // 클래스 변수로 이동 + private final Map rankCounts; public ResultCalculator(LottoList lottoList, WinningNumbers winningNumbers) { this.lottoList = lottoList; @@ -32,7 +32,21 @@ private int countMatches(Lotto lotto) { } return count; } + public double calculateProfitRate(int purchaseCost) { + double totalRevenue = 0; + for (Rank rank : rankCounts.keySet()) { + int count = rankCounts.get(rank); + totalRevenue += rank.getPrize() * count; + } + + double profitRate = ((totalRevenue - purchaseCost) / purchaseCost) * 100; + return Math.round(profitRate * 100) / 100.0; + } + + public Map getRankCounts() { + return rankCounts; + } } From a99082bed559b278d7f4336a4962870812e02fa1 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=EA=B9=80=EC=A3=BC=EC=96=B8?= Date: Mon, 4 Nov 2024 23:26:32 +0900 Subject: [PATCH 19/23] =?UTF-8?q?feat:=20=EC=88=98=EC=9D=B5=EB=A5=A0=20?= =?UTF-8?q?=EC=B6=9C=EB=A0=A5=20=EA=B8=B0=EB=8A=A5?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/main/java/lotto/view/OutputView.java | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/src/main/java/lotto/view/OutputView.java b/src/main/java/lotto/view/OutputView.java index fcfc6823b9..a713ee2af6 100644 --- a/src/main/java/lotto/view/OutputView.java +++ b/src/main/java/lotto/view/OutputView.java @@ -15,8 +15,13 @@ public void printLottoList(LottoList lottoList){ public void printLottoResults(ResultCalculator resultCalculator){ for (Rank rank : Rank.values()) { + if (rank.getPrize() == 0) continue; int count = resultCalculator.getRankCounts().getOrDefault(rank, 0); System.out.println(rank.getDescription() + count + "개"); } } + + public void printProfitRate(double profitRate){ + System.out.println("총 수익률은 " + profitRate + "%입니다."); + } } From de0b1d772eee3bb4b8c3dbb259400948d33512f6 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=EA=B9=80=EC=A3=BC=EC=96=B8?= Date: Mon, 4 Nov 2024 23:27:12 +0900 Subject: [PATCH 20/23] =?UTF-8?q?feat:=20Controller=20=EC=99=84=EC=84=B1?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../lotto/controller/LottoController.java | 31 +++++++++++++------ src/main/java/lotto/model/Amount.java | 4 +++ 2 files changed, 26 insertions(+), 9 deletions(-) diff --git a/src/main/java/lotto/controller/LottoController.java b/src/main/java/lotto/controller/LottoController.java index 792e663567..02e09171c8 100644 --- a/src/main/java/lotto/controller/LottoController.java +++ b/src/main/java/lotto/controller/LottoController.java @@ -1,29 +1,29 @@ package lotto.controller; -import lotto.model.Amount; -import lotto.model.LottoList; -import lotto.view.InputVIew; +import lotto.model.*; +import lotto.view.InputView; import lotto.view.OutputView; public class LottoController { - private final InputVIew inputVIew; + private final InputView inputView; private final OutputView outputView; private Amount amount; private LottoList lottoList; - public LottoController(InputVIew inputVIew, OutputView outputView) { - this.inputVIew = inputVIew; + public LottoController(InputView inputVIew, OutputView outputView) { + this.inputView = inputVIew; this.outputView = outputView; } public void startLotto(){ purchaseLotto(); + makeResult(); } // 구매 단계 private void purchaseLotto(){ // 개수 - String input = inputVIew.inputPurchaseAmount(); + String input = inputView.inputPurchaseAmount(); amount = new Amount(input); outputView.printCount(amount); @@ -33,6 +33,19 @@ private void purchaseLotto(){ } // 당첨 추첨 단계 - - // 결과 출력 단계 + private void makeResult(){ + // 당첨 번호 입력 + String numbers = inputView.inputLottoNumbers(); + String bonus = inputView.inputBonusNumbers(); + WinningNumbers winningNumbers = new WinningNumbers(numbers, bonus); + + // 당첨 결과 생성 + ResultCalculator resultCalculator = new ResultCalculator(lottoList, winningNumbers); + resultCalculator.calculateResults(); + + // 결과 출력 + outputView.printLottoResults(resultCalculator); + double profitRate = resultCalculator.calculateProfitRate(amount.getAmount()); + outputView.printProfitRate(profitRate); + } } diff --git a/src/main/java/lotto/model/Amount.java b/src/main/java/lotto/model/Amount.java index b49cba1bde..89567f18b5 100644 --- a/src/main/java/lotto/model/Amount.java +++ b/src/main/java/lotto/model/Amount.java @@ -25,4 +25,8 @@ private int parseInput(String input){ public int getCount(){ return this.count; } + + public int getAmount() { + return amount; + } } From 834d24f2bfef708252f7527d2fe9f9b8ddfa560f Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=EA=B9=80=EC=A3=BC=EC=96=B8?= Date: Mon, 4 Nov 2024 23:30:59 +0900 Subject: [PATCH 21/23] =?UTF-8?q?feat:=20=EB=A1=9C=EB=98=90=20=EB=B2=88?= =?UTF-8?q?=ED=98=B8=20=EC=98=A4=EB=A6=84=EC=B0=A8=EC=88=9C=20=EC=A0=95?= =?UTF-8?q?=EB=A0=AC?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/main/java/lotto/model/Lotto.java | 8 +++++++- 1 file changed, 7 insertions(+), 1 deletion(-) diff --git a/src/main/java/lotto/model/Lotto.java b/src/main/java/lotto/model/Lotto.java index 9fa3c4f4c1..d3b0992b4e 100644 --- a/src/main/java/lotto/model/Lotto.java +++ b/src/main/java/lotto/model/Lotto.java @@ -7,7 +7,8 @@ public class Lotto { public Lotto(List numbers) { validate(numbers); - this.numbers = numbers; + this.numbers = sortNumbers(numbers); + } private void validate(List numbers) { @@ -16,6 +17,11 @@ private void validate(List numbers) { } } + private List sortNumbers(List numbers){ + numbers.sort(Integer::compareTo); + return numbers; + } + public List getNumbers() { return numbers; } From 72bccde1e859a6d0b9c7ff9a2bc56ac09ab61223 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=EA=B9=80=EC=A3=BC=EC=96=B8?= Date: Mon, 4 Nov 2024 23:33:11 +0900 Subject: [PATCH 22/23] =?UTF-8?q?refactor:=20WinningNumbers=20=EB=A9=A4?= =?UTF-8?q?=EB=B2=84=20=EB=B3=80=EC=88=98=20final?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/main/java/lotto/model/WinningNumbers.java | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/main/java/lotto/model/WinningNumbers.java b/src/main/java/lotto/model/WinningNumbers.java index 541b33a124..e66a8a8220 100644 --- a/src/main/java/lotto/model/WinningNumbers.java +++ b/src/main/java/lotto/model/WinningNumbers.java @@ -5,8 +5,8 @@ import java.util.stream.Collectors; public class WinningNumbers { - private List winningNumbers; - private int bonusNumber; + private final List winningNumbers; + private final int bonusNumber; public WinningNumbers(String winningNumbersInput, String bonusNumberInput) { this.winningNumbers = parseStringToIntegerList(winningNumbersInput); From a5e087f0fde78623e026e671fa593e19557dfa44 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=EA=B9=80=EC=A3=BC=EC=96=B8?= Date: Mon, 4 Nov 2024 23:34:42 +0900 Subject: [PATCH 23/23] =?UTF-8?q?fix:=20=EC=BD=94=EB=93=9C=20=ED=8F=AC?= =?UTF-8?q?=EB=A7=B7=ED=8C=85?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/main/java/lotto/controller/LottoController.java | 6 +++--- src/main/java/lotto/model/Amount.java | 10 +++++----- src/main/java/lotto/model/Lotto.java | 2 +- src/main/java/lotto/model/LottoList.java | 6 +++--- src/main/java/lotto/model/Rank.java | 3 +-- src/main/java/lotto/model/ResultCalculator.java | 2 ++ src/main/java/lotto/model/WinningNumbers.java | 2 +- src/main/java/lotto/view/InputView.java | 4 ++-- src/main/java/lotto/view/OutputView.java | 8 ++++---- 9 files changed, 22 insertions(+), 21 deletions(-) diff --git a/src/main/java/lotto/controller/LottoController.java b/src/main/java/lotto/controller/LottoController.java index 02e09171c8..aa8b7a59ab 100644 --- a/src/main/java/lotto/controller/LottoController.java +++ b/src/main/java/lotto/controller/LottoController.java @@ -15,13 +15,13 @@ public LottoController(InputView inputVIew, OutputView outputView) { this.outputView = outputView; } - public void startLotto(){ + public void startLotto() { purchaseLotto(); makeResult(); } // 구매 단계 - private void purchaseLotto(){ + private void purchaseLotto() { // 개수 String input = inputView.inputPurchaseAmount(); amount = new Amount(input); @@ -33,7 +33,7 @@ private void purchaseLotto(){ } // 당첨 추첨 단계 - private void makeResult(){ + private void makeResult() { // 당첨 번호 입력 String numbers = inputView.inputLottoNumbers(); String bonus = inputView.inputBonusNumbers(); diff --git a/src/main/java/lotto/model/Amount.java b/src/main/java/lotto/model/Amount.java index 89567f18b5..35e6af53b0 100644 --- a/src/main/java/lotto/model/Amount.java +++ b/src/main/java/lotto/model/Amount.java @@ -5,24 +5,24 @@ public class Amount { private final int count; private final int UNIT_AMOUNT = 1000; - public Amount(String input){ + public Amount(String input) { int amountNumber = parseInput(input); validateDivisible(amountNumber); this.amount = amountNumber; this.count = amount / UNIT_AMOUNT; } - private void validateDivisible(int amountNumber){ - if(amountNumber % UNIT_AMOUNT != 0){ + private void validateDivisible(int amountNumber) { + if (amountNumber % UNIT_AMOUNT != 0) { throw new IllegalArgumentException("[ERROR] 로또는 개당 1000원 입니다."); } } - private int parseInput(String input){ + private int parseInput(String input) { return Integer.parseInt(input); } - public int getCount(){ + public int getCount() { return this.count; } diff --git a/src/main/java/lotto/model/Lotto.java b/src/main/java/lotto/model/Lotto.java index d3b0992b4e..c39e39b617 100644 --- a/src/main/java/lotto/model/Lotto.java +++ b/src/main/java/lotto/model/Lotto.java @@ -17,7 +17,7 @@ private void validate(List numbers) { } } - private List sortNumbers(List numbers){ + private List sortNumbers(List numbers) { numbers.sort(Integer::compareTo); return numbers; } diff --git a/src/main/java/lotto/model/LottoList.java b/src/main/java/lotto/model/LottoList.java index c9bce2f946..a27612d07f 100644 --- a/src/main/java/lotto/model/LottoList.java +++ b/src/main/java/lotto/model/LottoList.java @@ -6,15 +6,15 @@ import java.util.List; public class LottoList { - private List lottoList = new ArrayList<>(); + private final List lottoList = new ArrayList<>(); - public LottoList(int count){ + public LottoList(int count) { for (int i = 0; i < count; i++) { lottoList.add(new Lotto(makeNumbers())); } } - private List makeNumbers(){ + private List makeNumbers() { return Randoms.pickUniqueNumbersInRange(1, 45, 6); } diff --git a/src/main/java/lotto/model/Rank.java b/src/main/java/lotto/model/Rank.java index f616ed0d1e..2a47cdeac0 100644 --- a/src/main/java/lotto/model/Rank.java +++ b/src/main/java/lotto/model/Rank.java @@ -3,7 +3,7 @@ import java.util.Arrays; public enum Rank { - DEFAULT(6, 0,false,"3개 미만", 0), + DEFAULT(6, 0, false, "3개 미만", 0), FIFTH(5, 3, false, "3개 일치 (5,000원) - ", 5000), FOURTH(4, 4, false, "4개 일치 (50,000원) - ", 50000), THIRD(3, 5, false, "5개 일치 (1,500,000원) - ", 1500000), @@ -32,7 +32,6 @@ public static Rank getRank(int count, boolean bonusMatch) { .orElse(DEFAULT); } - // Getters (필요시 추가) public int getRank() { return rank; } diff --git a/src/main/java/lotto/model/ResultCalculator.java b/src/main/java/lotto/model/ResultCalculator.java index 7f6de88275..73e501129e 100644 --- a/src/main/java/lotto/model/ResultCalculator.java +++ b/src/main/java/lotto/model/ResultCalculator.java @@ -2,6 +2,7 @@ import java.util.HashMap; import java.util.Map; + public class ResultCalculator { private final LottoList lottoList; private final WinningNumbers winningNumbers; @@ -32,6 +33,7 @@ private int countMatches(Lotto lotto) { } return count; } + public double calculateProfitRate(int purchaseCost) { double totalRevenue = 0; diff --git a/src/main/java/lotto/model/WinningNumbers.java b/src/main/java/lotto/model/WinningNumbers.java index e66a8a8220..da6cc229f2 100644 --- a/src/main/java/lotto/model/WinningNumbers.java +++ b/src/main/java/lotto/model/WinningNumbers.java @@ -21,7 +21,7 @@ private List parseStringToIntegerList(String winningNumbers) { // 중복으로 들어가는 숫자 예외 처리 } - private int parseStringToInt(String bonusNumberInput){ + private int parseStringToInt(String bonusNumberInput) { return Integer.parseInt(bonusNumberInput); } diff --git a/src/main/java/lotto/view/InputView.java b/src/main/java/lotto/view/InputView.java index 934b0c2db0..18fffc1303 100644 --- a/src/main/java/lotto/view/InputView.java +++ b/src/main/java/lotto/view/InputView.java @@ -8,12 +8,12 @@ public String inputPurchaseAmount() { return Console.readLine(); } - public String inputLottoNumbers(){ + public String inputLottoNumbers() { System.out.println("당첨 번호를 입력해 주세요."); return Console.readLine(); } - public String inputBonusNumbers(){ + public String inputBonusNumbers() { System.out.println("보너스 번호를 입력해 주세요."); return Console.readLine(); } diff --git a/src/main/java/lotto/view/OutputView.java b/src/main/java/lotto/view/OutputView.java index a713ee2af6..e84e3c1e97 100644 --- a/src/main/java/lotto/view/OutputView.java +++ b/src/main/java/lotto/view/OutputView.java @@ -3,17 +3,17 @@ import lotto.model.*; public class OutputView { - public void printCount(Amount amount){ + public void printCount(Amount amount) { System.out.println(amount.getCount() + "개를 구입하셨습니다."); } - public void printLottoList(LottoList lottoList){ + public void printLottoList(LottoList lottoList) { for (Lotto lotto : lottoList.getLottoList()) { System.out.println(lotto.getNumbers()); } } - public void printLottoResults(ResultCalculator resultCalculator){ + public void printLottoResults(ResultCalculator resultCalculator) { for (Rank rank : Rank.values()) { if (rank.getPrize() == 0) continue; int count = resultCalculator.getRankCounts().getOrDefault(rank, 0); @@ -21,7 +21,7 @@ public void printLottoResults(ResultCalculator resultCalculator){ } } - public void printProfitRate(double profitRate){ + public void printProfitRate(double profitRate) { System.out.println("총 수익률은 " + profitRate + "%입니다."); } }