From 1446b8f4c672ef2cb30d4932b13f2753a1abfe69 Mon Sep 17 00:00:00 2001 From: great-park Date: Mon, 3 Apr 2023 21:00:55 +0900 Subject: [PATCH 01/18] branch test --- src/main/java/lotto/Application.java | 1 - 1 file changed, 1 deletion(-) diff --git a/src/main/java/lotto/Application.java b/src/main/java/lotto/Application.java index d190922ba4..3610d21572 100644 --- a/src/main/java/lotto/Application.java +++ b/src/main/java/lotto/Application.java @@ -2,6 +2,5 @@ public class Application { public static void main(String[] args) { - // TODO: 프로그램 구현 } } From 47f699ed6d1a2655cfe846f6d9fa8e6fec913885 Mon Sep 17 00:00:00 2001 From: great-park Date: Mon, 3 Apr 2023 21:06:39 +0900 Subject: [PATCH 02/18] =?UTF-8?q?feat:=20=EB=A1=9C=EB=98=90=20=EA=B5=AC?= =?UTF-8?q?=EC=9E=85=20=EA=B8=88=EC=95=A1=EA=B3=BC=20=EC=88=98=EB=8F=99=20?= =?UTF-8?q?=EB=A1=9C=EB=98=90=20=EA=B5=AC=EC=9E=85=20=EA=B0=9C=EC=88=98?= =?UTF-8?q?=EB=A5=BC=20=EC=9E=85=EB=A0=A5=20=EB=B0=9B=EB=8A=94=EB=8B=A4.?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/main/java/lotto/Application.java | 4 +++ .../lotto/controller/LottoController.java | 21 ++++++++++++ src/main/java/lotto/domain/LottoMoney.java | 26 +++++++++++++++ src/main/java/lotto/view/Input.java | 32 +++++++++++++++++++ 4 files changed, 83 insertions(+) create mode 100644 src/main/java/lotto/controller/LottoController.java create mode 100644 src/main/java/lotto/domain/LottoMoney.java create mode 100644 src/main/java/lotto/view/Input.java diff --git a/src/main/java/lotto/Application.java b/src/main/java/lotto/Application.java index 3610d21572..40fb6ddbc8 100644 --- a/src/main/java/lotto/Application.java +++ b/src/main/java/lotto/Application.java @@ -1,6 +1,10 @@ package lotto; +import lotto.controller.LottoController; + public class Application { public static void main(String[] args) { + LottoController lottoController = new LottoController(); + lottoController.start(); } } diff --git a/src/main/java/lotto/controller/LottoController.java b/src/main/java/lotto/controller/LottoController.java new file mode 100644 index 0000000000..d96c0ae197 --- /dev/null +++ b/src/main/java/lotto/controller/LottoController.java @@ -0,0 +1,21 @@ +package lotto.controller; + +import lotto.domain.LottoMoney; +import lotto.domain.Lottos; + +import static lotto.view.Input.insertLottoMoney; +import static lotto.view.Input.insertManualLottoCount; + +public class LottoController { + public void start() { + try { + LottoMoney money = new LottoMoney(insertLottoMoney()); + Lottos lottos = createLottos(money); + } catch (IllegalArgumentException error) { + } + } + + private Lottos createLottos(LottoMoney money) { + int manualLottoCount = insertManualLottoCount(); + } +} diff --git a/src/main/java/lotto/domain/LottoMoney.java b/src/main/java/lotto/domain/LottoMoney.java new file mode 100644 index 0000000000..6b291715ab --- /dev/null +++ b/src/main/java/lotto/domain/LottoMoney.java @@ -0,0 +1,26 @@ +package lotto.domain; + +public class LottoMoney { + private final String MONEY_MUST_OVER_1000 = "구매 금액은 1000원 이상을 입력해주세요."; + private final String MONEY_UNIT_IS_1000 = "구매 금액은 1000원 단위로 입력해주세요."; + private final int LOTTO_PRICE_UNIT = 1000; + private final int price; + + public LottoMoney(int price) { + validatePrice(price); + this.price = price; + } + + private void validatePrice(int price) { + if (price < LOTTO_PRICE_UNIT) { + throw new IllegalArgumentException(MONEY_MUST_OVER_1000); + } + if (price % LOTTO_PRICE_UNIT != 0) { + throw new IllegalArgumentException(MONEY_UNIT_IS_1000); + } + } + + public int getPrice() { + return price; + } +} diff --git a/src/main/java/lotto/view/Input.java b/src/main/java/lotto/view/Input.java new file mode 100644 index 0000000000..9f4eb61209 --- /dev/null +++ b/src/main/java/lotto/view/Input.java @@ -0,0 +1,32 @@ +package lotto.view; + +import camp.nextstep.edu.missionutils.Console; + +import static java.lang.Integer.parseInt; + +public class Input { + private static final String MONEY_REQUEST = "구입금액을 입력해 주세요."; + private static final String MANUAL_LOTTO_COUNT_REQUEST = "수동으로 구매할 로또 수를 입력해 주세요."; + private static final String INPUT_IS_NOT_NUMBER = "문자열이 아닌 숫자(정수)를 입력해주세요."; + + public static int insertLottoMoney() { + System.out.println(MONEY_REQUEST); + String lottoMoney = Console.readLine(); + + return checkNumber(lottoMoney); + } + + public static int insertManualLottoCount() { + System.out.println(MANUAL_LOTTO_COUNT_REQUEST); + String manualLottoCount = Console.readLine(); + + return checkNumber(manualLottoCount); + } + + private static int checkNumber(String input) { + if (!input.chars().allMatch(Character::isDigit)) { + throw new IllegalArgumentException(INPUT_IS_NOT_NUMBER); + } + return parseInt(input); + } +} From e4a20f7454db33b7e5fa7012d36b88aa75975ea0 Mon Sep 17 00:00:00 2001 From: great-park Date: Mon, 3 Apr 2023 22:07:15 +0900 Subject: [PATCH 03/18] =?UTF-8?q?feat:=20=EC=88=98=EB=8F=99=20=EB=A1=9C?= =?UTF-8?q?=EB=98=90=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=EB=8B=A4.?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../lotto/controller/LottoController.java | 9 ++--- src/main/java/lotto/domain/LottoFactory.java | 14 ++++++++ src/main/java/lotto/domain/LottoMachine.java | 35 +++++++++++++++++++ src/main/java/lotto/view/Input.java | 28 +++++++++++++++ 4 files changed, 82 insertions(+), 4 deletions(-) create mode 100644 src/main/java/lotto/domain/LottoFactory.java create mode 100644 src/main/java/lotto/domain/LottoMachine.java diff --git a/src/main/java/lotto/controller/LottoController.java b/src/main/java/lotto/controller/LottoController.java index d96c0ae197..e05b09a4a6 100644 --- a/src/main/java/lotto/controller/LottoController.java +++ b/src/main/java/lotto/controller/LottoController.java @@ -1,5 +1,6 @@ package lotto.controller; +import lotto.domain.LottoMachine; import lotto.domain.LottoMoney; import lotto.domain.Lottos; @@ -7,15 +8,15 @@ import static lotto.view.Input.insertManualLottoCount; public class LottoController { + + private final LottoMachine lottoMachine = new LottoMachine(); + public void start() { try { LottoMoney money = new LottoMoney(insertLottoMoney()); - Lottos lottos = createLottos(money); + Lottos lottos = lottoMachine.createLottos(money, insertManualLottoCount()); } catch (IllegalArgumentException error) { } } - private Lottos createLottos(LottoMoney money) { - int manualLottoCount = insertManualLottoCount(); - } } diff --git a/src/main/java/lotto/domain/LottoFactory.java b/src/main/java/lotto/domain/LottoFactory.java new file mode 100644 index 0000000000..7f5631cd4e --- /dev/null +++ b/src/main/java/lotto/domain/LottoFactory.java @@ -0,0 +1,14 @@ +package lotto.domain; + +import java.util.List; + +public class LottoFactory { + + public Lotto createManualLotto(List numbers) { + return null; + } + + public Lotto createAutoLotto() { + return null; + } +} diff --git a/src/main/java/lotto/domain/LottoMachine.java b/src/main/java/lotto/domain/LottoMachine.java new file mode 100644 index 0000000000..3190ee38af --- /dev/null +++ b/src/main/java/lotto/domain/LottoMachine.java @@ -0,0 +1,35 @@ +package lotto.domain; + +import java.util.ArrayList; +import java.util.List; + +import static lotto.view.Input.insertManualLottoCount; +import static lotto.view.Input.insertManualLottoNumbers; + +public class LottoMachine { + private final LottoFactory lottoFactory = new LottoFactory(); + public Lottos createLottos(LottoMoney money, int manualLottoCount) { + List manualLottos = createManualLottos(manualLottoCount); + // List autoLottos = createAutoLottos(money.getTotalLottoCount() - manualLottos.size()); + + + } + + private List createManualLottos(int manualLottoCount) { + List manualLottos = new ArrayList<>(); + for (int i = 0; i < manualLottoCount; i++){ + List numbers = insertManualLottoNumbers(); + Lotto manualLotto = lottoFactory.createManualLotto(numbers); + manualLottos.add(manualLotto); + } + return manualLottos; + } + +// private List createAutoLottos(int autoLottoCount) { +// List autoLottos = new ArrayList<>(); +// for (int i = 0; i < autoLottoCount; i++) { +// List numbers = +// } +// } + +} diff --git a/src/main/java/lotto/view/Input.java b/src/main/java/lotto/view/Input.java index 9f4eb61209..8512922a22 100644 --- a/src/main/java/lotto/view/Input.java +++ b/src/main/java/lotto/view/Input.java @@ -2,12 +2,17 @@ import camp.nextstep.edu.missionutils.Console; +import java.util.*; +import java.util.stream.Collectors; + import static java.lang.Integer.parseInt; public class Input { private static final String MONEY_REQUEST = "구입금액을 입력해 주세요."; private static final String MANUAL_LOTTO_COUNT_REQUEST = "수동으로 구매할 로또 수를 입력해 주세요."; + private static final String MANUAL_LOTTO_NUMBERS_REQUEST = "수동으로 구매할 번호를 입력해 주세요."; private static final String INPUT_IS_NOT_NUMBER = "문자열이 아닌 숫자(정수)를 입력해주세요."; + private static final String DUPLICATE_MANUAL_LOTTO_NUMBERS = "수동 로또 번호 중 중복된 번호가 있습니다."; public static int insertLottoMoney() { System.out.println(MONEY_REQUEST); @@ -23,6 +28,29 @@ public static int insertManualLottoCount() { return checkNumber(manualLottoCount); } + public static List insertManualLottoNumbers() { + System.out.println(MANUAL_LOTTO_NUMBERS_REQUEST); + String manualLottoNumbersInput = Console.readLine(); + List manualLottoNumbers = new ArrayList<>(Arrays.asList(manualLottoNumbersInput.trim().split(","))); + validateManualLottoNumbers(manualLottoNumbers); + + return manualLottoNumbers.stream() + .map(Integer::parseInt) + .collect(Collectors.toList()); + } + + private static void validateManualLottoNumbers(List manualLottoNumbers) { + manualLottoNumbers.forEach(Input::checkNumber); + validateDuplicateManualLottoNumbers(manualLottoNumbers); + } + + private static void validateDuplicateManualLottoNumbers(List manualLottoNumbers) { + Set uniqueManualLottoNumbers = new HashSet<>(manualLottoNumbers); + if (uniqueManualLottoNumbers.size() != manualLottoNumbers.size()) { + throw new IllegalArgumentException(DUPLICATE_MANUAL_LOTTO_NUMBERS); + } + } + private static int checkNumber(String input) { if (!input.chars().allMatch(Character::isDigit)) { throw new IllegalArgumentException(INPUT_IS_NOT_NUMBER); From 323ba51398af1c92b277e73be685417ed6995f1a Mon Sep 17 00:00:00 2001 From: great-park Date: Mon, 3 Apr 2023 22:18:49 +0900 Subject: [PATCH 04/18] =?UTF-8?q?feat:=20=EC=88=98=EB=8F=99=20=EB=A1=9C?= =?UTF-8?q?=EB=98=90=EC=99=80=20=EC=9E=90=EB=8F=99=20=EB=A1=9C=EB=98=90?= =?UTF-8?q?=EB=A5=BC=20=EC=83=9D=EC=84=B1=ED=95=9C=EB=8B=A4.?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/main/java/lotto/domain/Lotto.java | 31 ++++++++++++++++++++ src/main/java/lotto/domain/LottoFactory.java | 4 +-- src/main/java/lotto/domain/LottoMachine.java | 18 +++++++----- src/main/java/lotto/domain/LottoMoney.java | 4 +++ 4 files changed, 48 insertions(+), 9 deletions(-) create mode 100644 src/main/java/lotto/domain/Lotto.java diff --git a/src/main/java/lotto/domain/Lotto.java b/src/main/java/lotto/domain/Lotto.java new file mode 100644 index 0000000000..5b58dcc79a --- /dev/null +++ b/src/main/java/lotto/domain/Lotto.java @@ -0,0 +1,31 @@ +package lotto.domain; + +import camp.nextstep.edu.missionutils.Randoms; + +import java.util.List; +import java.util.stream.Collectors; + +public class Lotto { + private final int MINIMUM_LOTTO_NUMBER = 1; + private final int MAXIMUM_LOTTO_NUMBER = 45; + private final int LOTTO_TOTAL_COUNT = 6; + + private final List numbers; + + public Lotto(List numbers) { + this.numbers = numbers.stream() + .sorted() + .collect(Collectors.toList()); + } + + public Lotto() { + this.numbers = Randoms.pickUniqueNumbersInRange(MINIMUM_LOTTO_NUMBER, MAXIMUM_LOTTO_NUMBER, LOTTO_TOTAL_COUNT) + .stream() + .sorted() + .collect(Collectors.toList()); + } + + public List getNumbers() { + return this.numbers; + } +} diff --git a/src/main/java/lotto/domain/LottoFactory.java b/src/main/java/lotto/domain/LottoFactory.java index 7f5631cd4e..f8ba6aeac5 100644 --- a/src/main/java/lotto/domain/LottoFactory.java +++ b/src/main/java/lotto/domain/LottoFactory.java @@ -5,10 +5,10 @@ public class LottoFactory { public Lotto createManualLotto(List numbers) { - return null; + return new Lotto(numbers); } public Lotto createAutoLotto() { - return null; + return new Lotto(); } } diff --git a/src/main/java/lotto/domain/LottoMachine.java b/src/main/java/lotto/domain/LottoMachine.java index 3190ee38af..30647090c7 100644 --- a/src/main/java/lotto/domain/LottoMachine.java +++ b/src/main/java/lotto/domain/LottoMachine.java @@ -10,7 +10,7 @@ public class LottoMachine { private final LottoFactory lottoFactory = new LottoFactory(); public Lottos createLottos(LottoMoney money, int manualLottoCount) { List manualLottos = createManualLottos(manualLottoCount); - // List autoLottos = createAutoLottos(money.getTotalLottoCount() - manualLottos.size()); + List autoLottos = createAutoLottos(money.getTotalLottoCount() - manualLottos.size()); } @@ -22,14 +22,18 @@ private List createManualLottos(int manualLottoCount) { Lotto manualLotto = lottoFactory.createManualLotto(numbers); manualLottos.add(manualLotto); } + return manualLottos; } -// private List createAutoLottos(int autoLottoCount) { -// List autoLottos = new ArrayList<>(); -// for (int i = 0; i < autoLottoCount; i++) { -// List numbers = -// } -// } + private List createAutoLottos(int autoLottoCount) { + List autoLottos = new ArrayList<>(); + for (int i = 0; i < autoLottoCount; i++) { + Lotto autoLotto = lottoFactory.createAutoLotto(); + autoLottos.add(autoLotto); + } + + return autoLottos; + } } diff --git a/src/main/java/lotto/domain/LottoMoney.java b/src/main/java/lotto/domain/LottoMoney.java index 6b291715ab..4a6e0b20ab 100644 --- a/src/main/java/lotto/domain/LottoMoney.java +++ b/src/main/java/lotto/domain/LottoMoney.java @@ -23,4 +23,8 @@ private void validatePrice(int price) { public int getPrice() { return price; } + + public int getTotalLottoCount() { + return price % LOTTO_PRICE_UNIT; + } } From e5d31f435e0b49d941b9301a92d950127295bebe Mon Sep 17 00:00:00 2001 From: great-park Date: Mon, 3 Apr 2023 22:26:06 +0900 Subject: [PATCH 05/18] =?UTF-8?q?feat:=20=EC=B5=9C=EC=A2=85=EC=A0=81?= =?UTF-8?q?=EC=9C=BC=EB=A1=9C=20=EA=B5=AC=EB=A7=A4=ED=95=9C=20=EB=A1=9C?= =?UTF-8?q?=EB=98=90=EC=9D=98=20=EA=B2=B0=EA=B3=BC=EB=A5=BC=20=EC=83=9D?= =?UTF-8?q?=EC=84=B1=ED=95=9C=EB=8B=A4.?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/main/java/lotto/domain/LottoMachine.java | 6 +++--- src/main/java/lotto/domain/Lottos.java | 20 ++++++++++++++++++++ 2 files changed, 23 insertions(+), 3 deletions(-) create mode 100644 src/main/java/lotto/domain/Lottos.java diff --git a/src/main/java/lotto/domain/LottoMachine.java b/src/main/java/lotto/domain/LottoMachine.java index 30647090c7..7a9bac8d55 100644 --- a/src/main/java/lotto/domain/LottoMachine.java +++ b/src/main/java/lotto/domain/LottoMachine.java @@ -3,21 +3,21 @@ import java.util.ArrayList; import java.util.List; -import static lotto.view.Input.insertManualLottoCount; import static lotto.view.Input.insertManualLottoNumbers; public class LottoMachine { private final LottoFactory lottoFactory = new LottoFactory(); + public Lottos createLottos(LottoMoney money, int manualLottoCount) { List manualLottos = createManualLottos(manualLottoCount); List autoLottos = createAutoLottos(money.getTotalLottoCount() - manualLottos.size()); - + return new Lottos(manualLottos, autoLottos); } private List createManualLottos(int manualLottoCount) { List manualLottos = new ArrayList<>(); - for (int i = 0; i < manualLottoCount; i++){ + for (int i = 0; i < manualLottoCount; i++) { List numbers = insertManualLottoNumbers(); Lotto manualLotto = lottoFactory.createManualLotto(numbers); manualLottos.add(manualLotto); diff --git a/src/main/java/lotto/domain/Lottos.java b/src/main/java/lotto/domain/Lottos.java new file mode 100644 index 0000000000..f08448a0c5 --- /dev/null +++ b/src/main/java/lotto/domain/Lottos.java @@ -0,0 +1,20 @@ +package lotto.domain; + +import java.util.ArrayList; +import java.util.List; + +public class Lottos { + private List lottos; + private Integer manualLottoCount; + private Integer autoLottoCount; + + public Lottos(List manualLottos, List autoLottos) { + List lottos = new ArrayList<>(); + lottos.addAll(manualLottos); + lottos.addAll(autoLottos); + + this.lottos = lottos; + this.manualLottoCount = manualLottos.size(); + this.autoLottoCount = autoLottos.size(); + } +} From f95656471611a86825ed7a00bd75920472537e71 Mon Sep 17 00:00:00 2001 From: great-park Date: Mon, 3 Apr 2023 22:26:57 +0900 Subject: [PATCH 06/18] =?UTF-8?q?feat:=20=EC=98=A4=EB=A5=98=20=EB=A9=94?= =?UTF-8?q?=EC=8B=9C=EC=A7=80=EB=A5=BC=20=EC=B6=9C=EB=A0=A5=ED=95=9C?= =?UTF-8?q?=EB=8B=A4.?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/main/java/lotto/controller/LottoController.java | 2 ++ src/main/java/lotto/view/Output.java | 7 +++++++ 2 files changed, 9 insertions(+) create mode 100644 src/main/java/lotto/view/Output.java diff --git a/src/main/java/lotto/controller/LottoController.java b/src/main/java/lotto/controller/LottoController.java index e05b09a4a6..2f2d532068 100644 --- a/src/main/java/lotto/controller/LottoController.java +++ b/src/main/java/lotto/controller/LottoController.java @@ -6,6 +6,7 @@ import static lotto.view.Input.insertLottoMoney; import static lotto.view.Input.insertManualLottoCount; +import static lotto.view.Output.printErrorMessage; public class LottoController { @@ -16,6 +17,7 @@ public void start() { LottoMoney money = new LottoMoney(insertLottoMoney()); Lottos lottos = lottoMachine.createLottos(money, insertManualLottoCount()); } catch (IllegalArgumentException error) { + printErrorMessage(error.getMessage()); } } diff --git a/src/main/java/lotto/view/Output.java b/src/main/java/lotto/view/Output.java new file mode 100644 index 0000000000..621f69b90b --- /dev/null +++ b/src/main/java/lotto/view/Output.java @@ -0,0 +1,7 @@ +package lotto.view; + +public class Output { + public static void printErrorMessage(String errorMessage) { + System.out.println("[ERROR] " + errorMessage); + } +} From 6f9a540555d22b13096a9c9b4ff4ecd0787c5cb4 Mon Sep 17 00:00:00 2001 From: great-park Date: Mon, 3 Apr 2023 22:34:50 +0900 Subject: [PATCH 07/18] =?UTF-8?q?feat:=20=EB=A1=9C=EB=98=90=20=EC=88=98?= =?UTF-8?q?=EB=9F=89=EA=B3=BC=20=EA=B0=81=20=EB=A1=9C=EB=98=90=EC=9D=98=20?= =?UTF-8?q?=EC=88=AB=EC=9E=90=EB=A5=BC=20=EC=B6=9C=EB=A0=A5=ED=95=9C?= =?UTF-8?q?=EB=8B=A4.?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../lotto/controller/LottoController.java | 6 ++--- src/main/java/lotto/domain/Lottos.java | 12 ++++++++++ src/main/java/lotto/view/Output.java | 24 +++++++++++++++++++ 3 files changed, 39 insertions(+), 3 deletions(-) diff --git a/src/main/java/lotto/controller/LottoController.java b/src/main/java/lotto/controller/LottoController.java index 2f2d532068..8eb50934a7 100644 --- a/src/main/java/lotto/controller/LottoController.java +++ b/src/main/java/lotto/controller/LottoController.java @@ -4,9 +4,8 @@ import lotto.domain.LottoMoney; import lotto.domain.Lottos; -import static lotto.view.Input.insertLottoMoney; -import static lotto.view.Input.insertManualLottoCount; -import static lotto.view.Output.printErrorMessage; +import static lotto.view.Input.*; +import static lotto.view.Output.*; public class LottoController { @@ -16,6 +15,7 @@ public void start() { try { LottoMoney money = new LottoMoney(insertLottoMoney()); Lottos lottos = lottoMachine.createLottos(money, insertManualLottoCount()); + printLottos(lottos); } catch (IllegalArgumentException error) { printErrorMessage(error.getMessage()); } diff --git a/src/main/java/lotto/domain/Lottos.java b/src/main/java/lotto/domain/Lottos.java index f08448a0c5..fab3d49e72 100644 --- a/src/main/java/lotto/domain/Lottos.java +++ b/src/main/java/lotto/domain/Lottos.java @@ -17,4 +17,16 @@ public Lottos(List manualLottos, List autoLottos) { this.manualLottoCount = manualLottos.size(); this.autoLottoCount = autoLottos.size(); } + + public int getManualLottoCount() { + return manualLottoCount; + } + + public int getAutoLottoCount() { + return autoLottoCount; + } + + public List getLottos() { + return lottos; + } } diff --git a/src/main/java/lotto/view/Output.java b/src/main/java/lotto/view/Output.java index 621f69b90b..3bc77c42cf 100644 --- a/src/main/java/lotto/view/Output.java +++ b/src/main/java/lotto/view/Output.java @@ -1,7 +1,31 @@ package lotto.view; +import lotto.domain.Lotto; +import lotto.domain.Lottos; + +import java.util.List; + public class Output { public static void printErrorMessage(String errorMessage) { System.out.println("[ERROR] " + errorMessage); } + + public static void printLottos(Lottos lottos) { + printLottosCount(lottos); + printLottoNumbers(lottos); + } + + private static void printLottosCount(Lottos lottos) { + int manualLottoCount = lottos.getManualLottoCount(); + int autoLottoCount = lottos.getAutoLottoCount(); + System.out.printf("수동으로 %d장, 자동으로 %d개를 구매했습니다.", manualLottoCount, autoLottoCount); + } + + private static void printLottoNumbers(Lottos lottos) { + List lottoList = lottos.getLottos(); + + lottoList.stream() + .map(Lotto::getNumbers) + .forEach(System.out::println); + } } From a021a53acc06f8c7b89cafdbd5a955f99dad1370 Mon Sep 17 00:00:00 2001 From: great-park Date: Mon, 3 Apr 2023 22:50:17 +0900 Subject: [PATCH 08/18] =?UTF-8?q?fix:=20=EC=88=98=EB=8F=99=20=EB=A1=9C?= =?UTF-8?q?=EB=98=90=20=EB=B2=88=ED=98=B8=20=EB=8B=B4=EA=B8=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/main/java/lotto/domain/LottoMachine.java | 2 ++ src/main/java/lotto/view/Input.java | 4 +--- src/main/java/lotto/view/Output.java | 8 +++++++- 3 files changed, 10 insertions(+), 4 deletions(-) diff --git a/src/main/java/lotto/domain/LottoMachine.java b/src/main/java/lotto/domain/LottoMachine.java index 7a9bac8d55..f93c54c0dc 100644 --- a/src/main/java/lotto/domain/LottoMachine.java +++ b/src/main/java/lotto/domain/LottoMachine.java @@ -4,6 +4,7 @@ import java.util.List; import static lotto.view.Input.insertManualLottoNumbers; +import static lotto.view.Output.printInsertManualLottoNumbersRequest; public class LottoMachine { private final LottoFactory lottoFactory = new LottoFactory(); @@ -17,6 +18,7 @@ public Lottos createLottos(LottoMoney money, int manualLottoCount) { private List createManualLottos(int manualLottoCount) { List manualLottos = new ArrayList<>(); + printInsertManualLottoNumbersRequest(); for (int i = 0; i < manualLottoCount; i++) { List numbers = insertManualLottoNumbers(); Lotto manualLotto = lottoFactory.createManualLotto(numbers); diff --git a/src/main/java/lotto/view/Input.java b/src/main/java/lotto/view/Input.java index 8512922a22..627f3e46f4 100644 --- a/src/main/java/lotto/view/Input.java +++ b/src/main/java/lotto/view/Input.java @@ -10,7 +10,6 @@ public class Input { private static final String MONEY_REQUEST = "구입금액을 입력해 주세요."; private static final String MANUAL_LOTTO_COUNT_REQUEST = "수동으로 구매할 로또 수를 입력해 주세요."; - private static final String MANUAL_LOTTO_NUMBERS_REQUEST = "수동으로 구매할 번호를 입력해 주세요."; private static final String INPUT_IS_NOT_NUMBER = "문자열이 아닌 숫자(정수)를 입력해주세요."; private static final String DUPLICATE_MANUAL_LOTTO_NUMBERS = "수동 로또 번호 중 중복된 번호가 있습니다."; @@ -29,9 +28,8 @@ public static int insertManualLottoCount() { } public static List insertManualLottoNumbers() { - System.out.println(MANUAL_LOTTO_NUMBERS_REQUEST); String manualLottoNumbersInput = Console.readLine(); - List manualLottoNumbers = new ArrayList<>(Arrays.asList(manualLottoNumbersInput.trim().split(","))); + List manualLottoNumbers = Arrays.asList(manualLottoNumbersInput.split("\\s*,\\s*")); validateManualLottoNumbers(manualLottoNumbers); return manualLottoNumbers.stream() diff --git a/src/main/java/lotto/view/Output.java b/src/main/java/lotto/view/Output.java index 3bc77c42cf..2c8012a6df 100644 --- a/src/main/java/lotto/view/Output.java +++ b/src/main/java/lotto/view/Output.java @@ -6,10 +6,16 @@ import java.util.List; public class Output { + private static final String MANUAL_LOTTO_NUMBERS_REQUEST = "수동으로 구매할 번호를 입력해 주세요."; + public static void printErrorMessage(String errorMessage) { System.out.println("[ERROR] " + errorMessage); } + public static void printInsertManualLottoNumbersRequest() { + System.out.println(MANUAL_LOTTO_NUMBERS_REQUEST); + } + public static void printLottos(Lottos lottos) { printLottosCount(lottos); printLottoNumbers(lottos); @@ -18,7 +24,7 @@ public static void printLottos(Lottos lottos) { private static void printLottosCount(Lottos lottos) { int manualLottoCount = lottos.getManualLottoCount(); int autoLottoCount = lottos.getAutoLottoCount(); - System.out.printf("수동으로 %d장, 자동으로 %d개를 구매했습니다.", manualLottoCount, autoLottoCount); + System.out.printf("수동으로 %d장, 자동으로 %d개를 구매했습니다.\n", manualLottoCount, autoLottoCount); } private static void printLottoNumbers(Lottos lottos) { From c25f06e73ca1fcebf5859b17af94e07c40265660 Mon Sep 17 00:00:00 2001 From: great-park Date: Tue, 4 Apr 2023 19:01:51 +0900 Subject: [PATCH 09/18] =?UTF-8?q?fix:=20=EC=B4=9D=20=EB=A1=9C=EB=98=90=20?= =?UTF-8?q?=EA=B5=AC=EC=9E=85=20=EA=B0=9C=EC=88=98=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/domain/LottoMoney.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/main/java/lotto/domain/LottoMoney.java b/src/main/java/lotto/domain/LottoMoney.java index 4a6e0b20ab..bdf137a5e9 100644 --- a/src/main/java/lotto/domain/LottoMoney.java +++ b/src/main/java/lotto/domain/LottoMoney.java @@ -25,6 +25,6 @@ public int getPrice() { } public int getTotalLottoCount() { - return price % LOTTO_PRICE_UNIT; + return price / LOTTO_PRICE_UNIT; } } From e64dfd8d27e17b020d63cf5de25c6154c644f199 Mon Sep 17 00:00:00 2001 From: great-park Date: Tue, 4 Apr 2023 19:16:29 +0900 Subject: [PATCH 10/18] =?UTF-8?q?refactor:=20=ED=99=95=EC=9E=A5=EC=84=B1?= =?UTF-8?q?=EC=9D=84=20=EC=9C=84=ED=95=B4=20=EB=84=A4=EC=9D=B4=EB=B0=8D=20?= =?UTF-8?q?=EB=B3=80=EA=B2=BD?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/main/java/lotto/view/Input.java | 26 +++++++++++++------------- 1 file changed, 13 insertions(+), 13 deletions(-) diff --git a/src/main/java/lotto/view/Input.java b/src/main/java/lotto/view/Input.java index 627f3e46f4..57a43806c8 100644 --- a/src/main/java/lotto/view/Input.java +++ b/src/main/java/lotto/view/Input.java @@ -11,7 +11,7 @@ public class Input { private static final String MONEY_REQUEST = "구입금액을 입력해 주세요."; private static final String MANUAL_LOTTO_COUNT_REQUEST = "수동으로 구매할 로또 수를 입력해 주세요."; private static final String INPUT_IS_NOT_NUMBER = "문자열이 아닌 숫자(정수)를 입력해주세요."; - private static final String DUPLICATE_MANUAL_LOTTO_NUMBERS = "수동 로또 번호 중 중복된 번호가 있습니다."; + private static final String DUPLICATE_LOTTO_NUMBERS = "로또 번호 중 중복된 번호가 있습니다."; public static int insertLottoMoney() { System.out.println(MONEY_REQUEST); @@ -27,25 +27,25 @@ public static int insertManualLottoCount() { return checkNumber(manualLottoCount); } - public static List insertManualLottoNumbers() { - String manualLottoNumbersInput = Console.readLine(); - List manualLottoNumbers = Arrays.asList(manualLottoNumbersInput.split("\\s*,\\s*")); - validateManualLottoNumbers(manualLottoNumbers); + public static List insertLottoNumbers() { + String lottoNumbersInput = Console.readLine(); + List lottoNumbers = Arrays.asList(lottoNumbersInput.split("\\s*,\\s*")); + validateLottoNumbers(lottoNumbers); - return manualLottoNumbers.stream() + return lottoNumbers.stream() .map(Integer::parseInt) .collect(Collectors.toList()); } - private static void validateManualLottoNumbers(List manualLottoNumbers) { - manualLottoNumbers.forEach(Input::checkNumber); - validateDuplicateManualLottoNumbers(manualLottoNumbers); + private static void validateLottoNumbers(List lottoNumbers) { + lottoNumbers.forEach(Input::checkNumber); + validateDuplicateLottoNumbers(lottoNumbers); } - private static void validateDuplicateManualLottoNumbers(List manualLottoNumbers) { - Set uniqueManualLottoNumbers = new HashSet<>(manualLottoNumbers); - if (uniqueManualLottoNumbers.size() != manualLottoNumbers.size()) { - throw new IllegalArgumentException(DUPLICATE_MANUAL_LOTTO_NUMBERS); + private static void validateDuplicateLottoNumbers(List lottoNumbers) { + Set uniqueLottoNumbers = new HashSet<>(lottoNumbers); + if (uniqueLottoNumbers.size() != lottoNumbers.size()) { + throw new IllegalArgumentException(DUPLICATE_LOTTO_NUMBERS); } } From 68faf17d678eaf69a52c7f5e79cdfa40bf29f8c9 Mon Sep 17 00:00:00 2001 From: great-park Date: Tue, 4 Apr 2023 19:46:51 +0900 Subject: [PATCH 11/18] =?UTF-8?q?feat:=20=EB=8B=B9=EC=B2=A8=20=EB=B2=88?= =?UTF-8?q?=ED=98=B8=EC=99=80=20=EB=B3=B4=EB=84=88=EC=8A=A4=20=EB=B2=88?= =?UTF-8?q?=ED=98=B8=EB=A5=BC=20=EC=83=9D=EC=84=B1=ED=95=9C=EB=8B=A4.?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../lotto/controller/LottoController.java | 6 ++++ src/main/java/lotto/domain/LottoMachine.java | 27 +++++++++++++-- src/main/java/lotto/domain/NumberType.java | 6 ++++ src/main/java/lotto/domain/WinningNumber.java | 14 ++++++++ src/main/java/lotto/view/Input.java | 33 +++++++++++++++++-- 5 files changed, 82 insertions(+), 4 deletions(-) create mode 100644 src/main/java/lotto/domain/NumberType.java create mode 100644 src/main/java/lotto/domain/WinningNumber.java diff --git a/src/main/java/lotto/controller/LottoController.java b/src/main/java/lotto/controller/LottoController.java index 8eb50934a7..853edf2f18 100644 --- a/src/main/java/lotto/controller/LottoController.java +++ b/src/main/java/lotto/controller/LottoController.java @@ -3,6 +3,9 @@ import lotto.domain.LottoMachine; import lotto.domain.LottoMoney; import lotto.domain.Lottos; +import lotto.domain.WinningNumber; + +import java.util.List; import static lotto.view.Input.*; import static lotto.view.Output.*; @@ -16,6 +19,9 @@ public void start() { LottoMoney money = new LottoMoney(insertLottoMoney()); Lottos lottos = lottoMachine.createLottos(money, insertManualLottoCount()); printLottos(lottos); + List winningNumbers = lottoMachine + .createWinningNumbers(insertNormalWinningNumbers(), insertBonusWinningNumber()); + printLottoResult(lottos, winningNumbers); } catch (IllegalArgumentException error) { printErrorMessage(error.getMessage()); } diff --git a/src/main/java/lotto/domain/LottoMachine.java b/src/main/java/lotto/domain/LottoMachine.java index f93c54c0dc..061ac8bd19 100644 --- a/src/main/java/lotto/domain/LottoMachine.java +++ b/src/main/java/lotto/domain/LottoMachine.java @@ -3,7 +3,7 @@ import java.util.ArrayList; import java.util.List; -import static lotto.view.Input.insertManualLottoNumbers; +import static lotto.view.Input.insertLottoNumbers; import static lotto.view.Output.printInsertManualLottoNumbersRequest; public class LottoMachine { @@ -20,7 +20,7 @@ private List createManualLottos(int manualLottoCount) { List manualLottos = new ArrayList<>(); printInsertManualLottoNumbersRequest(); for (int i = 0; i < manualLottoCount; i++) { - List numbers = insertManualLottoNumbers(); + List numbers = insertLottoNumbers(); Lotto manualLotto = lottoFactory.createManualLotto(numbers); manualLottos.add(manualLotto); } @@ -38,4 +38,27 @@ private List createAutoLottos(int autoLottoCount) { return autoLottos; } + public List createWinningNumbers(List normalNumbers, Integer bonusNumber) { + List totalWinningNumbers = new ArrayList<>(); + List normalWinningNumbers = createNormalWinningNumbers(normalNumbers); + WinningNumber bonusWinningNumber = createBonusNumber(bonusNumber); + + totalWinningNumbers.addAll(normalWinningNumbers); + totalWinningNumbers.add(bonusWinningNumber); + + return totalWinningNumbers; + } + + private List createNormalWinningNumbers(List normalNumbers) { + List result = new ArrayList<>(); + for(Integer number : normalNumbers) { + WinningNumber normalNumber = new WinningNumber(number, NumberType.NORMAL); + result.add(normalNumber); + } + return result; + } + + private WinningNumber createBonusNumber(Integer bonusNumber) { + return new WinningNumber(bonusNumber, NumberType.BOUNS); + } } diff --git a/src/main/java/lotto/domain/NumberType.java b/src/main/java/lotto/domain/NumberType.java new file mode 100644 index 0000000000..e8fa111028 --- /dev/null +++ b/src/main/java/lotto/domain/NumberType.java @@ -0,0 +1,6 @@ +package lotto.domain; + +public enum NumberType { + BOUNS, + NORMAL +} diff --git a/src/main/java/lotto/domain/WinningNumber.java b/src/main/java/lotto/domain/WinningNumber.java new file mode 100644 index 0000000000..717958f44d --- /dev/null +++ b/src/main/java/lotto/domain/WinningNumber.java @@ -0,0 +1,14 @@ +package lotto.domain; + +import java.util.List; + +public class WinningNumber { + private final Integer number; + private final NumberType type; + + public WinningNumber(Integer number, NumberType type) { + this.number = number; + this.type = type; + } + +} diff --git a/src/main/java/lotto/view/Input.java b/src/main/java/lotto/view/Input.java index 57a43806c8..25b3e886e6 100644 --- a/src/main/java/lotto/view/Input.java +++ b/src/main/java/lotto/view/Input.java @@ -12,6 +12,11 @@ public class Input { private static final String MANUAL_LOTTO_COUNT_REQUEST = "수동으로 구매할 로또 수를 입력해 주세요."; private static final String INPUT_IS_NOT_NUMBER = "문자열이 아닌 숫자(정수)를 입력해주세요."; private static final String DUPLICATE_LOTTO_NUMBERS = "로또 번호 중 중복된 번호가 있습니다."; + private static final int LOTTO_MIN_NUMBER = 1; + private static final int LOTTO_MAX_NUMBER = 45; + private static final String LOTTO_NUMBER_OUT_OF_RANGE = "로또 번호는 1부터 45사이의 숫자여야 합니다."; + private static final String BONUS_WINNING_NUMBER_REQUEST = "보너스 볼을 입력해 주세요."; + private static final String NORMAL_WINNING_NUMBERS_REQUEST = "지난 주 당첨 번호를 입력해 주세요."; public static int insertLottoMoney() { System.out.println(MONEY_REQUEST); @@ -24,7 +29,7 @@ public static int insertManualLottoCount() { System.out.println(MANUAL_LOTTO_COUNT_REQUEST); String manualLottoCount = Console.readLine(); - return checkNumber(manualLottoCount); + return validateNumber(manualLottoCount); } public static List insertLottoNumbers() { @@ -37,8 +42,20 @@ public static List insertLottoNumbers() { .collect(Collectors.toList()); } + public static List insertNormalWinningNumbers() { + System.out.println(NORMAL_WINNING_NUMBERS_REQUEST); + return insertLottoNumbers(); + } + + public static Integer insertBonusWinningNumber() { + System.out.println(BONUS_WINNING_NUMBER_REQUEST); + String lottoNumber = Console.readLine(); + + return validateNumber(lottoNumber); + } + private static void validateLottoNumbers(List lottoNumbers) { - lottoNumbers.forEach(Input::checkNumber); + lottoNumbers.forEach(Input::validateNumber); validateDuplicateLottoNumbers(lottoNumbers); } @@ -49,10 +66,22 @@ private static void validateDuplicateLottoNumbers(List lottoNumbers) { } } + private static int validateNumber(String input) { + return checkRange(checkNumber(input)); + } + private static int checkNumber(String input) { if (!input.chars().allMatch(Character::isDigit)) { throw new IllegalArgumentException(INPUT_IS_NOT_NUMBER); } + return parseInt(input); } + + private static int checkRange(int input) { + if (input < LOTTO_MIN_NUMBER || input > LOTTO_MAX_NUMBER) { + throw new IllegalArgumentException(LOTTO_NUMBER_OUT_OF_RANGE); + } + return input; + } } From f5f4066fb54e8e5c0b298fc54f8e7f9ac2ae213d Mon Sep 17 00:00:00 2001 From: great-park Date: Tue, 4 Apr 2023 19:54:23 +0900 Subject: [PATCH 12/18] =?UTF-8?q?style:=20enumeration=20=ED=8C=A8=ED=82=A4?= =?UTF-8?q?=EC=A7=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/main/java/lotto/domain/LottoMachine.java | 2 ++ src/main/java/lotto/domain/WinningNumber.java | 2 +- src/main/java/lotto/domain/{ => enumeration}/NumberType.java | 2 +- 3 files changed, 4 insertions(+), 2 deletions(-) rename src/main/java/lotto/domain/{ => enumeration}/NumberType.java (59%) diff --git a/src/main/java/lotto/domain/LottoMachine.java b/src/main/java/lotto/domain/LottoMachine.java index 061ac8bd19..000cfc3fd8 100644 --- a/src/main/java/lotto/domain/LottoMachine.java +++ b/src/main/java/lotto/domain/LottoMachine.java @@ -1,5 +1,7 @@ package lotto.domain; +import lotto.domain.enumeration.NumberType; + import java.util.ArrayList; import java.util.List; diff --git a/src/main/java/lotto/domain/WinningNumber.java b/src/main/java/lotto/domain/WinningNumber.java index 717958f44d..f15e553868 100644 --- a/src/main/java/lotto/domain/WinningNumber.java +++ b/src/main/java/lotto/domain/WinningNumber.java @@ -1,6 +1,6 @@ package lotto.domain; -import java.util.List; +import lotto.domain.enumeration.NumberType; public class WinningNumber { private final Integer number; diff --git a/src/main/java/lotto/domain/NumberType.java b/src/main/java/lotto/domain/enumeration/NumberType.java similarity index 59% rename from src/main/java/lotto/domain/NumberType.java rename to src/main/java/lotto/domain/enumeration/NumberType.java index e8fa111028..a0c0254b52 100644 --- a/src/main/java/lotto/domain/NumberType.java +++ b/src/main/java/lotto/domain/enumeration/NumberType.java @@ -1,4 +1,4 @@ -package lotto.domain; +package lotto.domain.enumeration; public enum NumberType { BOUNS, From d35e91626b78e47696bc14cee17356d44dd953ad Mon Sep 17 00:00:00 2001 From: great-park Date: Tue, 4 Apr 2023 20:16:02 +0900 Subject: [PATCH 13/18] =?UTF-8?q?feat:=20=EB=A1=9C=EB=98=90=20=EB=8B=B9?= =?UTF-8?q?=EC=B2=A8=20=EA=B2=B0=EA=B3=BC=EB=A5=BC=20=EA=B3=84=EC=82=B0?= =?UTF-8?q?=ED=95=98=EA=B3=A0=20=EC=9D=B4=EB=A5=BC=20=EA=B4=80=EB=A6=AC?= =?UTF-8?q?=ED=95=98=EB=8A=94=20=EA=B0=9D=EC=B2=B4=EB=A5=BC=20=EC=83=9D?= =?UTF-8?q?=EC=84=B1=ED=95=9C=EB=8B=A4.?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../lotto/controller/LottoController.java | 8 ++-- src/main/java/lotto/domain/Lotto.java | 4 ++ src/main/java/lotto/domain/LottoMachine.java | 39 +++++++++++++++- src/main/java/lotto/domain/LottoResult.java | 17 +++++++ src/main/java/lotto/domain/WinningNumber.java | 8 ++++ .../lotto/domain/enumeration/Ranking.java | 46 +++++++++++++++++++ src/main/java/lotto/view/Output.java | 18 ++++++++ 7 files changed, 134 insertions(+), 6 deletions(-) create mode 100644 src/main/java/lotto/domain/LottoResult.java create mode 100644 src/main/java/lotto/domain/enumeration/Ranking.java diff --git a/src/main/java/lotto/controller/LottoController.java b/src/main/java/lotto/controller/LottoController.java index 853edf2f18..52d65cc647 100644 --- a/src/main/java/lotto/controller/LottoController.java +++ b/src/main/java/lotto/controller/LottoController.java @@ -1,9 +1,6 @@ package lotto.controller; -import lotto.domain.LottoMachine; -import lotto.domain.LottoMoney; -import lotto.domain.Lottos; -import lotto.domain.WinningNumber; +import lotto.domain.*; import java.util.List; @@ -21,7 +18,8 @@ public void start() { printLottos(lottos); List winningNumbers = lottoMachine .createWinningNumbers(insertNormalWinningNumbers(), insertBonusWinningNumber()); - printLottoResult(lottos, winningNumbers); + LottoResult lottoResult = lottoMachine.computeLottoResult(lottos, winningNumbers); + printLottoResult(lottoResult); } catch (IllegalArgumentException error) { printErrorMessage(error.getMessage()); } diff --git a/src/main/java/lotto/domain/Lotto.java b/src/main/java/lotto/domain/Lotto.java index 5b58dcc79a..f2a10ba8f9 100644 --- a/src/main/java/lotto/domain/Lotto.java +++ b/src/main/java/lotto/domain/Lotto.java @@ -28,4 +28,8 @@ public Lotto() { public List getNumbers() { return this.numbers; } + + public boolean checkContainWinningNumber(Integer winningNumber) { + return numbers.contains(winningNumber); + } } diff --git a/src/main/java/lotto/domain/LottoMachine.java b/src/main/java/lotto/domain/LottoMachine.java index 000cfc3fd8..65559afb57 100644 --- a/src/main/java/lotto/domain/LottoMachine.java +++ b/src/main/java/lotto/domain/LottoMachine.java @@ -1,9 +1,12 @@ package lotto.domain; import lotto.domain.enumeration.NumberType; +import lotto.domain.enumeration.Ranking; import java.util.ArrayList; +import java.util.HashMap; import java.util.List; +import java.util.Map; import static lotto.view.Input.insertLottoNumbers; import static lotto.view.Output.printInsertManualLottoNumbersRequest; @@ -53,7 +56,7 @@ public List createWinningNumbers(List normalNumbers, Int private List createNormalWinningNumbers(List normalNumbers) { List result = new ArrayList<>(); - for(Integer number : normalNumbers) { + for (Integer number : normalNumbers) { WinningNumber normalNumber = new WinningNumber(number, NumberType.NORMAL); result.add(normalNumber); } @@ -63,4 +66,38 @@ private List createNormalWinningNumbers(List normalNumbe private WinningNumber createBonusNumber(Integer bonusNumber) { return new WinningNumber(bonusNumber, NumberType.BOUNS); } + + public LottoResult computeLottoResult(Lottos lottos, List winningNumbers) { + Map winningInfo = new HashMap<>(); + + for (Lotto lotto : lottos.getLottos()) { + Ranking ranking = determineRanking(lotto, winningNumbers); + winningInfo.put(ranking, winningInfo.getOrDefault(ranking, 0) + 1); + } + return new LottoResult(winningInfo); + } + + private Ranking determineRanking(Lotto lotto, List winningNumbers) { + int equalNormalNumberCount = getEqualCount(lotto, winningNumbers); + boolean isBonusEqual = checkBonusEqual(lotto, winningNumbers); + + return Ranking.create(equalNormalNumberCount, isBonusEqual); + } + + private int getEqualCount(Lotto lotto, List winningNumbers) { + return (int) winningNumbers.stream() + .map(WinningNumber::getNumber) + .filter(lotto::checkContainWinningNumber) + .count(); + } + + private boolean checkBonusEqual(Lotto lotto, List winningNumbers) { + return lotto.getNumbers() + .contains( + winningNumbers.stream() + .filter(WinningNumber::isBonus) + .map(WinningNumber::getNumber) + .findFirst().get() + ); + } } diff --git a/src/main/java/lotto/domain/LottoResult.java b/src/main/java/lotto/domain/LottoResult.java new file mode 100644 index 0000000000..89d8c68461 --- /dev/null +++ b/src/main/java/lotto/domain/LottoResult.java @@ -0,0 +1,17 @@ +package lotto.domain; + +import lotto.domain.enumeration.Ranking; + +import java.util.Map; + +public class LottoResult { + private final Map winningInfo; + + public LottoResult(Map winningInfo) { + this.winningInfo = winningInfo; + } + + public Map getWinningInfo() { + return this.winningInfo; + } +} diff --git a/src/main/java/lotto/domain/WinningNumber.java b/src/main/java/lotto/domain/WinningNumber.java index f15e553868..f89bc3200b 100644 --- a/src/main/java/lotto/domain/WinningNumber.java +++ b/src/main/java/lotto/domain/WinningNumber.java @@ -11,4 +11,12 @@ public WinningNumber(Integer number, NumberType type) { this.type = type; } + public Integer getNumber() { + return number; + } + + public boolean isBonus() { + return type == NumberType.BOUNS; + } + } diff --git a/src/main/java/lotto/domain/enumeration/Ranking.java b/src/main/java/lotto/domain/enumeration/Ranking.java new file mode 100644 index 0000000000..a5b6acb155 --- /dev/null +++ b/src/main/java/lotto/domain/enumeration/Ranking.java @@ -0,0 +1,46 @@ +package lotto.domain.enumeration; + +import java.util.Arrays; + +public enum Ranking { + + FIRST(2_000_000_000L,6,false), + SECOND(30_000_000L, 5, true), + THIRD(1_500_000L, 5, false), + FORTH(50_000L, 4, false), + FIFTH(5_000L, 3, false), + NON_WINNER(0L, 0, false); + + private final Long prizeMoney; + private final int equalCount; + private final boolean containBonus; + private static final int CHECK_SECOND_OR_THIRD_CONDITION = 5; + + Ranking(Long prizeMoney, int equalCount, boolean containBonus) { + this.equalCount = equalCount; + this.prizeMoney = prizeMoney; + this.containBonus = containBonus; + } + + public static Ranking create(int equalCount, boolean isBonusContain) { + if (equalCount == CHECK_SECOND_OR_THIRD_CONDITION) { + return getSecondOrThird(isBonusContain); + } + + return Arrays.stream(Ranking.values()) + .filter(ranking -> ranking.equalCount == equalCount) + .findFirst() + .orElse(NON_WINNER); + } + + private static Ranking getSecondOrThird(boolean isBonusContain) { + if (isBonusContain){ + return Ranking.SECOND; + } + return Ranking.THIRD; + } + + public Long getPrizeMoney() { + return this.prizeMoney; + } +} \ No newline at end of file diff --git a/src/main/java/lotto/view/Output.java b/src/main/java/lotto/view/Output.java index 2c8012a6df..fd605d80c0 100644 --- a/src/main/java/lotto/view/Output.java +++ b/src/main/java/lotto/view/Output.java @@ -1,12 +1,16 @@ package lotto.view; import lotto.domain.Lotto; +import lotto.domain.LottoResult; import lotto.domain.Lottos; +import lotto.domain.WinningNumber; import java.util.List; public class Output { private static final String MANUAL_LOTTO_NUMBERS_REQUEST = "수동으로 구매할 번호를 입력해 주세요."; + private static final String RESULT_ANNOUNCEMENT = "당첨 통계"; + private static final String RESULT_ANNOUNCEMENT_LINE = "---------"; public static void printErrorMessage(String errorMessage) { System.out.println("[ERROR] " + errorMessage); @@ -34,4 +38,18 @@ private static void printLottoNumbers(Lottos lottos) { .map(Lotto::getNumbers) .forEach(System.out::println); } + + public static void printLottoResult(LottoResult lottoResult) { + printLottoResultStartFormat(); + printLottoWinningResult(lottoResult); + } + + private static void printLottoWinningResult(LottoResult lottoResult) { + // to do + } + + private static void printLottoResultStartFormat() { + System.out.println(RESULT_ANNOUNCEMENT); + System.out.println(RESULT_ANNOUNCEMENT_LINE); + } } From 189e45b39e9ddd030f682cc550498ae8e23b1e6c Mon Sep 17 00:00:00 2001 From: great-park Date: Tue, 4 Apr 2023 20:29:41 +0900 Subject: [PATCH 14/18] =?UTF-8?q?feat:=20=EB=A1=9C=EB=98=90=EC=9D=98=20?= =?UTF-8?q?=EA=B2=B0=EA=B3=BC=EB=A5=BC=20=EC=B6=9C=EB=A0=A5=ED=95=9C?= =?UTF-8?q?=EB=8B=A4.?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../lotto/controller/LottoController.java | 2 +- src/main/java/lotto/domain/LottoMachine.java | 16 ++++++++++ src/main/java/lotto/view/Output.java | 29 +++++++++++++++++-- 3 files changed, 43 insertions(+), 4 deletions(-) diff --git a/src/main/java/lotto/controller/LottoController.java b/src/main/java/lotto/controller/LottoController.java index 52d65cc647..05828a0f4c 100644 --- a/src/main/java/lotto/controller/LottoController.java +++ b/src/main/java/lotto/controller/LottoController.java @@ -19,7 +19,7 @@ public void start() { List winningNumbers = lottoMachine .createWinningNumbers(insertNormalWinningNumbers(), insertBonusWinningNumber()); LottoResult lottoResult = lottoMachine.computeLottoResult(lottos, winningNumbers); - printLottoResult(lottoResult); + printLottoResult(lottoResult, money); } catch (IllegalArgumentException error) { printErrorMessage(error.getMessage()); } diff --git a/src/main/java/lotto/domain/LottoMachine.java b/src/main/java/lotto/domain/LottoMachine.java index 65559afb57..773961c02d 100644 --- a/src/main/java/lotto/domain/LottoMachine.java +++ b/src/main/java/lotto/domain/LottoMachine.java @@ -8,6 +8,7 @@ import java.util.List; import java.util.Map; +import static lotto.domain.enumeration.Ranking.*; import static lotto.view.Input.insertLottoNumbers; import static lotto.view.Output.printInsertManualLottoNumbersRequest; @@ -100,4 +101,19 @@ private boolean checkBonusEqual(Lotto lotto, List winningNumbers) .findFirst().get() ); } + + public static Double calculateProfit(LottoResult lottoResult, LottoMoney money) { + Map winningInfo = lottoResult.getWinningInfo(); + Long value = sum(winningInfo); + + return (double) value / (double) money.getPrice(); + } + + private static Long sum(Map winningInfo) { + return winningInfo.getOrDefault(FIFTH,0) * FIFTH.getPrizeMoney() + + winningInfo.getOrDefault(FORTH, 0) * FORTH.getPrizeMoney() + + winningInfo.getOrDefault(THIRD, 0) * THIRD.getPrizeMoney() + + winningInfo.getOrDefault(SECOND, 0) * SECOND.getPrizeMoney() + + winningInfo.getOrDefault(FIRST, 0) * FIRST.getPrizeMoney(); + } } diff --git a/src/main/java/lotto/view/Output.java b/src/main/java/lotto/view/Output.java index fd605d80c0..20ee4f055e 100644 --- a/src/main/java/lotto/view/Output.java +++ b/src/main/java/lotto/view/Output.java @@ -1,17 +1,25 @@ package lotto.view; import lotto.domain.Lotto; +import lotto.domain.LottoMoney; import lotto.domain.LottoResult; import lotto.domain.Lottos; -import lotto.domain.WinningNumber; +import lotto.domain.enumeration.Ranking; import java.util.List; +import java.text.NumberFormat; +import java.util.Map; + +import static lotto.domain.LottoMachine.calculateProfit; +import static lotto.domain.enumeration.Ranking.*; public class Output { private static final String MANUAL_LOTTO_NUMBERS_REQUEST = "수동으로 구매할 번호를 입력해 주세요."; private static final String RESULT_ANNOUNCEMENT = "당첨 통계"; private static final String RESULT_ANNOUNCEMENT_LINE = "---------"; + private static final NumberFormat numberFormat = NumberFormat.getInstance(); + public static void printErrorMessage(String errorMessage) { System.out.println("[ERROR] " + errorMessage); } @@ -39,13 +47,28 @@ private static void printLottoNumbers(Lottos lottos) { .forEach(System.out::println); } - public static void printLottoResult(LottoResult lottoResult) { + public static void printLottoResult(LottoResult lottoResult, LottoMoney money) { printLottoResultStartFormat(); printLottoWinningResult(lottoResult); + printProfit(lottoResult, money); + } + + private static void printProfit(LottoResult lottoResult, LottoMoney money) { + Double profit = calculateProfit(lottoResult, money); + System.out.printf("총 수익률은 %.1f입니다.", profit); } private static void printLottoWinningResult(LottoResult lottoResult) { - // to do + String FIFTH_STATS = String.format("3개 일치 (%s원) - %s개", numberFormat.format(FIFTH.getPrizeMoney()), lottoResult.getWinningInfo().getOrDefault(FIFTH, 0)); + String FORTH_STATS = String.format("4개 일치 (%s원) - %s개", numberFormat.format(FORTH.getPrizeMoney()), lottoResult.getWinningInfo().getOrDefault(FORTH, 0)); + String THIRD_STATS = String.format("5개 일치 (%s원) - %s개", numberFormat.format(THIRD.getPrizeMoney()), lottoResult.getWinningInfo().getOrDefault(THIRD, 0)); + String SECOND_STATS = String.format("5개 일치, 보너스 볼 일치 (%s원) - %s개", numberFormat.format(SECOND.getPrizeMoney()), lottoResult.getWinningInfo().getOrDefault(SECOND, 0)); + String FIRST_STATS = String.format("6개 일치 (%s원) - %s개", numberFormat.format(FIRST.getPrizeMoney()), lottoResult.getWinningInfo().getOrDefault(FIRST, 0)); + System.out.println(FIFTH_STATS); + System.out.println(FORTH_STATS); + System.out.println(THIRD_STATS); + System.out.println(SECOND_STATS); + System.out.println(FIRST_STATS); } private static void printLottoResultStartFormat() { From f7403aa0073fe1a8518987c7427cff7750d4e391 Mon Sep 17 00:00:00 2001 From: great-park Date: Tue, 4 Apr 2023 20:30:10 +0900 Subject: [PATCH 15/18] =?UTF-8?q?fix:=20=EC=86=8C=EC=88=AB=EC=A0=90=20?= =?UTF-8?q?=EC=97=B0=EC=9E=A5?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/main/java/lotto/view/Output.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/main/java/lotto/view/Output.java b/src/main/java/lotto/view/Output.java index 20ee4f055e..1aa38669f8 100644 --- a/src/main/java/lotto/view/Output.java +++ b/src/main/java/lotto/view/Output.java @@ -55,7 +55,7 @@ public static void printLottoResult(LottoResult lottoResult, LottoMoney money) { private static void printProfit(LottoResult lottoResult, LottoMoney money) { Double profit = calculateProfit(lottoResult, money); - System.out.printf("총 수익률은 %.1f입니다.", profit); + System.out.printf("총 수익률은 %.2f입니다.", profit); } private static void printLottoWinningResult(LottoResult lottoResult) { From 942c5f2a95ca5c69c00bdaf45f89abf7a7eda915 Mon Sep 17 00:00:00 2001 From: great-park Date: Tue, 4 Apr 2023 20:44:48 +0900 Subject: [PATCH 16/18] =?UTF-8?q?refactor:=20lottoMachine=20=EC=A3=BC?= =?UTF-8?q?=EC=9E=85?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/main/java/lotto/Application.java | 5 ++++- src/main/java/lotto/controller/LottoController.java | 6 +++++- 2 files changed, 9 insertions(+), 2 deletions(-) diff --git a/src/main/java/lotto/Application.java b/src/main/java/lotto/Application.java index 40fb6ddbc8..ec6a88a780 100644 --- a/src/main/java/lotto/Application.java +++ b/src/main/java/lotto/Application.java @@ -1,10 +1,13 @@ package lotto; import lotto.controller.LottoController; +import lotto.domain.LottoMachine; public class Application { public static void main(String[] args) { - LottoController lottoController = new LottoController(); + LottoMachine lottoMachine = new LottoMachine(); + LottoController lottoController = new LottoController(lottoMachine); + lottoController.start(); } } diff --git a/src/main/java/lotto/controller/LottoController.java b/src/main/java/lotto/controller/LottoController.java index 05828a0f4c..ff5c6a0231 100644 --- a/src/main/java/lotto/controller/LottoController.java +++ b/src/main/java/lotto/controller/LottoController.java @@ -9,7 +9,11 @@ public class LottoController { - private final LottoMachine lottoMachine = new LottoMachine(); + private final LottoMachine lottoMachine; + + public LottoController(LottoMachine lottoMachine) { + this.lottoMachine = lottoMachine; + } public void start() { try { From 48f5790f6c1b85ea551b14209ca6117d506209b4 Mon Sep 17 00:00:00 2001 From: great-park Date: Tue, 4 Apr 2023 20:52:58 +0900 Subject: [PATCH 17/18] =?UTF-8?q?refactor:=20lottoFactory=20=EC=A3=BC?= =?UTF-8?q?=EC=9E=85?= 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/domain/LottoMachine.java | 6 +++++- 2 files changed, 8 insertions(+), 2 deletions(-) diff --git a/src/main/java/lotto/Application.java b/src/main/java/lotto/Application.java index ec6a88a780..63d194b593 100644 --- a/src/main/java/lotto/Application.java +++ b/src/main/java/lotto/Application.java @@ -1,11 +1,13 @@ package lotto; import lotto.controller.LottoController; +import lotto.domain.LottoFactory; import lotto.domain.LottoMachine; public class Application { public static void main(String[] args) { - LottoMachine lottoMachine = new LottoMachine(); + LottoFactory lottoFactory = new LottoFactory(); + LottoMachine lottoMachine = new LottoMachine(lottoFactory); LottoController lottoController = new LottoController(lottoMachine); lottoController.start(); diff --git a/src/main/java/lotto/domain/LottoMachine.java b/src/main/java/lotto/domain/LottoMachine.java index 773961c02d..5bb61cf250 100644 --- a/src/main/java/lotto/domain/LottoMachine.java +++ b/src/main/java/lotto/domain/LottoMachine.java @@ -13,7 +13,11 @@ import static lotto.view.Output.printInsertManualLottoNumbersRequest; public class LottoMachine { - private final LottoFactory lottoFactory = new LottoFactory(); + private final LottoFactory lottoFactory; + + public LottoMachine(LottoFactory lottoFactory) { + this.lottoFactory = lottoFactory; + } public Lottos createLottos(LottoMoney money, int manualLottoCount) { List manualLottos = createManualLottos(manualLottoCount); From 8d0b162913e9c8ca253ac048dbe4a4a8c578fd3c Mon Sep 17 00:00:00 2001 From: great-park Date: Tue, 4 Apr 2023 21:10:39 +0900 Subject: [PATCH 18/18] =?UTF-8?q?style:=20line=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/controller/LottoController.java | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/src/main/java/lotto/controller/LottoController.java b/src/main/java/lotto/controller/LottoController.java index ff5c6a0231..070182fae8 100644 --- a/src/main/java/lotto/controller/LottoController.java +++ b/src/main/java/lotto/controller/LottoController.java @@ -20,8 +20,7 @@ public void start() { LottoMoney money = new LottoMoney(insertLottoMoney()); Lottos lottos = lottoMachine.createLottos(money, insertManualLottoCount()); printLottos(lottos); - List winningNumbers = lottoMachine - .createWinningNumbers(insertNormalWinningNumbers(), insertBonusWinningNumber()); + List winningNumbers = lottoMachine.createWinningNumbers(insertNormalWinningNumbers(), insertBonusWinningNumber()); LottoResult lottoResult = lottoMachine.computeLottoResult(lottos, winningNumbers); printLottoResult(lottoResult, money); } catch (IllegalArgumentException error) {