From 0ba5162d9d0c0d4d6e66c756290cfafde63bc344 Mon Sep 17 00:00:00 2001 From: wzrabbit Date: Sun, 26 Jan 2025 17:47:05 +0900 Subject: [PATCH 01/26] =?UTF-8?q?=E2=9C=A8=20feat:=20=EB=A1=9C=EB=98=90=20?= =?UTF-8?q?=EA=B4=80=EB=A0=A8=20=EC=83=81=EC=88=98=EA=B0=92=EB=93=A4?= =?UTF-8?q?=EC=9D=84=20enum=EC=9C=BC=EB=A1=9C=20=EA=B4=80=EB=A6=AC?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/main/java/model/LottoConstants.java | 18 ++++++++++++++++++ 1 file changed, 18 insertions(+) create mode 100644 src/main/java/model/LottoConstants.java diff --git a/src/main/java/model/LottoConstants.java b/src/main/java/model/LottoConstants.java new file mode 100644 index 00000000..8c61107e --- /dev/null +++ b/src/main/java/model/LottoConstants.java @@ -0,0 +1,18 @@ +package model; + +public enum LottoConstants { + MIN_NUMBER(1), + MAX_NUMBER(45), + NUMBER_COUNT(6), + PRICE(1_000); + + private final int value; + + LottoConstants(int value) { + this.value = value; + } + + public int getValue() { + return value; + } +} From 68f9cf5e3e207a5046f529270acaac0d5fa5d88c Mon Sep 17 00:00:00 2001 From: wzrabbit Date: Sun, 26 Jan 2025 17:47:14 +0900 Subject: [PATCH 02/26] =?UTF-8?q?=E2=9C=A8=20feat:=20=EB=A1=9C=EB=98=90=20?= =?UTF-8?q?=ED=81=B4=EB=9E=98=EC=8A=A4=EB=A5=BC=20=EA=B5=AC=ED=98=84?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/main/java/model/Lotto.java | 47 ++++++++++++++++++++++++++++++++++ 1 file changed, 47 insertions(+) create mode 100644 src/main/java/model/Lotto.java diff --git a/src/main/java/model/Lotto.java b/src/main/java/model/Lotto.java new file mode 100644 index 00000000..5584e6e9 --- /dev/null +++ b/src/main/java/model/Lotto.java @@ -0,0 +1,47 @@ +package model; + +import java.util.*; + +public class Lotto { + private final List lotto; + + public Lotto(List lotto) { + validateLotto(lotto); + this.lotto = getSortedLotto(lotto); + } + + private void validateLotto(List lotto) { + if (lotto.size() != LottoConstants.NUMBER_COUNT.getValue()) { + throw new IllegalArgumentException("로또 번호는 6개의 수로 이루어져야 합니다."); + } + + lotto.forEach(lottoNumber -> { + if (lottoNumber < LottoConstants.MIN_NUMBER.getValue() || lottoNumber > LottoConstants.MAX_NUMBER.getValue()) { + throw new IllegalArgumentException("로또 번호는 " + LottoConstants.MIN_NUMBER.getValue() + + " 이상 " + LottoConstants.MAX_NUMBER.getValue() + " 이하여야 합니다."); + } + }); + + Set uniqueLottoNumbers = new HashSet<>(lotto); + + if (uniqueLottoNumbers.size() != LottoConstants.NUMBER_COUNT.getValue()) { + throw new IllegalArgumentException("로또 번호는 중복되어서는 안 됩니다."); + } + } + + private List getSortedLotto(List lotto) { + List sortedLotto = new ArrayList<>(lotto); + sortedLotto.sort(null); + + return sortedLotto; + } + + public List getValue() { + return lotto; + } + + @Override + public String toString() { + return lotto.toString(); + } +} From ee14062567c26b0d333e840770bf50120e099be2 Mon Sep 17 00:00:00 2001 From: wzrabbit Date: Sun, 26 Jan 2025 17:53:13 +0900 Subject: [PATCH 03/26] =?UTF-8?q?=E2=9C=A8=20feat:=20=EB=A1=9C=EB=98=90=20?= =?UTF-8?q?=EA=B5=AC=EC=9E=85=20=EA=B0=80=EA=B2=A9=20=ED=81=B4=EB=9E=98?= =?UTF-8?q?=EC=8A=A4=EB=A5=BC=20=EA=B5=AC=ED=98=84?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/main/java/model/LottoPurchasePrice.java | 29 +++++++++++++++++++++ 1 file changed, 29 insertions(+) create mode 100644 src/main/java/model/LottoPurchasePrice.java diff --git a/src/main/java/model/LottoPurchasePrice.java b/src/main/java/model/LottoPurchasePrice.java new file mode 100644 index 00000000..a89e6d72 --- /dev/null +++ b/src/main/java/model/LottoPurchasePrice.java @@ -0,0 +1,29 @@ +package model; + +public class LottoPurchasePrice { + private final int lottoPurchasePrice; + + public LottoPurchasePrice(int lottoPrice) { + validateLottoPrice(lottoPrice); + this.lottoPurchasePrice = lottoPrice; + } + + private void validateLottoPrice(int lottoPurchasePrice) { + if (lottoPurchasePrice < 0) { + throw new IllegalArgumentException("로또 총 구입금액은 음수가 될 수 없습니다."); + } + + if (lottoPurchasePrice % LottoConstants.PRICE.getValue() != 0) { + throw new IllegalArgumentException("로또 총 구입금액은 " + LottoConstants.PRICE.getValue() + + "로 나누어 떨어져야 합니다."); + } + } + + public int getValue() { + return lottoPurchasePrice; + } + + public int getLottoCount() { + return lottoPurchasePrice / LottoConstants.PRICE.getValue(); + } +} From 09a57c1a0971d39b89443c514bcabf8b756d4df5 Mon Sep 17 00:00:00 2001 From: wzrabbit Date: Sun, 26 Jan 2025 17:53:38 +0900 Subject: [PATCH 04/26] =?UTF-8?q?=E2=9C=A8=20feat:=20=EB=A1=9C=EB=98=90=20?= =?UTF-8?q?=EA=B2=8C=EC=9E=84=20=EA=B5=AC=ED=98=84=EC=9D=84=20=EC=9C=84?= =?UTF-8?q?=ED=95=9C=20=EB=82=9C=EC=88=98=20=EC=83=9D=EC=84=B1=20=EC=9D=B8?= =?UTF-8?q?=ED=84=B0=ED=8E=98=EC=9D=B4=EC=8A=A4=20=EB=B0=8F=20=ED=81=B4?= =?UTF-8?q?=EB=9E=98=EC=8A=A4=EB=A5=BC=20=EA=B5=AC=ED=98=84?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/main/java/model/LottoGenerator.java | 27 +++++++++++++++++++ .../model/LottoRandomNumberGenerator.java | 12 +++++++++ .../java/model/RandomNumberGenerator.java | 5 ++++ 3 files changed, 44 insertions(+) create mode 100644 src/main/java/model/LottoGenerator.java create mode 100644 src/main/java/model/LottoRandomNumberGenerator.java create mode 100644 src/main/java/model/RandomNumberGenerator.java diff --git a/src/main/java/model/LottoGenerator.java b/src/main/java/model/LottoGenerator.java new file mode 100644 index 00000000..47532baf --- /dev/null +++ b/src/main/java/model/LottoGenerator.java @@ -0,0 +1,27 @@ +package model; + +import java.util.ArrayList; +import java.util.List; + +public class LottoGenerator { + private final RandomNumberGenerator randomNumberGenerator; + + public LottoGenerator(RandomNumberGenerator randomNumberGenerator) { + this.randomNumberGenerator = randomNumberGenerator; + } + + public Lotto generate() { + List lottoNumbers = new ArrayList<>(); + + while (lottoNumbers.size() < LottoConstants.NUMBER_COUNT.getValue()) { + int candidateLottoNumber = randomNumberGenerator.generate(); + + if (!lottoNumbers.contains(candidateLottoNumber)) { + lottoNumbers.add(candidateLottoNumber); + } + } + + return new Lotto(lottoNumbers); + } +} + diff --git a/src/main/java/model/LottoRandomNumberGenerator.java b/src/main/java/model/LottoRandomNumberGenerator.java new file mode 100644 index 00000000..f0a54415 --- /dev/null +++ b/src/main/java/model/LottoRandomNumberGenerator.java @@ -0,0 +1,12 @@ +package model; + +import java.util.Random; + +public class LottoRandomNumberGenerator implements RandomNumberGenerator { + Random random = new Random(); + + @Override + public int generate() { + return random.nextInt(LottoConstants.MIN_NUMBER.getValue(), LottoConstants.MAX_NUMBER.getValue() + 1); + } +} diff --git a/src/main/java/model/RandomNumberGenerator.java b/src/main/java/model/RandomNumberGenerator.java new file mode 100644 index 00000000..036ec64b --- /dev/null +++ b/src/main/java/model/RandomNumberGenerator.java @@ -0,0 +1,5 @@ +package model; + +public interface RandomNumberGenerator { + int generate(); +} From 0e87fe1e018112f80d43196687750d6ba4065546 Mon Sep 17 00:00:00 2001 From: wzrabbit Date: Sun, 26 Jan 2025 17:57:02 +0900 Subject: [PATCH 05/26] =?UTF-8?q?=E2=9C=A8=20feat:=20=EB=A1=9C=EB=98=90=20?= =?UTF-8?q?=EB=A6=AC=EC=8A=A4=ED=8A=B8=20=EC=BB=AC=EB=A0=89=EC=85=98=20?= =?UTF-8?q?=ED=81=B4=EB=9E=98=EC=8A=A4=EB=A5=BC=20=EC=83=9D=EC=84=B1?= =?UTF-8?q?=ED=95=98=EA=B3=A0,=20=EB=8D=B0=EC=9D=B4=ED=84=B0=EB=A5=BC=20?= =?UTF-8?q?=EA=B0=80=EC=A0=B8=EC=98=A4=EB=8A=94=20=EA=B8=B0=EB=B3=B8=20?= =?UTF-8?q?=EB=A1=9C=EC=A7=81=EB=93=A4=EC=9D=84=20=EC=9E=91=EC=84=B1?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/main/java/model/LottoList.java | 22 ++++++++++++++++++++++ 1 file changed, 22 insertions(+) create mode 100644 src/main/java/model/LottoList.java diff --git a/src/main/java/model/LottoList.java b/src/main/java/model/LottoList.java new file mode 100644 index 00000000..5df161d5 --- /dev/null +++ b/src/main/java/model/LottoList.java @@ -0,0 +1,22 @@ +package model; + +import java.util.ArrayList; +import java.util.HashSet; +import java.util.List; +import java.util.Set; + +public class LottoList { + List lottoList; + + public LottoList(List lottoList) { + this.lottoList = new ArrayList(lottoList); + } + + public List getValue() { + return lottoList; + } + + public int size() { + return lottoList.size(); + } +} From 62dbaf4926ece6d5e93d7eee62be44dde7efb34c Mon Sep 17 00:00:00 2001 From: wzrabbit Date: Sun, 26 Jan 2025 17:57:34 +0900 Subject: [PATCH 06/26] =?UTF-8?q?=E2=9C=A8=20feat:=20=EB=A1=9C=EB=98=90=20?= =?UTF-8?q?=EA=B2=8C=EC=9E=84=EC=9D=98=20=EC=9E=85=EC=B6=9C=EB=A0=A5=20?= =?UTF-8?q?=ED=81=B4=EB=9E=98=EC=8A=A4=EB=93=A4=EC=9D=84=20=EC=83=9D?= =?UTF-8?q?=EC=84=B1=ED=95=98=EA=B3=A0,=20=EA=B5=AC=EC=9E=85=EA=B8=88?= =?UTF-8?q?=EC=95=A1=20=EC=9E=85=EB=A0=A5=20=EB=B0=8F=20=EC=9E=90=EB=8F=99?= =?UTF-8?q?=20=EA=B5=AC=EB=A7=A4=20=EC=8B=9C=EC=9D=98=20=EB=A1=9C=EB=98=90?= =?UTF-8?q?=20=EB=AA=A9=EB=A1=9D=20=EA=B4=80=EB=A0=A8=20=EC=B6=9C=EB=A0=A5?= =?UTF-8?q?=20=EA=B8=B0=EB=8A=A5=EC=9D=84=20=EC=B6=94=EA=B0=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/main/java/view/InputView.java | 14 ++++++++++++++ src/main/java/view/OutputView.java | 18 ++++++++++++++++++ 2 files changed, 32 insertions(+) create mode 100644 src/main/java/view/InputView.java create mode 100644 src/main/java/view/OutputView.java diff --git a/src/main/java/view/InputView.java b/src/main/java/view/InputView.java new file mode 100644 index 00000000..dce1af72 --- /dev/null +++ b/src/main/java/view/InputView.java @@ -0,0 +1,14 @@ +package view; + +import model.LottoPurchasePrice; + +import java.util.Scanner; + +public class InputView { + private static final Scanner scanner = new Scanner(System.in); + + public static LottoPurchasePrice inputLottoPurchasePrice() { + System.out.println("구입금액을 입력해 주세요."); + return new LottoPurchasePrice(scanner.nextInt()); + } +} diff --git a/src/main/java/view/OutputView.java b/src/main/java/view/OutputView.java new file mode 100644 index 00000000..e315f728 --- /dev/null +++ b/src/main/java/view/OutputView.java @@ -0,0 +1,18 @@ +package view; + +import model.LottoList; + +import java.util.List; + +public class OutputView { + public static void printLottoPurchases(LottoList lottoList) { + System.out.println("\n" + lottoList.size() + "개를 구매했습니다."); + lottoList.getValue().forEach(lotto -> { + System.out.println(lotto); + }); + } + + public static void printErrorMessage(String errorMessage) { + System.out.println("[ERROR] " + errorMessage + "\n"); + } +} From 6ba05cd51d5d0dab33f67a054f57d5497db80ea7 Mon Sep 17 00:00:00 2001 From: wzrabbit Date: Sun, 26 Jan 2025 17:58:12 +0900 Subject: [PATCH 07/26] =?UTF-8?q?=E2=9C=A8=20feat:=20=EB=A1=9C=EB=98=90=20?= =?UTF-8?q?=EA=B2=8C=EC=9E=84=20=EC=BB=A8=ED=8A=B8=EB=A1=A4=EB=9F=AC?= =?UTF-8?q?=EB=A5=BC=20=EC=83=9D=EC=84=B1=ED=95=98=EA=B3=A0,=20=EB=A1=9C?= =?UTF-8?q?=EB=98=90=20=EA=B5=AC=EC=9E=85=20=EA=B8=88=EC=95=A1=EC=9D=84=20?= =?UTF-8?q?=EC=9E=85=EB=A0=A5=EB=B0=9B=EC=9C=BC=EB=A9=B4=20=EC=9E=90?= =?UTF-8?q?=EB=8F=99=20=EC=83=9D=EC=84=B1=ED=95=9C=20=EB=A1=9C=EB=98=90=20?= =?UTF-8?q?=EB=AA=A9=EB=A1=9D=EC=9D=84=20=EB=B3=B4=EC=97=AC=EC=A3=BC?= =?UTF-8?q?=EB=8A=94=20=EA=B8=B0=EB=8A=A5=EC=9D=84=20=EA=B5=AC=ED=98=84?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../java/controller/LottoGameController.java | 35 +++++++++++++++++++ 1 file changed, 35 insertions(+) create mode 100644 src/main/java/controller/LottoGameController.java diff --git a/src/main/java/controller/LottoGameController.java b/src/main/java/controller/LottoGameController.java new file mode 100644 index 00000000..11e1c942 --- /dev/null +++ b/src/main/java/controller/LottoGameController.java @@ -0,0 +1,35 @@ +package controller; + +import model.*; +import view.InputView; +import view.OutputView; + +import java.util.stream.IntStream; +import java.util.stream.Collectors; + +public class LottoGameController { + private final LottoRandomNumberGenerator lottoRandomNumberGenerator = new LottoRandomNumberGenerator(); + private final LottoGenerator lottoGenerator = new LottoGenerator(lottoRandomNumberGenerator); + private LottoList lottoList; + + public void run() { + inputLottoPurchasePrice(); + } + + private void inputLottoPurchasePrice() { + try { + final LottoPurchasePrice lottoPurchasePrice = InputView.inputLottoPurchasePrice(); + makeLottoList(lottoPurchasePrice.getLottoCount()); + } catch (Exception exception) { + OutputView.printErrorMessage(exception.getMessage()); + } + } + + private void makeLottoList(int lottoCount) { + lottoList = new LottoList(IntStream.range(0, lottoCount) + .mapToObj(i -> lottoGenerator.generate()) + .collect(Collectors.toList())); + + OutputView.printLottoPurchases(lottoList); + } +} From 05825ed979c6d2b49cd80fae1cb61f94f92791d7 Mon Sep 17 00:00:00 2001 From: wzrabbit Date: Sun, 26 Jan 2025 17:58:26 +0900 Subject: [PATCH 08/26] =?UTF-8?q?=E2=9C=A8=20feat:=20=EB=A1=9C=EB=98=90=20?= =?UTF-8?q?=EA=B2=8C=EC=9E=84=EC=9D=98=20=EC=97=94=ED=8A=B8=EB=A6=AC=20?= =?UTF-8?q?=ED=81=B4=EB=9E=98=EC=8A=A4=EB=A5=BC=20=EA=B5=AC=ED=98=84?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/main/java/LottoApplication.java | 8 ++++++++ 1 file changed, 8 insertions(+) create mode 100644 src/main/java/LottoApplication.java diff --git a/src/main/java/LottoApplication.java b/src/main/java/LottoApplication.java new file mode 100644 index 00000000..d576005b --- /dev/null +++ b/src/main/java/LottoApplication.java @@ -0,0 +1,8 @@ +import controller.LottoGameController; + +public class LottoApplication { + public static void main(String[] args) { + LottoGameController lottoGameController = new LottoGameController(); + lottoGameController.run(); + } +} From 2d57a43f4038fa5f62d79710765f625e0501fc66 Mon Sep 17 00:00:00 2001 From: wzrabbit Date: Sun, 26 Jan 2025 23:38:14 +0900 Subject: [PATCH 09/26] =?UTF-8?q?=E2=9C=A8=20feat:=20=EB=A1=9C=EB=98=90=20?= =?UTF-8?q?=EC=83=81=EA=B8=88=20=EA=B4=80=EB=A0=A8=20=EC=83=81=EC=88=98?= =?UTF-8?q?=EA=B0=92=EB=93=A4=EC=9D=84=20enum=EC=9C=BC=EB=A1=9C=20?= =?UTF-8?q?=EA=B4=80=EB=A6=AC?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/main/java/model/LottoPrizeConstants.java | 20 ++++++++++++++++++++ 1 file changed, 20 insertions(+) create mode 100644 src/main/java/model/LottoPrizeConstants.java diff --git a/src/main/java/model/LottoPrizeConstants.java b/src/main/java/model/LottoPrizeConstants.java new file mode 100644 index 00000000..5ba88545 --- /dev/null +++ b/src/main/java/model/LottoPrizeConstants.java @@ -0,0 +1,20 @@ +package model; + +public enum LottoPrizeConstants { + FIRST_PRIZE_MONEY(2_000_000_000), + SECOND_PRIZE_MONEY(30_000_000), + THIRD_PRIZE_MONEY(1_500_000), + FOURTH_PRIZE_MONEY(50_000), + FIFTH_PRIZE_MONEY(5_000), + PRIZE_TYPE_COUNT(6); + + private final int value; + + LottoPrizeConstants(int value) { + this.value = value; + } + + public int getValue() { + return value; + } +} From 28071897a923ec30a935e81b3c501b271a83ef24 Mon Sep 17 00:00:00 2001 From: wzrabbit Date: Mon, 27 Jan 2025 00:00:25 +0900 Subject: [PATCH 10/26] =?UTF-8?q?=E2=9C=A8=20feat:=20=EB=B3=B4=EB=84=88?= =?UTF-8?q?=EC=8A=A4=20=EB=84=98=EB=B2=84=20=EB=B0=8F=20=EB=8B=B9=EC=B2=A8?= =?UTF-8?q?=20=EB=A1=9C=EB=98=90=EB=A5=BC=20=EB=8B=A4=EB=A3=A8=EB=8A=94=20?= =?UTF-8?q?=ED=81=B4=EB=9E=98=EC=8A=A4=20=EA=B5=AC=ED=98=84?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/main/java/model/BonusNumber.java | 21 ++++++++++++++++ src/main/java/model/WinningLottoInfo.java | 30 +++++++++++++++++++++++ 2 files changed, 51 insertions(+) create mode 100644 src/main/java/model/BonusNumber.java create mode 100644 src/main/java/model/WinningLottoInfo.java diff --git a/src/main/java/model/BonusNumber.java b/src/main/java/model/BonusNumber.java new file mode 100644 index 00000000..366cc11e --- /dev/null +++ b/src/main/java/model/BonusNumber.java @@ -0,0 +1,21 @@ +package model; + +public class BonusNumber { + public final int bonusNumber; + + public BonusNumber(int bonusNumber) { + validateBonusNumber(bonusNumber); + this.bonusNumber = bonusNumber; + } + + private void validateBonusNumber(int bonusNumber) { + if (bonusNumber < LottoConstants.MIN_NUMBER.getValue() || bonusNumber > LottoConstants.MAX_NUMBER.getValue()) { + throw new Error("보너스 넘버는 " + LottoConstants.MIN_NUMBER.getValue() + + " 이상 " + LottoConstants.MAX_NUMBER.getValue() + " 이하여야 합니다."); + } + } + + public int getValue() { + return bonusNumber; + } +} diff --git a/src/main/java/model/WinningLottoInfo.java b/src/main/java/model/WinningLottoInfo.java new file mode 100644 index 00000000..3a98c7d7 --- /dev/null +++ b/src/main/java/model/WinningLottoInfo.java @@ -0,0 +1,30 @@ +package model; + +import java.util.*; + +public class WinningLottoInfo { + private final Lotto lotto; + private final BonusNumber bonusNumber; + + public WinningLottoInfo(Lotto lotto, BonusNumber bonusNumber) { + validateWinningLottoInfo(lotto, bonusNumber); + this.lotto = lotto; + this.bonusNumber = bonusNumber; + } + + private void validateWinningLottoInfo(Lotto lotto, BonusNumber bonusNumber) { + lotto.getValue().forEach((lottoNumber) -> { + if (lottoNumber == bonusNumber.getValue()) { + throw new IllegalArgumentException("로또 번호와 보너스 넘버는 서로 중복될 수 없습니다."); + } + }); + } + + public List getLottoValue() { + return lotto.getValue(); + } + + public int getBonusNumberValue() { + return bonusNumber.getValue(); + } +} From 04b4d8bb1ab3f192c72545eab1a545435817a8b1 Mon Sep 17 00:00:00 2001 From: wzrabbit Date: Mon, 27 Jan 2025 00:06:59 +0900 Subject: [PATCH 11/26] =?UTF-8?q?=E2=9C=A8=20feat:=20=EB=A1=9C=EB=98=90=20?= =?UTF-8?q?=EB=A6=AC=EC=8A=A4=ED=8A=B8=20=ED=81=B4=EB=9E=98=EC=8A=A4?= =?UTF-8?q?=EC=97=90=20=EB=8B=B9=EC=B2=A8=20=EB=A1=9C=EB=98=90=20=EC=A0=95?= =?UTF-8?q?=EB=B3=B4=EB=A5=BC=20=EC=9D=B4=EC=9A=A9=ED=95=B4=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=EB=8A=94=20=EA=B8=B0=EB=8A=A5=EC=9D=84=20=EC=B6=94?= =?UTF-8?q?=EA=B0=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/main/java/model/LottoList.java | 44 ++++++++++++++++++++++++++---- 1 file changed, 39 insertions(+), 5 deletions(-) diff --git a/src/main/java/model/LottoList.java b/src/main/java/model/LottoList.java index 5df161d5..0346f2e1 100644 --- a/src/main/java/model/LottoList.java +++ b/src/main/java/model/LottoList.java @@ -1,15 +1,12 @@ package model; -import java.util.ArrayList; -import java.util.HashSet; -import java.util.List; -import java.util.Set; +import java.util.*; public class LottoList { List lottoList; public LottoList(List lottoList) { - this.lottoList = new ArrayList(lottoList); + this.lottoList = new ArrayList<>(lottoList); } public List getValue() { @@ -19,4 +16,41 @@ public List getValue() { public int size() { return lottoList.size(); } + + public LottoPrizeResult getLottoResultByWinningLottoInfo(WinningLottoInfo winningLottoInfo) { + List lottoPrizesCount = new ArrayList<>(); + + for (int i = 1; i <= LottoPrizeConstants.PRIZE_TYPE_COUNT.getValue(); i++) { + lottoPrizesCount.add(0); + } + + lottoList.forEach(lotto -> { + int lottoPrizeIndex = getLottoPrizeIndex(lotto, winningLottoInfo); + lottoPrizesCount.set(lottoPrizeIndex, lottoPrizesCount.get(lottoPrizeIndex) + 1); + }); + + + return new LottoPrizeResult(lottoPrizesCount); + } + + int getLottoPrizeIndex(Lotto lotto, WinningLottoInfo winningLottoInfo) { + Set lottoNumbers = new HashSet<>(lotto.getValue()); + + int matchCount = (int) winningLottoInfo.getLottoValue().stream().filter(lottoNumbers::contains).count(); + boolean isBonusNumberMatched = lottoNumbers.contains(winningLottoInfo.getBonusNumberValue()); + + if (matchCount == 6) { + return 0; + } + + if (matchCount == 5 && isBonusNumberMatched) { + return 1; + } + + if (matchCount < 3) { + return 5; + } + + return 7 - matchCount; + } } From 186610c3489488a001e99eaa290e82b3bca464ed Mon Sep 17 00:00:00 2001 From: wzrabbit Date: Mon, 27 Jan 2025 00:07:20 +0900 Subject: [PATCH 12/26] =?UTF-8?q?=E2=9C=A8=20feat:=20=EB=A1=9C=EB=98=90=20?= =?UTF-8?q?=EB=8B=B9=EC=B2=A8=20=EA=B2=B0=EA=B3=BC=20=ED=81=B4=EB=9E=98?= =?UTF-8?q?=EC=8A=A4=EB=A5=BC=20=EA=B5=AC=ED=98=84?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/main/java/model/LottoPrizeResult.java | 62 +++++++++++++++++++++++ 1 file changed, 62 insertions(+) create mode 100644 src/main/java/model/LottoPrizeResult.java diff --git a/src/main/java/model/LottoPrizeResult.java b/src/main/java/model/LottoPrizeResult.java new file mode 100644 index 00000000..429fadce --- /dev/null +++ b/src/main/java/model/LottoPrizeResult.java @@ -0,0 +1,62 @@ +package model; + +import java.util.ArrayList; +import java.util.List; + +public class LottoPrizeResult { + private final List prizeResult; + + public LottoPrizeResult(List prizeResult) { + validateLottoPrizeResult(prizeResult); + this.prizeResult = new ArrayList<>(prizeResult); + } + + private void validateLottoPrizeResult(List prizeResult) { + if (prizeResult.size() != LottoPrizeConstants.PRIZE_TYPE_COUNT.getValue()) { + throw new IllegalArgumentException("당첨 결과는 " + LottoPrizeConstants.PRIZE_TYPE_COUNT.getValue() + + "개의 정수로 구성되어야 합니다."); + } + + prizeResult.forEach(prizeCount -> { + if (prizeCount < 0) { + throw new IllegalArgumentException("당첨 횟수는 음수가 될 수 없습니다."); + } + }); + } + + public int getFirstPrizeCount() { + return prizeResult.get(0); + } + + public int getSecondPrizeCount() { + return prizeResult.get(1); + } + + public int getThirdPrizeCount() { + return prizeResult.get(2); + } + + public int getFourthPrizeCount() { + return prizeResult.get(3); + } + + public int getFifthPrizeCount() { + return prizeResult.get(4); + } + + public double getProfitRate() { + int purchasePrice = prizeResult.stream().mapToInt(Integer::intValue).sum() * LottoConstants.PRICE.getValue(); + + if (purchasePrice == 0) { + return 0; + } + + int totalPrizeMoney = getFirstPrizeCount() * LottoPrizeConstants.FIRST_PRIZE_MONEY.getValue() + + getSecondPrizeCount() * LottoPrizeConstants.SECOND_PRIZE_MONEY.getValue() + + getThirdPrizeCount() * LottoPrizeConstants.THIRD_PRIZE_MONEY.getValue() + + getFourthPrizeCount() * LottoPrizeConstants.FOURTH_PRIZE_MONEY.getValue() + + getFifthPrizeCount() * LottoPrizeConstants.FIFTH_PRIZE_MONEY.getValue(); + + return (double) totalPrizeMoney / purchasePrice; + } +} From bd11784fa3fbb438526537134b91bf7ffa860ef6 Mon Sep 17 00:00:00 2001 From: wzrabbit Date: Mon, 27 Jan 2025 00:07:42 +0900 Subject: [PATCH 13/26] =?UTF-8?q?=E2=9C=A8=20feat:=20=EB=8B=B9=EC=B2=A8=20?= =?UTF-8?q?=EB=B2=88=ED=98=B8=EC=99=80=20=EB=B3=B4=EB=84=88=EC=8A=A4=20?= =?UTF-8?q?=EB=B3=BC=EC=9D=84=20=EC=9E=85=EB=A0=A5=EB=B0=9B=EB=8A=94=20?= =?UTF-8?q?=EA=B8=B0=EB=8A=A5=EC=9D=84=20=EC=B6=94=EA=B0=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/main/java/view/InputView.java | 25 ++++++++++++++++++++++++- 1 file changed, 24 insertions(+), 1 deletion(-) diff --git a/src/main/java/view/InputView.java b/src/main/java/view/InputView.java index dce1af72..b72164d9 100644 --- a/src/main/java/view/InputView.java +++ b/src/main/java/view/InputView.java @@ -1,14 +1,37 @@ package view; +import model.BonusNumber; +import model.Lotto; import model.LottoPurchasePrice; +import java.util.Arrays; +import java.util.List; import java.util.Scanner; +import java.util.stream.Collectors; public class InputView { private static final Scanner scanner = new Scanner(System.in); public static LottoPurchasePrice inputLottoPurchasePrice() { System.out.println("구입금액을 입력해 주세요."); - return new LottoPurchasePrice(scanner.nextInt()); + LottoPurchasePrice lottoPurchasePrice = new LottoPurchasePrice(scanner.nextInt()); + scanner.nextLine(); + + return lottoPurchasePrice; + } + + public static Lotto inputWinningLotto() { + System.out.println("\n지난 주 당첨 번호를 입력해 주세요."); + List winningNumbers = Arrays.stream(scanner.nextLine().split(",")) + .map(String::trim) + .map(Integer::parseInt) + .collect(Collectors.toList()); + + return new Lotto(winningNumbers); + } + + public static BonusNumber inputBonusNumber() { + System.out.println("\n보너스 볼을 입력해 주세요."); + return new BonusNumber(scanner.nextInt()); } } From 4b84f5e9a1e4e01672756d567466e53f92b78026 Mon Sep 17 00:00:00 2001 From: wzrabbit Date: Mon, 27 Jan 2025 00:07:52 +0900 Subject: [PATCH 14/26] =?UTF-8?q?=E2=9C=A8=20feat:=20=EB=8B=B9=EC=B2=A8=20?= =?UTF-8?q?=EA=B2=B0=EA=B3=BC=EB=A5=BC=20=EC=B6=9C=EB=A0=A5=ED=95=98?= =?UTF-8?q?=EB=8A=94=20=EA=B8=B0=EB=8A=A5=EC=9D=84=20=EC=B6=94=EA=B0=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/main/java/view/OutputView.java | 17 +++++++++++++++++ 1 file changed, 17 insertions(+) diff --git a/src/main/java/view/OutputView.java b/src/main/java/view/OutputView.java index e315f728..573027ec 100644 --- a/src/main/java/view/OutputView.java +++ b/src/main/java/view/OutputView.java @@ -1,6 +1,8 @@ package view; import model.LottoList; +import model.LottoPrizeConstants; +import model.LottoPrizeResult; import java.util.List; @@ -15,4 +17,19 @@ public static void printLottoPurchases(LottoList lottoList) { public static void printErrorMessage(String errorMessage) { System.out.println("[ERROR] " + errorMessage + "\n"); } + + public static void printLottoPrizeResult(LottoPrizeResult lottoPrizeResult) { + System.out.println("당첨 통계\n---------"); + System.out.println("3개 일치 (" + LottoPrizeConstants.FIFTH_PRIZE_MONEY.getValue() + "원)- " + + lottoPrizeResult.getFifthPrizeCount() + "개"); + System.out.println("4개 일치 (" + LottoPrizeConstants.FOURTH_PRIZE_MONEY.getValue() + "원)- " + + lottoPrizeResult.getFourthPrizeCount() + "개"); + System.out.println("5개 일치 (" + LottoPrizeConstants.THIRD_PRIZE_MONEY.getValue() + "원)- " + + lottoPrizeResult.getThirdPrizeCount() + "개"); + System.out.println("5개 일치, 보너스 볼 일치(" + LottoPrizeConstants.SECOND_PRIZE_MONEY.getValue() + "원)- " + + lottoPrizeResult.getSecondPrizeCount() + "개"); + System.out.println("6개 일치 (" + LottoPrizeConstants.FIRST_PRIZE_MONEY.getValue() + "원)- " + + lottoPrizeResult.getFirstPrizeCount() + "개"); + System.out.println("총 수익률은 " + lottoPrizeResult.getProfitRate() + "입니다."); + } } From 7e8db89c9828ba6e29b79dfa92b197428636dcf0 Mon Sep 17 00:00:00 2001 From: wzrabbit Date: Mon, 27 Jan 2025 00:08:25 +0900 Subject: [PATCH 15/26] =?UTF-8?q?=E2=9C=A8=20feat:=20=EB=8B=B9=EC=B2=A8=20?= =?UTF-8?q?=EB=B2=88=ED=98=B8=20=EB=B0=8F=20=EB=B3=B4=EB=84=88=EC=8A=A4?= =?UTF-8?q?=EB=B3=BC=EC=9D=84=20=EC=9E=85=EB=A0=A5=EB=B0=9B=EC=95=84=20?= =?UTF-8?q?=EB=A1=9C=EB=98=90=20=EA=B2=B0=EA=B3=BC=EB=A5=BC=20=EB=B3=B4?= =?UTF-8?q?=EC=97=AC=EC=A3=BC=EB=8A=94=20=EA=B8=B0=EB=8A=A5=EC=9D=84=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 --- .../java/controller/LottoGameController.java | 21 +++++++++++++++++++ 1 file changed, 21 insertions(+) diff --git a/src/main/java/controller/LottoGameController.java b/src/main/java/controller/LottoGameController.java index 11e1c942..ebdb32d4 100644 --- a/src/main/java/controller/LottoGameController.java +++ b/src/main/java/controller/LottoGameController.java @@ -11,9 +11,11 @@ public class LottoGameController { private final LottoRandomNumberGenerator lottoRandomNumberGenerator = new LottoRandomNumberGenerator(); private final LottoGenerator lottoGenerator = new LottoGenerator(lottoRandomNumberGenerator); private LottoList lottoList; + private WinningLottoInfo winningLottoInfo; public void run() { inputLottoPurchasePrice(); + inputWinningLottoInfo(); } private void inputLottoPurchasePrice() { @@ -32,4 +34,23 @@ private void makeLottoList(int lottoCount) { OutputView.printLottoPurchases(lottoList); } + + private void inputWinningLottoInfo() { + try { + final Lotto winningLotto = InputView.inputWinningLotto(); + final BonusNumber bonusNumber = InputView.inputBonusNumber(); + this.winningLottoInfo = new WinningLottoInfo(winningLotto, bonusNumber); + printLottoPrizeResult(); + } catch (Exception exception) { + OutputView.printErrorMessage(exception.getMessage()); + } + } + + private void printLottoPrizeResult() { + try { + OutputView.printLottoPrizeResult(lottoList.getLottoResultByWinningLottoInfo(winningLottoInfo)); + } catch (Exception exception) { + OutputView.printErrorMessage(exception.getMessage()); + } + } } From 49db09c9fe84760eb8c1a52e8550be6823d203b0 Mon Sep 17 00:00:00 2001 From: wzrabbit Date: Mon, 27 Jan 2025 02:44:03 +0900 Subject: [PATCH 16/26] =?UTF-8?q?=E2=9C=A8=20feat:=20=EC=88=98=EB=8F=99=20?= =?UTF-8?q?=EA=B5=AC=EB=A7=A4=20=EA=B8=B0=EB=8A=A5=EC=9D=84=20=EC=B6=94?= =?UTF-8?q?=EA=B0=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../java/controller/LottoGameController.java | 77 +++++++++++++++---- src/main/java/view/InputView.java | 26 +++++++ 2 files changed, 89 insertions(+), 14 deletions(-) diff --git a/src/main/java/controller/LottoGameController.java b/src/main/java/controller/LottoGameController.java index ebdb32d4..29e10371 100644 --- a/src/main/java/controller/LottoGameController.java +++ b/src/main/java/controller/LottoGameController.java @@ -4,45 +4,94 @@ import view.InputView; import view.OutputView; +import java.util.ArrayList; +import java.util.List; import java.util.stream.IntStream; import java.util.stream.Collectors; public class LottoGameController { private final LottoRandomNumberGenerator lottoRandomNumberGenerator = new LottoRandomNumberGenerator(); private final LottoGenerator lottoGenerator = new LottoGenerator(lottoRandomNumberGenerator); + private LottoPurchasePrice lottoPurchasePrice; + private int lottoCount; + private int manualLottoCount; + private LottoList manualLottoList; private LottoList lottoList; private WinningLottoInfo winningLottoInfo; public void run() { inputLottoPurchasePrice(); + inputManualLottoCount(); + inputManualLottoList(); + makeLottoList(lottoCount); inputWinningLottoInfo(); + printLottoPrizeResult(); } private void inputLottoPurchasePrice() { - try { - final LottoPurchasePrice lottoPurchasePrice = InputView.inputLottoPurchasePrice(); - makeLottoList(lottoPurchasePrice.getLottoCount()); - } catch (Exception exception) { - OutputView.printErrorMessage(exception.getMessage()); + while (true) { + try { + lottoPurchasePrice = InputView.inputLottoPurchasePrice(); + lottoCount = lottoPurchasePrice.getLottoCount(); + break; + } catch (Exception exception) { + OutputView.printErrorMessage(exception.getMessage()); + } + } + } + + private void inputManualLottoCount() { + while (true) { + try { + int manualLottoCount = InputView.inputManualLottoCount(); + if (manualLottoCount > lottoPurchasePrice.getLottoCount()) { + throw new IllegalArgumentException("수동 로또의 개수가 전체 구매할 수 있는 로또 수인 " + + lottoPurchasePrice.getLottoCount() + + "개보다 많아서는 안 됩니다. 수동 로또의 개수를 줄여보세요."); + } + this.manualLottoCount = manualLottoCount; + break; + } catch (Exception exception) { + OutputView.printErrorMessage(exception.getMessage()); + } + } + } + + private void inputManualLottoList() { + while (true) { + try { + manualLottoList = InputView.inputManualLottoList(manualLottoCount); + break; + } catch (Exception exception) { + OutputView.printErrorMessage(exception.getMessage()); + } } } private void makeLottoList(int lottoCount) { - lottoList = new LottoList(IntStream.range(0, lottoCount) + int autoLottoCount = lottoCount - this.manualLottoList.size(); + List manualLottoList = this.manualLottoList.getValue(); + List autoLottoList = IntStream.range(0, autoLottoCount) .mapToObj(i -> lottoGenerator.generate()) - .collect(Collectors.toList())); + .collect(Collectors.toList()); + List concatedLottoList = new ArrayList<>(); + concatedLottoList.addAll(manualLottoList); + concatedLottoList.addAll(autoLottoList); + lottoList = new LottoList(concatedLottoList); OutputView.printLottoPurchases(lottoList); } private void inputWinningLottoInfo() { - try { - final Lotto winningLotto = InputView.inputWinningLotto(); - final BonusNumber bonusNumber = InputView.inputBonusNumber(); - this.winningLottoInfo = new WinningLottoInfo(winningLotto, bonusNumber); - printLottoPrizeResult(); - } catch (Exception exception) { - OutputView.printErrorMessage(exception.getMessage()); + while (true) { + try { + final Lotto winningLotto = InputView.inputWinningLotto(); + final BonusNumber bonusNumber = InputView.inputBonusNumber(); + this.winningLottoInfo = new WinningLottoInfo(winningLotto, bonusNumber); + break; + } catch (Exception exception) { + OutputView.printErrorMessage(exception.getMessage()); + } } } diff --git a/src/main/java/view/InputView.java b/src/main/java/view/InputView.java index b72164d9..08a93517 100644 --- a/src/main/java/view/InputView.java +++ b/src/main/java/view/InputView.java @@ -2,8 +2,10 @@ import model.BonusNumber; import model.Lotto; +import model.LottoList; import model.LottoPurchasePrice; +import java.util.ArrayList; import java.util.Arrays; import java.util.List; import java.util.Scanner; @@ -20,6 +22,30 @@ public static LottoPurchasePrice inputLottoPurchasePrice() { return lottoPurchasePrice; } + public static int inputManualLottoCount() { + System.out.println("\n수동으로 구매할 로또 수를 입력해 주세요."); + int manualLottoCount = scanner.nextInt(); + scanner.nextLine(); + + return manualLottoCount; + } + + public static LottoList inputManualLottoList(int manualLottoCount) { + List manualLottoList = new ArrayList<>(); + + System.out.println("\n수동으로 구매할 번호를 입력해 주세요."); + + for (int i = 1; i <= manualLottoCount; i++) { + Lotto manualLotto = new Lotto(Arrays.stream(scanner.nextLine().split(",")) + .map(String::trim) + .map(Integer::parseInt) + .collect(Collectors.toList())); + manualLottoList.add(manualLotto); + } + + return new LottoList(manualLottoList); + } + public static Lotto inputWinningLotto() { System.out.println("\n지난 주 당첨 번호를 입력해 주세요."); List winningNumbers = Arrays.stream(scanner.nextLine().split(",")) From de2e80865b8d2424bc9ddb11ce872a02cbbae957 Mon Sep 17 00:00:00 2001 From: wzrabbit Date: Mon, 27 Jan 2025 04:48:08 +0900 Subject: [PATCH 17/26] =?UTF-8?q?=E2=99=BB=EF=B8=8F=20refactor:=20?= =?UTF-8?q?=EB=B6=88=ED=95=84=EC=9A=94=ED=95=9C=20=EB=9E=9C=EB=8D=A4=20?= =?UTF-8?q?=EB=82=9C=EC=88=98=20=EC=83=9D=EC=84=B1=20=EC=9D=B8=ED=84=B0?= =?UTF-8?q?=ED=8E=98=EC=9D=B4=EC=8A=A4=20=EC=A0=9C=EA=B1=B0=20=EB=B0=8F=20?= =?UTF-8?q?=EB=A1=9C=EB=98=90=20=EC=83=9D=EC=84=B1=EA=B8=B0=20=EB=A1=9C?= =?UTF-8?q?=EC=A7=81=20=EB=A6=AC=ED=8C=A9=ED=84=B0=EB=A7=81?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - 발행된 로또 값들을 그대로 로또 클래스에 생성자로 넣기 때문에, 모킹이 필요하지 않으며, 상속 또한 필요하지 않음 --- src/main/java/model/LottoGenerator.java | 11 ++++------- src/main/java/model/LottoRandomNumberGenerator.java | 12 ------------ src/main/java/model/RandomNumberGenerator.java | 5 ----- 3 files changed, 4 insertions(+), 24 deletions(-) delete mode 100644 src/main/java/model/LottoRandomNumberGenerator.java delete mode 100644 src/main/java/model/RandomNumberGenerator.java diff --git a/src/main/java/model/LottoGenerator.java b/src/main/java/model/LottoGenerator.java index 47532baf..11ac1f9e 100644 --- a/src/main/java/model/LottoGenerator.java +++ b/src/main/java/model/LottoGenerator.java @@ -2,19 +2,17 @@ import java.util.ArrayList; import java.util.List; +import java.util.Random; public class LottoGenerator { - private final RandomNumberGenerator randomNumberGenerator; - - public LottoGenerator(RandomNumberGenerator randomNumberGenerator) { - this.randomNumberGenerator = randomNumberGenerator; - } + Random random = new Random(); public Lotto generate() { List lottoNumbers = new ArrayList<>(); while (lottoNumbers.size() < LottoConstants.NUMBER_COUNT.getValue()) { - int candidateLottoNumber = randomNumberGenerator.generate(); + int candidateLottoNumber = random.nextInt(LottoConstants.MIN_NUMBER.getValue(), + LottoConstants.MAX_NUMBER.getValue()); if (!lottoNumbers.contains(candidateLottoNumber)) { lottoNumbers.add(candidateLottoNumber); @@ -24,4 +22,3 @@ public Lotto generate() { return new Lotto(lottoNumbers); } } - diff --git a/src/main/java/model/LottoRandomNumberGenerator.java b/src/main/java/model/LottoRandomNumberGenerator.java deleted file mode 100644 index f0a54415..00000000 --- a/src/main/java/model/LottoRandomNumberGenerator.java +++ /dev/null @@ -1,12 +0,0 @@ -package model; - -import java.util.Random; - -public class LottoRandomNumberGenerator implements RandomNumberGenerator { - Random random = new Random(); - - @Override - public int generate() { - return random.nextInt(LottoConstants.MIN_NUMBER.getValue(), LottoConstants.MAX_NUMBER.getValue() + 1); - } -} diff --git a/src/main/java/model/RandomNumberGenerator.java b/src/main/java/model/RandomNumberGenerator.java deleted file mode 100644 index 036ec64b..00000000 --- a/src/main/java/model/RandomNumberGenerator.java +++ /dev/null @@ -1,5 +0,0 @@ -package model; - -public interface RandomNumberGenerator { - int generate(); -} From f763a05a98504c652e61ffab6fb779ae2659800b Mon Sep 17 00:00:00 2001 From: wzrabbit Date: Mon, 27 Jan 2025 04:48:33 +0900 Subject: [PATCH 18/26] =?UTF-8?q?=E2=9C=A8=20feat:=20=EC=88=98=EB=8F=99=20?= =?UTF-8?q?=EA=B5=AC=EB=A7=A4=20/=20=EC=9E=90=EB=8F=99=20=EA=B5=AC?= =?UTF-8?q?=EB=A7=A4=20=ED=9A=9F=EC=88=98=EB=A5=BC=20=EA=B5=AC=EB=B6=84?= =?UTF-8?q?=ED=95=98=EC=97=AC=20=EA=B2=B0=EA=B3=BC=EB=A1=9C=20=EB=B3=B4?= =?UTF-8?q?=EC=97=AC=EC=A3=BC=EB=8F=84=EB=A1=9D=20=EB=B3=80=EA=B2=BD?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/main/java/controller/LottoGameController.java | 5 ++--- src/main/java/view/OutputView.java | 4 ++-- 2 files changed, 4 insertions(+), 5 deletions(-) diff --git a/src/main/java/controller/LottoGameController.java b/src/main/java/controller/LottoGameController.java index 29e10371..49161144 100644 --- a/src/main/java/controller/LottoGameController.java +++ b/src/main/java/controller/LottoGameController.java @@ -10,8 +10,7 @@ import java.util.stream.Collectors; public class LottoGameController { - private final LottoRandomNumberGenerator lottoRandomNumberGenerator = new LottoRandomNumberGenerator(); - private final LottoGenerator lottoGenerator = new LottoGenerator(lottoRandomNumberGenerator); + private final LottoGenerator lottoGenerator = new LottoGenerator(); private LottoPurchasePrice lottoPurchasePrice; private int lottoCount; private int manualLottoCount; @@ -79,7 +78,7 @@ private void makeLottoList(int lottoCount) { concatedLottoList.addAll(autoLottoList); lottoList = new LottoList(concatedLottoList); - OutputView.printLottoPurchases(lottoList); + OutputView.printLottoPurchases(lottoList, manualLottoCount, autoLottoCount); } private void inputWinningLottoInfo() { diff --git a/src/main/java/view/OutputView.java b/src/main/java/view/OutputView.java index 573027ec..bf57d5ba 100644 --- a/src/main/java/view/OutputView.java +++ b/src/main/java/view/OutputView.java @@ -7,8 +7,8 @@ import java.util.List; public class OutputView { - public static void printLottoPurchases(LottoList lottoList) { - System.out.println("\n" + lottoList.size() + "개를 구매했습니다."); + public static void printLottoPurchases(LottoList lottoList, int manualLottoCount, int autoLottoCount) { + System.out.println("\n수동으로 " + manualLottoCount + "개, 자동으로 " + autoLottoCount + "개를 구매했습니다."); lottoList.getValue().forEach(lotto -> { System.out.println(lotto); }); From 5f16b837b06acca945a890e7f282a1977caa5443 Mon Sep 17 00:00:00 2001 From: wzrabbit Date: Mon, 27 Jan 2025 04:48:48 +0900 Subject: [PATCH 19/26] =?UTF-8?q?=E2=99=BB=EF=B8=8F=20refactor:=20?= =?UTF-8?q?=EC=9D=B8=EB=8D=B1=EC=8A=A4=20=EB=B0=98=ED=99=98=20=ED=95=A8?= =?UTF-8?q?=EC=88=98=20=EC=9D=80=EB=8B=89=ED=99=94?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/main/java/model/LottoList.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/main/java/model/LottoList.java b/src/main/java/model/LottoList.java index 0346f2e1..17995550 100644 --- a/src/main/java/model/LottoList.java +++ b/src/main/java/model/LottoList.java @@ -33,7 +33,7 @@ public LottoPrizeResult getLottoResultByWinningLottoInfo(WinningLottoInfo winnin return new LottoPrizeResult(lottoPrizesCount); } - int getLottoPrizeIndex(Lotto lotto, WinningLottoInfo winningLottoInfo) { + private int getLottoPrizeIndex(Lotto lotto, WinningLottoInfo winningLottoInfo) { Set lottoNumbers = new HashSet<>(lotto.getValue()); int matchCount = (int) winningLottoInfo.getLottoValue().stream().filter(lottoNumbers::contains).count(); From 8885997b1423a259a35363a72e35e4436393f82c Mon Sep 17 00:00:00 2001 From: wzrabbit Date: Mon, 27 Jan 2025 04:49:16 +0900 Subject: [PATCH 20/26] =?UTF-8?q?=F0=9F=A7=AA=20test:=20Lotto=20=ED=81=B4?= =?UTF-8?q?=EB=9E=98=EC=8A=A4=EC=97=90=20=EB=8C=80=ED=95=9C=20=EB=8B=A8?= =?UTF-8?q?=EC=9C=84=20=ED=85=8C=EC=8A=A4=ED=8A=B8=20=EC=B6=94=EA=B0=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/test/java/LottoTest.java | 61 ++++++++++++++++++++++++++++++++++++ 1 file changed, 61 insertions(+) create mode 100644 src/test/java/LottoTest.java diff --git a/src/test/java/LottoTest.java b/src/test/java/LottoTest.java new file mode 100644 index 00000000..cf8020f1 --- /dev/null +++ b/src/test/java/LottoTest.java @@ -0,0 +1,61 @@ +import model.Lotto; +import org.junit.jupiter.api.DisplayName; +import org.junit.jupiter.api.Nested; +import org.junit.jupiter.api.Test; + +import java.util.ArrayList; +import java.util.Arrays; +import java.util.List; + +import static org.assertj.core.api.Assertions.assertThatIllegalArgumentException; +import static org.assertj.core.api.AssertionsForClassTypes.assertThat; + +public class LottoTest { + @Nested + @DisplayName("Test #1 - 기본 기능 테스트") + class GeneralTest { + @Test + @DisplayName("정상적인 값을 이용해 로또를 생성한 이후 로또 값을 불러올 경우, 예외 발생 없이 값이 반환되어야 한다.") + void should_returnLottoValue_withoutException() { + Lotto lotto = new Lotto(Arrays.asList(1, 4, 9, 16, 25, 45)); + + assertThat(lotto.getValue()).isEqualTo(Arrays.asList(1, 4, 9, 16, 25, 45)); + } + + @Test + @DisplayName("로또 값을 불러올 경우에는 정렬된 형태의 로또 값을 반환해야 한다.") + void should_returnSortedLottoValue() { + Lotto lotto = new Lotto(Arrays.asList(9, 1, 12, 41, 25, 40)); + + assertThat(lotto.getValue()).isEqualTo(Arrays.asList(1, 9, 12, 25, 40, 41)); + } + } + + @Nested + @DisplayName("Test #2 - 유효성 검사 테스트") + class ValidationTest { + @Test + @DisplayName("로또 값을 만들기 위해 주어진 수가 6개가 아닌 경우 관련 예외를 설명하는 예외를 발생시켜야 한다.") + void should_throwException_If_LottoNumberCountIsNotSix() { + assertThatIllegalArgumentException().isThrownBy(() -> { + Lotto lotto = new Lotto(Arrays.asList(7, 20, 45, 19, 3)); + }).withMessage("로또 번호는 6개의 수로 이루어져야 합니다."); + } + + @Test + @DisplayName("로또 값을 만들기 위해 주어진 수 중 하나라도 1 이상 45 이하의 정수가 아닐 경우 관련 예외를 설명하는 예외를 발생시켜야 한다.") + void should_throwException_If_LottoNumberRangeIncorrect() { + assertThatIllegalArgumentException().isThrownBy(() -> { + Lotto lotto = new Lotto(Arrays.asList(0, 1, 2, 3, 4, 46)); + }).withMessage("로또 번호는 1 이상 45 이하여야 합니다."); + } + + @Test + @DisplayName("로또 값을 만들기 위해 주어진 수에 중복이 발생할 경우 관련 예외를 설명하는 예외를 발생시켜야 한다.") + void should_throwException_If_LottoNumberDuplicates() { + assertThatIllegalArgumentException().isThrownBy(() -> { + Lotto lotto = new Lotto(Arrays.asList(1, 40, 28, 40, 17, 34)); + }).withMessage("로또 번호는 중복되어서는 안 됩니다."); + } + } +} From 88007cdba22f69233fff68ed14464b3949d4d975 Mon Sep 17 00:00:00 2001 From: wzrabbit Date: Mon, 27 Jan 2025 04:49:21 +0900 Subject: [PATCH 21/26] =?UTF-8?q?=F0=9F=A7=AA=20test:=20LottoList=20?= =?UTF-8?q?=ED=81=B4=EB=9E=98=EC=8A=A4=EC=97=90=20=EB=8C=80=ED=95=9C=20?= =?UTF-8?q?=EB=8B=A8=EC=9C=84=20=ED=85=8C=EC=8A=A4=ED=8A=B8=20=EC=B6=94?= =?UTF-8?q?=EA=B0=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/test/java/LottoListTest.java | 70 ++++++++++++++++++++++++++++++++ 1 file changed, 70 insertions(+) create mode 100644 src/test/java/LottoListTest.java diff --git a/src/test/java/LottoListTest.java b/src/test/java/LottoListTest.java new file mode 100644 index 00000000..1ad2f76c --- /dev/null +++ b/src/test/java/LottoListTest.java @@ -0,0 +1,70 @@ +import model.*; +import org.junit.jupiter.api.DisplayName; +import org.junit.jupiter.api.Nested; +import org.junit.jupiter.api.Test; + +import java.lang.reflect.Array; +import java.util.ArrayList; +import java.util.Arrays; +import java.util.List; + +import static org.assertj.core.api.AssertionsForClassTypes.assertThat; +import static org.assertj.core.api.AssertionsForClassTypes.within; + +public class LottoListTest { + @Nested + @DisplayName("Test #1 - 기본 기능 테스트") + class GeneralTest { + @Test + @DisplayName("로또 목록에 대해 관련 정보의 반환을 요청할 경우 올바른 정보가 반환되어야 한다.") + void should_returnLottoListInfo() { + LottoList lottoList = new LottoList(Arrays.asList( + new Lotto(Arrays.asList(1, 4, 9, 16, 25, 45)), + new Lotto(Arrays.asList(3, 8, 10, 11, 12, 13)) + )); + + assertThat(lottoList.getValue()) + .usingRecursiveComparison() + .isEqualTo(Arrays.asList( + new Lotto(Arrays.asList(1, 4, 9, 16, 25, 45)), + new Lotto(Arrays.asList(3, 8, 10, 11, 12, 13)) + )); + assertThat(lottoList.size()).isEqualTo(2); + } + } + + @Nested + @DisplayName("Test #2 - 등수 판정 테스트") + class LottoPrizeCalculationTest { + @Test + @DisplayName("로또 목록에 대해 각 등수의 복권이 몇 개인지를 정확히 판정하여 결과를 반환하여야 한다.") + void should_calculatePrizeCountCorrectly() { + LottoList lottoList = new LottoList(Arrays.asList( + new Lotto(Arrays.asList(1, 2, 3, 4, 5, 6)), + new Lotto(Arrays.asList(1, 2, 4, 5, 6, 7)), + new Lotto(Arrays.asList(1, 8, 9, 10, 11, 12)), + new Lotto(Arrays.asList(1, 2, 3, 10, 11, 12)), + new Lotto(Arrays.asList(1, 2, 3, 4, 13, 14)), + new Lotto(Arrays.asList(3, 5, 6, 45, 44, 11)), + new Lotto(Arrays.asList(1, 2, 3, 4, 5, 8)) + )); + Lotto winningLotto = new Lotto(Arrays.asList(1, 2, 3, 4, 5, 6)); + BonusNumber bonusNumber = new BonusNumber(7); + WinningLottoInfo winningLottoInfo = new WinningLottoInfo(winningLotto, bonusNumber); + + LottoPrizeResult lottoPrizeResult = lottoList.getLottoResultByWinningLottoInfo(winningLottoInfo); + List prizeCounts = Arrays.asList( + lottoPrizeResult.getFirstPrizeCount(), + lottoPrizeResult.getSecondPrizeCount(), + lottoPrizeResult.getThirdPrizeCount(), + lottoPrizeResult.getFourthPrizeCount(), + lottoPrizeResult.getFifthPrizeCount() + ); + double profitRate = lottoPrizeResult.getProfitRate(); + + assertThat(prizeCounts).isEqualTo(Arrays.asList(1, 1, 1, 1, 2)); + assertThat(profitRate).isCloseTo(290222.85714285716, within(0.000001)); + } + } + +} From e7b158295e8e4f9e6897b246165340a8189dad0f Mon Sep 17 00:00:00 2001 From: wzrabbit Date: Sun, 9 Feb 2025 21:30:17 +0900 Subject: [PATCH 22/26] =?UTF-8?q?=E2=99=BB=EF=B8=8F=20refactor:=20import?= =?UTF-8?q?=ED=95=B4=EC=95=BC=20=ED=95=98=EB=8A=94=20=EB=9D=BC=EC=9D=B4?= =?UTF-8?q?=EB=B8=8C=EB=9F=AC=EB=A6=AC=EB=93=A4=EB=A7=8C=20import=ED=95=98?= =?UTF-8?q?=EB=8F=84=EB=A1=9D=20=EB=B3=80=EA=B2=BD?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/main/java/model/LottoList.java | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/src/main/java/model/LottoList.java b/src/main/java/model/LottoList.java index 17995550..df3ae886 100644 --- a/src/main/java/model/LottoList.java +++ b/src/main/java/model/LottoList.java @@ -1,6 +1,9 @@ package model; -import java.util.*; +import java.util.ArrayList; +import java.util.HashSet; +import java.util.List; +import java.util.Set; public class LottoList { List lottoList; From f214b474ce1fc09b67d8bce2d60134cc495b8fe4 Mon Sep 17 00:00:00 2001 From: wzrabbit Date: Mon, 10 Feb 2025 00:51:43 +0900 Subject: [PATCH 23/26] =?UTF-8?q?=E2=99=BB=EF=B8=8F=20refactor:=20?= =?UTF-8?q?=EB=B3=80=EA=B2=BD=EB=90=A0=20=EC=9D=BC=EC=9D=B4=20=EC=97=86?= =?UTF-8?q?=EB=8A=94=20=EB=B3=80=EC=88=98=EB=93=A4=EC=97=90=20final=20?= =?UTF-8?q?=ED=82=A4=EC=9B=8C=EB=93=9C=20=EC=82=AC=EC=9A=A9?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/main/java/model/LottoGenerator.java | 6 +++--- src/main/java/model/LottoList.java | 2 +- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/src/main/java/model/LottoGenerator.java b/src/main/java/model/LottoGenerator.java index 11ac1f9e..a0bd1ce1 100644 --- a/src/main/java/model/LottoGenerator.java +++ b/src/main/java/model/LottoGenerator.java @@ -5,13 +5,13 @@ import java.util.Random; public class LottoGenerator { - Random random = new Random(); + final Random random = new Random(); public Lotto generate() { - List lottoNumbers = new ArrayList<>(); + final List lottoNumbers = new ArrayList<>(); while (lottoNumbers.size() < LottoConstants.NUMBER_COUNT.getValue()) { - int candidateLottoNumber = random.nextInt(LottoConstants.MIN_NUMBER.getValue(), + final int candidateLottoNumber = random.nextInt(LottoConstants.MIN_NUMBER.getValue(), LottoConstants.MAX_NUMBER.getValue()); if (!lottoNumbers.contains(candidateLottoNumber)) { diff --git a/src/main/java/model/LottoList.java b/src/main/java/model/LottoList.java index df3ae886..1499372a 100644 --- a/src/main/java/model/LottoList.java +++ b/src/main/java/model/LottoList.java @@ -6,7 +6,7 @@ import java.util.Set; public class LottoList { - List lottoList; + private final List lottoList; public LottoList(List lottoList) { this.lottoList = new ArrayList<>(lottoList); From f7fc7a710b4e6f11729057274ac33ff4a68c86e5 Mon Sep 17 00:00:00 2001 From: wzrabbit Date: Mon, 10 Feb 2025 00:52:23 +0900 Subject: [PATCH 24/26] =?UTF-8?q?=E2=99=BB=EF=B8=8F=20refactor:=20?= =?UTF-8?q?=EB=A1=9C=EB=98=90=20=ED=81=B4=EB=9E=98=EC=8A=A4=EC=97=90=20`Co?= =?UTF-8?q?llections.unmodifiableList`=EB=A5=BC=20=EC=82=AC=EC=9A=A9?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/main/java/model/Lotto.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/main/java/model/Lotto.java b/src/main/java/model/Lotto.java index 5584e6e9..7099b8c6 100644 --- a/src/main/java/model/Lotto.java +++ b/src/main/java/model/Lotto.java @@ -37,7 +37,7 @@ private List getSortedLotto(List lotto) { } public List getValue() { - return lotto; + return Collections.unmodifiableList(lotto); } @Override From 1d9ec97cf9d4c1b2cae31dd73d6c477de3058783 Mon Sep 17 00:00:00 2001 From: wzrabbit Date: Wed, 12 Feb 2025 22:01:23 +0900 Subject: [PATCH 25/26] =?UTF-8?q?=E2=9C=A8=20feat:=20=EB=A1=9C=EB=98=90=20?= =?UTF-8?q?=EC=83=81=EA=B8=88=20enum=EC=9D=84=20=EA=B3=A0=EB=8F=84?= =?UTF-8?q?=ED=99=94,=20=EC=98=81=ED=96=A5=EC=9D=84=20=EB=B0=9B=EB=8A=94?= =?UTF-8?q?=20=ED=81=B4=EB=9E=98=EC=8A=A4=EB=93=A4=EC=9D=84=20=EB=A6=AC?= =?UTF-8?q?=ED=8C=A9=ED=84=B0=EB=A7=81?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/main/java/model/LottoList.java | 37 +++---------- src/main/java/model/LottoPrize.java | 43 +++++++++++++++ src/main/java/model/LottoPrizeConstants.java | 20 ------- src/main/java/model/LottoPrizeResult.java | 58 +++++++------------- src/main/java/view/OutputView.java | 27 ++++----- 5 files changed, 83 insertions(+), 102 deletions(-) create mode 100644 src/main/java/model/LottoPrize.java delete mode 100644 src/main/java/model/LottoPrizeConstants.java diff --git a/src/main/java/model/LottoList.java b/src/main/java/model/LottoList.java index 1499372a..dde11096 100644 --- a/src/main/java/model/LottoList.java +++ b/src/main/java/model/LottoList.java @@ -21,39 +21,16 @@ public int size() { } public LottoPrizeResult getLottoResultByWinningLottoInfo(WinningLottoInfo winningLottoInfo) { - List lottoPrizesCount = new ArrayList<>(); - - for (int i = 1; i <= LottoPrizeConstants.PRIZE_TYPE_COUNT.getValue(); i++) { - lottoPrizesCount.add(0); - } + LottoPrizeResult lottoPrizeResult = new LottoPrizeResult(); lottoList.forEach(lotto -> { - int lottoPrizeIndex = getLottoPrizeIndex(lotto, winningLottoInfo); - lottoPrizesCount.set(lottoPrizeIndex, lottoPrizesCount.get(lottoPrizeIndex) + 1); - }); - - - return new LottoPrizeResult(lottoPrizesCount); - } + Set lottoNumbers = new HashSet<>(lotto.getValue()); + int matchNumberCount = (int) winningLottoInfo.getLottoValue().stream().filter(lottoNumbers::contains).count(); + boolean hasBonusNumber = lottoNumbers.contains(winningLottoInfo.getBonusNumberValue()); - private int getLottoPrizeIndex(Lotto lotto, WinningLottoInfo winningLottoInfo) { - Set lottoNumbers = new HashSet<>(lotto.getValue()); - - int matchCount = (int) winningLottoInfo.getLottoValue().stream().filter(lottoNumbers::contains).count(); - boolean isBonusNumberMatched = lottoNumbers.contains(winningLottoInfo.getBonusNumberValue()); - - if (matchCount == 6) { - return 0; - } - - if (matchCount == 5 && isBonusNumberMatched) { - return 1; - } - - if (matchCount < 3) { - return 5; - } + lottoPrizeResult.addPrize(matchNumberCount, hasBonusNumber); + }); - return 7 - matchCount; + return lottoPrizeResult; } } diff --git a/src/main/java/model/LottoPrize.java b/src/main/java/model/LottoPrize.java new file mode 100644 index 00000000..10aa8afa --- /dev/null +++ b/src/main/java/model/LottoPrize.java @@ -0,0 +1,43 @@ +package model; + +public enum LottoPrize { + FIFTH(5_000, 3, false), + FOURTH(50_000, 4, false), + THIRD(1_500_000, 5, false), + SECOND(30_000_000, 5, true), + FIRST(2_000_000_000, 6, false); + + private final int money; + private final int matchNumberCount; + private final boolean hasBonusNumber; + + LottoPrize(int money, int matchNumberCount, boolean hasBonusNumber) { + this.money = money; + this.matchNumberCount = matchNumberCount; + this.hasBonusNumber = hasBonusNumber; + } + + public static LottoPrize getPrizeByMatchResult(int matchNumberCount, boolean hasBonusNumber) { + for (LottoPrize lottoPrize: values()) { + if (matchNumberCount != lottoPrize.matchNumberCount) { + continue; + } + + if (matchNumberCount == 5 && hasBonusNumber != lottoPrize.hasBonusNumber) { + continue; + } + + return lottoPrize; + } + + return null; + } + + public int getMoney() { + return money; + } + + public int getMatchNumberCount() { + return matchNumberCount; + } +} diff --git a/src/main/java/model/LottoPrizeConstants.java b/src/main/java/model/LottoPrizeConstants.java deleted file mode 100644 index 5ba88545..00000000 --- a/src/main/java/model/LottoPrizeConstants.java +++ /dev/null @@ -1,20 +0,0 @@ -package model; - -public enum LottoPrizeConstants { - FIRST_PRIZE_MONEY(2_000_000_000), - SECOND_PRIZE_MONEY(30_000_000), - THIRD_PRIZE_MONEY(1_500_000), - FOURTH_PRIZE_MONEY(50_000), - FIFTH_PRIZE_MONEY(5_000), - PRIZE_TYPE_COUNT(6); - - private final int value; - - LottoPrizeConstants(int value) { - this.value = value; - } - - public int getValue() { - return value; - } -} diff --git a/src/main/java/model/LottoPrizeResult.java b/src/main/java/model/LottoPrizeResult.java index 429fadce..f8098d7f 100644 --- a/src/main/java/model/LottoPrizeResult.java +++ b/src/main/java/model/LottoPrizeResult.java @@ -1,61 +1,45 @@ package model; -import java.util.ArrayList; -import java.util.List; +import java.util.*; public class LottoPrizeResult { - private final List prizeResult; + private final Map prizeResult; + int lottoCount; - public LottoPrizeResult(List prizeResult) { - validateLottoPrizeResult(prizeResult); - this.prizeResult = new ArrayList<>(prizeResult); - } + public LottoPrizeResult() { + this.prizeResult = new EnumMap(LottoPrize.class); + this.lottoCount = 0; - private void validateLottoPrizeResult(List prizeResult) { - if (prizeResult.size() != LottoPrizeConstants.PRIZE_TYPE_COUNT.getValue()) { - throw new IllegalArgumentException("당첨 결과는 " + LottoPrizeConstants.PRIZE_TYPE_COUNT.getValue() + - "개의 정수로 구성되어야 합니다."); + for (LottoPrize lottoPrize : LottoPrize.values()) { + prizeResult.put(lottoPrize, 0); } - - prizeResult.forEach(prizeCount -> { - if (prizeCount < 0) { - throw new IllegalArgumentException("당첨 횟수는 음수가 될 수 없습니다."); - } - }); } - public int getFirstPrizeCount() { - return prizeResult.get(0); + public Map getValue() { + return Collections.unmodifiableMap(prizeResult); } - public int getSecondPrizeCount() { - return prizeResult.get(1); - } + public void addPrize(int matchNumberCount, boolean hasBonusNumber) { + LottoPrize currentLottoPrize = LottoPrize.getPrizeByMatchResult(matchNumberCount, hasBonusNumber); - public int getThirdPrizeCount() { - return prizeResult.get(2); - } - - public int getFourthPrizeCount() { - return prizeResult.get(3); - } + if (currentLottoPrize != null) { + prizeResult.put(currentLottoPrize, prizeResult.get(currentLottoPrize) + 1); + } - public int getFifthPrizeCount() { - return prizeResult.get(4); + lottoCount += 1; } public double getProfitRate() { - int purchasePrice = prizeResult.stream().mapToInt(Integer::intValue).sum() * LottoConstants.PRICE.getValue(); + int purchasePrice = lottoCount * LottoConstants.PRICE.getValue(); if (purchasePrice == 0) { return 0; } - int totalPrizeMoney = getFirstPrizeCount() * LottoPrizeConstants.FIRST_PRIZE_MONEY.getValue() - + getSecondPrizeCount() * LottoPrizeConstants.SECOND_PRIZE_MONEY.getValue() - + getThirdPrizeCount() * LottoPrizeConstants.THIRD_PRIZE_MONEY.getValue() - + getFourthPrizeCount() * LottoPrizeConstants.FOURTH_PRIZE_MONEY.getValue() - + getFifthPrizeCount() * LottoPrizeConstants.FIFTH_PRIZE_MONEY.getValue(); + int totalPrizeMoney = + prizeResult.entrySet().stream() + .mapToInt(entry -> entry.getKey().getMoney() * entry.getValue()) + .sum(); return (double) totalPrizeMoney / purchasePrice; } diff --git a/src/main/java/view/OutputView.java b/src/main/java/view/OutputView.java index bf57d5ba..d1d71770 100644 --- a/src/main/java/view/OutputView.java +++ b/src/main/java/view/OutputView.java @@ -1,11 +1,9 @@ package view; import model.LottoList; -import model.LottoPrizeConstants; +import model.LottoPrize; import model.LottoPrizeResult; -import java.util.List; - public class OutputView { public static void printLottoPurchases(LottoList lottoList, int manualLottoCount, int autoLottoCount) { System.out.println("\n수동으로 " + manualLottoCount + "개, 자동으로 " + autoLottoCount + "개를 구매했습니다."); @@ -19,17 +17,16 @@ public static void printErrorMessage(String errorMessage) { } public static void printLottoPrizeResult(LottoPrizeResult lottoPrizeResult) { - System.out.println("당첨 통계\n---------"); - System.out.println("3개 일치 (" + LottoPrizeConstants.FIFTH_PRIZE_MONEY.getValue() + "원)- " - + lottoPrizeResult.getFifthPrizeCount() + "개"); - System.out.println("4개 일치 (" + LottoPrizeConstants.FOURTH_PRIZE_MONEY.getValue() + "원)- " - + lottoPrizeResult.getFourthPrizeCount() + "개"); - System.out.println("5개 일치 (" + LottoPrizeConstants.THIRD_PRIZE_MONEY.getValue() + "원)- " - + lottoPrizeResult.getThirdPrizeCount() + "개"); - System.out.println("5개 일치, 보너스 볼 일치(" + LottoPrizeConstants.SECOND_PRIZE_MONEY.getValue() + "원)- " - + lottoPrizeResult.getSecondPrizeCount() + "개"); - System.out.println("6개 일치 (" + LottoPrizeConstants.FIRST_PRIZE_MONEY.getValue() + "원)- " - + lottoPrizeResult.getFirstPrizeCount() + "개"); - System.out.println("총 수익률은 " + lottoPrizeResult.getProfitRate() + "입니다."); + System.out.println("\n당첨 통계\n---------"); + + lottoPrizeResult.getValue().forEach((key, value) -> { + if (key == LottoPrize.SECOND) { + System.out.printf("%d개 일치, 보너스 볼 일치(%d원)- %d개\n", key.getMatchNumberCount(), key.getMoney(), value); + } else { + System.out.printf("%d개 일치 (%d원)- %d개\n", key.getMatchNumberCount(), key.getMoney(), value); + } + }); + + System.out.printf("총 수익률은 %.2f입니다.", lottoPrizeResult.getProfitRate()); } } From c4bea121332d23c048f530abec54f938d2faf79f Mon Sep 17 00:00:00 2001 From: wzrabbit Date: Wed, 12 Feb 2025 22:01:43 +0900 Subject: [PATCH 26/26] =?UTF-8?q?=F0=9F=A7=AA=20test:=20=EB=A1=9C=EB=98=90?= =?UTF-8?q?=20=EC=83=81=EA=B8=88=20enum=20=EB=B3=80=EA=B2=BD=EC=97=90=20?= =?UTF-8?q?=EB=94=B0=EB=A5=B8=20=ED=85=8C=EC=8A=A4=ED=8A=B8=20=EB=A1=9C?= =?UTF-8?q?=EC=A7=81=20=EB=B3=80=EA=B2=BD?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/test/java/LottoListTest.java | 16 +++++++--------- 1 file changed, 7 insertions(+), 9 deletions(-) diff --git a/src/test/java/LottoListTest.java b/src/test/java/LottoListTest.java index 1ad2f76c..09410217 100644 --- a/src/test/java/LottoListTest.java +++ b/src/test/java/LottoListTest.java @@ -53,18 +53,16 @@ void should_calculatePrizeCountCorrectly() { WinningLottoInfo winningLottoInfo = new WinningLottoInfo(winningLotto, bonusNumber); LottoPrizeResult lottoPrizeResult = lottoList.getLottoResultByWinningLottoInfo(winningLottoInfo); - List prizeCounts = Arrays.asList( - lottoPrizeResult.getFirstPrizeCount(), - lottoPrizeResult.getSecondPrizeCount(), - lottoPrizeResult.getThirdPrizeCount(), - lottoPrizeResult.getFourthPrizeCount(), - lottoPrizeResult.getFifthPrizeCount() - ); + List prizeCounts = new ArrayList<>(); + + lottoPrizeResult.getValue().forEach((key, value) -> { + prizeCounts.add(value); + }); + double profitRate = lottoPrizeResult.getProfitRate(); - assertThat(prizeCounts).isEqualTo(Arrays.asList(1, 1, 1, 1, 2)); + assertThat(prizeCounts).isEqualTo(Arrays.asList(2, 1, 1, 1, 1)); assertThat(profitRate).isCloseTo(290222.85714285716, within(0.000001)); } } - }