From 989019173917c6ca660b5b2e4aa008e6ce70f807 Mon Sep 17 00:00:00 2001 From: "lalla.you" Date: Thu, 3 Apr 2025 21:15:12 +0900 Subject: [PATCH 1/7] =?UTF-8?q?refactor:=20lotto=20number=20list=EB=A5=BC?= =?UTF-8?q?=20set=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/lotto/Lotto.java | 15 +++++++++------ src/main/java/view/OutputView.java | 3 ++- src/test/java/lotto/LottoNumberGeneratorTest.java | 11 ----------- src/test/java/lotto/LottoTest.java | 1 - 4 files changed, 11 insertions(+), 19 deletions(-) diff --git a/src/main/java/lotto/Lotto.java b/src/main/java/lotto/Lotto.java index 5f5d5aa850..10c6769d13 100644 --- a/src/main/java/lotto/Lotto.java +++ b/src/main/java/lotto/Lotto.java @@ -8,14 +8,18 @@ public class Lotto { public static final int LOTTO_PRICE = 1000; public static final long LOTTO_NUM_COUNT = 6; - private final List lottoNumbers; + private final Set lottoNumbers; public Lotto(List lottoNumbers) { + this(new HashSet<>(lottoNumbers)); + } + + public Lotto(Set lottoNumbers) { validateLottoNumbers(lottoNumbers); this.lottoNumbers = lottoNumbers; } - public List getLottoNumbers() { + public Set getLottoNumbers() { return lottoNumbers; } @@ -23,13 +27,12 @@ public LottoRank getLottoRank(List winningNumbers, Integer bonusNumber) return LottoRank.fromMatchCount((int) this.lottoNumbers.stream().filter(winningNumbers::contains).count(), lottoNumbers.contains(bonusNumber)); } - private void validateLottoNumbers(List numbers) { - if (numbers.size() != LOTTO_NUM_COUNT) { + private void validateLottoNumbers(Set numbers) { + if (numbers.size() > LOTTO_NUM_COUNT) { throw new IllegalArgumentException("로또 번호는 6개여야 합니다."); } - Set uniqueNumbers = new HashSet<>(numbers); - if (uniqueNumbers.size() != LOTTO_NUM_COUNT) { + if (numbers.size() < LOTTO_NUM_COUNT) { throw new IllegalArgumentException("로또 번호는 중복될 수 없습니다."); } } diff --git a/src/main/java/view/OutputView.java b/src/main/java/view/OutputView.java index c547860194..96aa85c29b 100644 --- a/src/main/java/view/OutputView.java +++ b/src/main/java/view/OutputView.java @@ -6,6 +6,7 @@ import java.util.Arrays; import java.util.List; +import java.util.Set; public class OutputView { @@ -17,7 +18,7 @@ public static void showLottoQuantity(int lottoQuantity) { System.out.println(lottoQuantity + "개를 구매했습니다."); } - public static void showLottoNumbers(List numbers) { + public static void showLottoNumbers(Set numbers) { System.out.println(numbers); } diff --git a/src/test/java/lotto/LottoNumberGeneratorTest.java b/src/test/java/lotto/LottoNumberGeneratorTest.java index 07a4f625aa..245192467d 100644 --- a/src/test/java/lotto/LottoNumberGeneratorTest.java +++ b/src/test/java/lotto/LottoNumberGeneratorTest.java @@ -2,10 +2,8 @@ import org.junit.jupiter.api.Test; -import java.util.HashSet; import java.util.List; -import static lotto.Lotto.LOTTO_NUM_COUNT; import static org.assertj.core.api.AssertionsForClassTypes.assertThat; public class LottoNumberGeneratorTest { @@ -17,13 +15,4 @@ public class LottoNumberGeneratorTest { assertThat(lottos.size()).isEqualTo(quantity); } - @Test - void 각_Lotto는_6개의_서로_다른_숫자를_가진다() { - List lottos = LottoNumberGenerator.generateLottoNumbers(1); - List numbers = lottos.get(0).getLottoNumbers(); - - assertThat(numbers.size()).isEqualTo(LOTTO_NUM_COUNT); - assertThat(new HashSet<>(numbers).size()).isEqualTo(numbers.size()); - } - } diff --git a/src/test/java/lotto/LottoTest.java b/src/test/java/lotto/LottoTest.java index 573e710d24..4d85954d9d 100644 --- a/src/test/java/lotto/LottoTest.java +++ b/src/test/java/lotto/LottoTest.java @@ -68,5 +68,4 @@ void getLottoRank_Second() { new Lotto(Arrays.asList(1, 2, 3, 3, 4, 5, 5)); }).isInstanceOf(IllegalArgumentException.class); } - } From 1dfd6b364c09aa26e5015ecb609eab1f8b94a878 Mon Sep 17 00:00:00 2001 From: "lalla.you" Date: Fri, 4 Apr 2025 11:19:49 +0900 Subject: [PATCH 2/7] =?UTF-8?q?docs:=20=EA=B8=B0=EB=8A=A5=20=EC=9A=94?= =?UTF-8?q?=EA=B5=AC=20=EC=82=AC=ED=95=AD=20=EC=A0=95=EB=A6=AC?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- README.md | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/README.md b/README.md index a162aabd30..30d6547083 100644 --- a/README.md +++ b/README.md @@ -33,3 +33,7 @@ ### 3단계 - 로또(2등) - [X] 보너스볼 입력 - [X] rank 2등 추가 + +### 4단계 - 로또(수동) +- [ ] 수동으로 구매할 로또 수 입력 +- [ ] 수동으로 구매할 로또 번호 입력 From d674e579d73e7eec9a3dc65b2eaf4ab57d29e00d Mon Sep 17 00:00:00 2001 From: "lalla.you" Date: Fri, 4 Apr 2025 13:10:13 +0900 Subject: [PATCH 3/7] =?UTF-8?q?feat:=20=EC=88=98=EB=8F=99=EA=B5=AC?= =?UTF-8?q?=EB=A7=A4=EA=B8=B0=EB=8A=A5=20=EC=B6=94=EA=B0=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- README.md | 4 ++-- src/main/java/lotto/LottoApplication.java | 12 +++++++++-- src/main/java/view/InputView.java | 26 +++++++++++++++++++---- 3 files changed, 34 insertions(+), 8 deletions(-) diff --git a/README.md b/README.md index 30d6547083..626d11bf78 100644 --- a/README.md +++ b/README.md @@ -35,5 +35,5 @@ - [X] rank 2등 추가 ### 4단계 - 로또(수동) -- [ ] 수동으로 구매할 로또 수 입력 -- [ ] 수동으로 구매할 로또 번호 입력 +- [X] 수동으로 구매할 로또 수 입력 +- [X] 수동으로 구매할 로또 번호 입력 diff --git a/src/main/java/lotto/LottoApplication.java b/src/main/java/lotto/LottoApplication.java index 093e4cfe29..fb09579906 100644 --- a/src/main/java/lotto/LottoApplication.java +++ b/src/main/java/lotto/LottoApplication.java @@ -5,6 +5,7 @@ import view.InputView; import view.OutputView; +import java.util.ArrayList; import java.util.List; import static lotto.Lotto.LOTTO_PRICE; @@ -13,14 +14,21 @@ public class LottoApplication { public static void main(String[] args) { + Integer lottoPurchaseAmount = InputView.showLottoPurchaseAmountInput(); + Integer lottoQuantity = Operator.DIVIDE.formula.apply(lottoPurchaseAmount, LOTTO_PRICE); OutputView.showLottoQuantity(lottoQuantity); - List lottos = LottoNumberGenerator.generateLottoNumbers(lottoQuantity); + int manualLottoCount = InputView.showManualLottoCountInput(); + + List lottos = new ArrayList<>(InputView.showManualLottoNumbersInput(manualLottoCount)); + + int automaticLottoCount = lottoQuantity - manualLottoCount; + lottos.addAll(LottoNumberGenerator.generateLottoNumbers(automaticLottoCount)); OutputView.showGeneratedLottoNumber(lottos); - List winningLotto = LottoNumbersParser.parse(InputView.showWinningLottoNumbersInput()); + List winningLotto = LottoNumbersParser.parse(InputView.showWinningLottoNumbersInput()); Integer bonusNumber = InputView.showLottoBonusNumberInput(); LottosResult lottosResult = new LottosResult(lottos, winningLotto, bonusNumber); diff --git a/src/main/java/view/InputView.java b/src/main/java/view/InputView.java index f0532180c4..6c09531b3a 100644 --- a/src/main/java/view/InputView.java +++ b/src/main/java/view/InputView.java @@ -1,30 +1,48 @@ package view; +import lotto.Lotto; + +import java.util.ArrayList; +import java.util.List; import java.util.Scanner; public class InputView { + private static final Scanner scanner = new Scanner(System.in); public static String showExpressionInput() { System.out.println("수식 입력 > "); - Scanner scanner = new Scanner(System.in); return scanner.nextLine(); } public static Integer showLottoPurchaseAmountInput() { System.out.println("구입금액을 입력해 주세요."); - Scanner scanner = new Scanner(System.in); return scanner.nextInt(); } public static String showWinningLottoNumbersInput() { System.out.println("\n지난 주 당첨 번호를 입력해 주세요."); - Scanner scanner = new Scanner(System.in); return scanner.nextLine(); } public static Integer showLottoBonusNumberInput() { System.out.println("보너스 볼을 입력해 주세요."); - Scanner scanner = new Scanner(System.in); return scanner.nextInt(); } + + public static Integer showManualLottoCountInput() { + System.out.println("\n수동으로 구매할 로또 수를 입력해 주세요."); + int manualLottoCount = scanner.nextInt(); + scanner.nextLine(); + return manualLottoCount; + } + + public static List showManualLottoNumbersInput(int manualLottoCount) { + System.out.println("\n수동으로 구매할 번호를 입력해 주세요."); + List manualLottoNumbers = new ArrayList<>(); + for (int i = 0; i < manualLottoCount; i++) { + String input = scanner.nextLine(); + manualLottoNumbers.add(new Lotto(LottoNumbersParser.parse(input))); + } + return manualLottoNumbers; + } } From 4a48f96f0f2775cb4340532e333e7f25597c5064 Mon Sep 17 00:00:00 2001 From: "lalla.you" Date: Fri, 4 Apr 2025 13:14:33 +0900 Subject: [PATCH 4/7] =?UTF-8?q?refactor:=20nextInt=20=EA=B0=9C=ED=96=89?= =?UTF-8?q?=EC=B2=98=EB=A6=AC=20=ED=95=B4=EA=B2=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/main/java/view/InputView.java | 18 +++++++++++++----- 1 file changed, 13 insertions(+), 5 deletions(-) diff --git a/src/main/java/view/InputView.java b/src/main/java/view/InputView.java index 6c09531b3a..faf969e2e8 100644 --- a/src/main/java/view/InputView.java +++ b/src/main/java/view/InputView.java @@ -16,7 +16,7 @@ public static String showExpressionInput() { public static Integer showLottoPurchaseAmountInput() { System.out.println("구입금액을 입력해 주세요."); - return scanner.nextInt(); + return readInt(); } public static String showWinningLottoNumbersInput() { @@ -26,14 +26,12 @@ public static String showWinningLottoNumbersInput() { public static Integer showLottoBonusNumberInput() { System.out.println("보너스 볼을 입력해 주세요."); - return scanner.nextInt(); + return readInt(); } public static Integer showManualLottoCountInput() { System.out.println("\n수동으로 구매할 로또 수를 입력해 주세요."); - int manualLottoCount = scanner.nextInt(); - scanner.nextLine(); - return manualLottoCount; + return readInt(); } public static List showManualLottoNumbersInput(int manualLottoCount) { @@ -45,4 +43,14 @@ public static List showManualLottoNumbersInput(int manualLottoCount) { } return manualLottoNumbers; } + + private static Integer readInt() { + String input = scanner.nextLine(); + try { + return Integer.parseInt(input); + } catch (NumberFormatException e) { + System.out.println("잘못된 입력입니다. 다시 시도하세요."); + return readInt(); + } + } } From bf407d981a9c19c541771047cd5d80010c5d4121 Mon Sep 17 00:00:00 2001 From: "lalla.you" Date: Fri, 4 Apr 2025 13:24:32 +0900 Subject: [PATCH 5/7] =?UTF-8?q?feat:=20=EB=A1=9C=EB=98=90=20=EA=B5=AC?= =?UTF-8?q?=EB=A7=A4=20=EA=B0=AF=EC=88=98=20=EC=B6=9C=EB=A0=A5=20=EC=88=98?= =?UTF-8?q?=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/main/java/lotto/LottoApplication.java | 12 +++++------- src/main/java/view/InputView.java | 8 ++++---- src/main/java/view/OutputView.java | 5 +++-- 3 files changed, 12 insertions(+), 13 deletions(-) diff --git a/src/main/java/lotto/LottoApplication.java b/src/main/java/lotto/LottoApplication.java index fb09579906..2efbd410df 100644 --- a/src/main/java/lotto/LottoApplication.java +++ b/src/main/java/lotto/LottoApplication.java @@ -15,17 +15,15 @@ public class LottoApplication { public static void main(String[] args) { - Integer lottoPurchaseAmount = InputView.showLottoPurchaseAmountInput(); - - Integer lottoQuantity = Operator.DIVIDE.formula.apply(lottoPurchaseAmount, LOTTO_PRICE); - OutputView.showLottoQuantity(lottoQuantity); + int lottoPurchaseAmount = InputView.showLottoPurchaseAmountInput(); + int totalLottoCount = Operator.DIVIDE.formula.apply(lottoPurchaseAmount, LOTTO_PRICE); int manualLottoCount = InputView.showManualLottoCountInput(); - List lottos = new ArrayList<>(InputView.showManualLottoNumbersInput(manualLottoCount)); - int automaticLottoCount = lottoQuantity - manualLottoCount; - lottos.addAll(LottoNumberGenerator.generateLottoNumbers(automaticLottoCount)); + int autoLottoCount = totalLottoCount - manualLottoCount; + lottos.addAll(LottoNumberGenerator.generateLottoNumbers(autoLottoCount)); + OutputView.showTotalLottoCount(manualLottoCount, autoLottoCount); OutputView.showGeneratedLottoNumber(lottos); List winningLotto = LottoNumbersParser.parse(InputView.showWinningLottoNumbersInput()); diff --git a/src/main/java/view/InputView.java b/src/main/java/view/InputView.java index faf969e2e8..07610e6746 100644 --- a/src/main/java/view/InputView.java +++ b/src/main/java/view/InputView.java @@ -14,7 +14,7 @@ public static String showExpressionInput() { return scanner.nextLine(); } - public static Integer showLottoPurchaseAmountInput() { + public static int showLottoPurchaseAmountInput() { System.out.println("구입금액을 입력해 주세요."); return readInt(); } @@ -24,12 +24,12 @@ public static String showWinningLottoNumbersInput() { return scanner.nextLine(); } - public static Integer showLottoBonusNumberInput() { + public static int showLottoBonusNumberInput() { System.out.println("보너스 볼을 입력해 주세요."); return readInt(); } - public static Integer showManualLottoCountInput() { + public static int showManualLottoCountInput() { System.out.println("\n수동으로 구매할 로또 수를 입력해 주세요."); return readInt(); } @@ -44,7 +44,7 @@ public static List showManualLottoNumbersInput(int manualLottoCount) { return manualLottoNumbers; } - private static Integer readInt() { + private static int readInt() { String input = scanner.nextLine(); try { return Integer.parseInt(input); diff --git a/src/main/java/view/OutputView.java b/src/main/java/view/OutputView.java index 96aa85c29b..9fa2942956 100644 --- a/src/main/java/view/OutputView.java +++ b/src/main/java/view/OutputView.java @@ -14,8 +14,8 @@ public static void showResult(int result) { System.out.println("result = " + result); } - public static void showLottoQuantity(int lottoQuantity) { - System.out.println(lottoQuantity + "개를 구매했습니다."); + public static void showTotalLottoCount(int manualLottoCount, int autoLottoCount) { + System.out.println("\n수동으로 " + manualLottoCount + "장, 자동으로 " + autoLottoCount + "개를 구매했습니다."); } public static void showLottoNumbers(Set numbers) { @@ -41,3 +41,4 @@ public static void showGeneratedLottoNumber(List lottos) { lottos.forEach(lotto -> showLottoNumbers(lotto.getLottoNumbers())); } } + From 5af39cb6074741e0a08d607592e7dc30685fd0d2 Mon Sep 17 00:00:00 2001 From: "lalla.you" Date: Fri, 4 Apr 2025 13:34:58 +0900 Subject: [PATCH 6/7] =?UTF-8?q?feat:=20=EB=B3=B4=EB=84=88=EC=8A=A4?= =?UTF-8?q?=EB=B3=BC=20=EA=B2=B0=EA=B3=BC=EB=8F=84=20=ED=95=A8=EA=BB=98=20?= =?UTF-8?q?=EC=B6=9C=EB=A0=A5?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/main/java/lotto/LottoRank.java | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/src/main/java/lotto/LottoRank.java b/src/main/java/lotto/LottoRank.java index 401b54a342..e142122d8e 100644 --- a/src/main/java/lotto/LottoRank.java +++ b/src/main/java/lotto/LottoRank.java @@ -33,6 +33,7 @@ public static LottoRank fromMatchCount(int matchCount, boolean isBonusMatch) { @Override public String toString() { - return String.format("%d개 일치 (%,d원)", matchCount, prize); + String bonusText = isBonusMatch ? ", 보너스 볼 일치" : ""; + return String.format("%d개 일치%s (%,d원)", matchCount, bonusText, prize); } } From 100e4a1c695aba515ab9a99f287b3b2aab293e92 Mon Sep 17 00:00:00 2001 From: "lalla.you" Date: Sat, 5 Apr 2025 20:45:06 +0900 Subject: [PATCH 7/7] =?UTF-8?q?refactor:=20LottoNumber=20=EC=83=9D?= =?UTF-8?q?=EC=84=B1?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/main/java/lotto/Lotto.java | 27 ++++++------ src/main/java/lotto/LottoApplication.java | 4 +- src/main/java/lotto/LottoNumber.java | 41 +++++++++++++++++++ src/main/java/lotto/LottoNumberGenerator.java | 10 ++--- src/main/java/lotto/LottosResult.java | 8 ++-- src/main/java/view/InputView.java | 5 ++- src/main/java/view/OutputView.java | 3 +- src/test/java/lotto/LottoNumberTest.java | 26 ++++++++++++ src/test/java/lotto/LottoTest.java | 32 +++++++-------- 9 files changed, 110 insertions(+), 46 deletions(-) create mode 100644 src/main/java/lotto/LottoNumber.java create mode 100644 src/test/java/lotto/LottoNumberTest.java diff --git a/src/main/java/lotto/Lotto.java b/src/main/java/lotto/Lotto.java index 10c6769d13..97b58009e9 100644 --- a/src/main/java/lotto/Lotto.java +++ b/src/main/java/lotto/Lotto.java @@ -3,36 +3,39 @@ import java.util.HashSet; import java.util.List; import java.util.Set; +import java.util.stream.Collectors; public class Lotto { public static final int LOTTO_PRICE = 1000; public static final long LOTTO_NUM_COUNT = 6; - private final Set lottoNumbers; + private final Set lottoNumbers; - public Lotto(List lottoNumbers) { - this(new HashSet<>(lottoNumbers)); + public Lotto(List numbers) { + this(new HashSet<>(numbers)); } - public Lotto(Set lottoNumbers) { - validateLottoNumbers(lottoNumbers); - this.lottoNumbers = lottoNumbers; + public Lotto(Set numbers) { + this.lottoNumbers = numbers.stream().map(LottoNumber::of).collect(Collectors.toSet()); + validateLottoNumbers(); } - public Set getLottoNumbers() { + public Set getLottoNumbers() { return lottoNumbers; } - public LottoRank getLottoRank(List winningNumbers, Integer bonusNumber) { - return LottoRank.fromMatchCount((int) this.lottoNumbers.stream().filter(winningNumbers::contains).count(), lottoNumbers.contains(bonusNumber)); + public LottoRank getLottoRank(Lotto winningNumbers, int bonusNumber) { + int matchCount = (int) this.lottoNumbers.stream().filter(winningNumbers.getLottoNumbers()::contains).count(); + boolean isBonusNumber = lottoNumbers.contains(LottoNumber.of(bonusNumber)); + return LottoRank.fromMatchCount(matchCount, isBonusNumber); } - private void validateLottoNumbers(Set numbers) { - if (numbers.size() > LOTTO_NUM_COUNT) { + private void validateLottoNumbers() { + if (lottoNumbers.size() > LOTTO_NUM_COUNT) { throw new IllegalArgumentException("로또 번호는 6개여야 합니다."); } - if (numbers.size() < LOTTO_NUM_COUNT) { + if (lottoNumbers.size() < LOTTO_NUM_COUNT) { throw new IllegalArgumentException("로또 번호는 중복될 수 없습니다."); } } diff --git a/src/main/java/lotto/LottoApplication.java b/src/main/java/lotto/LottoApplication.java index 2efbd410df..a3ea07f54e 100644 --- a/src/main/java/lotto/LottoApplication.java +++ b/src/main/java/lotto/LottoApplication.java @@ -1,7 +1,6 @@ package lotto; import calculator.Operator; -import view.LottoNumbersParser; import view.InputView; import view.OutputView; @@ -14,7 +13,6 @@ public class LottoApplication { public static void main(String[] args) { - int lottoPurchaseAmount = InputView.showLottoPurchaseAmountInput(); int totalLottoCount = Operator.DIVIDE.formula.apply(lottoPurchaseAmount, LOTTO_PRICE); @@ -26,7 +24,7 @@ public static void main(String[] args) { OutputView.showTotalLottoCount(manualLottoCount, autoLottoCount); OutputView.showGeneratedLottoNumber(lottos); - List winningLotto = LottoNumbersParser.parse(InputView.showWinningLottoNumbersInput()); + Lotto winningLotto = InputView.showWinningLottoNumbersInput(); Integer bonusNumber = InputView.showLottoBonusNumberInput(); LottosResult lottosResult = new LottosResult(lottos, winningLotto, bonusNumber); diff --git a/src/main/java/lotto/LottoNumber.java b/src/main/java/lotto/LottoNumber.java new file mode 100644 index 0000000000..f86b6f41c2 --- /dev/null +++ b/src/main/java/lotto/LottoNumber.java @@ -0,0 +1,41 @@ +package lotto; + +import java.util.HashMap; +import java.util.Map; +import java.util.stream.IntStream; + +public class LottoNumber { + + static final int LOTTO_MIN_NUM = 1; + static final int LOTTO_MAX_NUM = 45; + + public static final Map lottoNumberMap = IntStream.rangeClosed(LOTTO_MIN_NUM, LOTTO_MAX_NUM) + .boxed() + .collect(HashMap::new, (map, number) -> map.put(number, new LottoNumber(number)), HashMap::putAll); + + private final int number; + + private LottoNumber(int number) { + this.number = number; + } + + private static void validateLottoNumber(Integer number) { + if (number == null) { + throw new IllegalArgumentException("로또 번호는 null일 수 없습니다."); + } + if (number < LOTTO_MIN_NUM || number > LOTTO_MAX_NUM) { + throw new IllegalArgumentException("로또 번호는 1부터 45 사이의 숫자여야 합니다."); + } + } + + public static LottoNumber of(Integer number) { + validateLottoNumber(number); + return lottoNumberMap.get(number); + } + + @Override + public String toString() { + return String.valueOf(number); + } + +} diff --git a/src/main/java/lotto/LottoNumberGenerator.java b/src/main/java/lotto/LottoNumberGenerator.java index 98f149eaf7..4d78b0cddb 100644 --- a/src/main/java/lotto/LottoNumberGenerator.java +++ b/src/main/java/lotto/LottoNumberGenerator.java @@ -1,20 +1,16 @@ package lotto; +import java.util.ArrayList; import java.util.Collections; import java.util.List; import java.util.stream.Collectors; import java.util.stream.IntStream; import static lotto.Lotto.LOTTO_NUM_COUNT; +import static lotto.LottoNumber.*; public class LottoNumberGenerator { - - private static final int LOTTO_MIN_NUM = 1; - private static final int LOTTO_MAX_NUM = 45; - - private static List numbersPool = IntStream.rangeClosed(LOTTO_MIN_NUM, LOTTO_MAX_NUM) - .boxed() - .collect(Collectors.toList()); + private static final List numbersPool = new ArrayList<>(lottoNumberMap.keySet()); public static List generateLottoNumbers(int lottoQuantity) { return IntStream.range(0, lottoQuantity) diff --git a/src/main/java/lotto/LottosResult.java b/src/main/java/lotto/LottosResult.java index 2185f7124c..0847f02f2b 100644 --- a/src/main/java/lotto/LottosResult.java +++ b/src/main/java/lotto/LottosResult.java @@ -8,15 +8,15 @@ public class LottosResult { private List lottos; - private List winningNumbers; + private Lotto winningLotto; private final EnumMap lottoRankMap = new EnumMap<>(LottoRank.class); - public LottosResult(List lottos, List winningNumbers, int bonusNumber) { + public LottosResult(List lottos, Lotto winningLotto, int bonusNumber) { this.lottos = lottos; - this.winningNumbers = winningNumbers; + this.winningLotto = winningLotto; for (Lotto lotto : lottos) { - LottoRank lottoRank = lotto.getLottoRank(winningNumbers, bonusNumber); + LottoRank lottoRank = lotto.getLottoRank(winningLotto, bonusNumber); lottoRankMap.put( lottoRank, lottoRankMap.getOrDefault(lottoRank, 0) + 1 diff --git a/src/main/java/view/InputView.java b/src/main/java/view/InputView.java index 07610e6746..572e89fcff 100644 --- a/src/main/java/view/InputView.java +++ b/src/main/java/view/InputView.java @@ -19,9 +19,10 @@ public static int showLottoPurchaseAmountInput() { return readInt(); } - public static String showWinningLottoNumbersInput() { + public static Lotto showWinningLottoNumbersInput() { System.out.println("\n지난 주 당첨 번호를 입력해 주세요."); - return scanner.nextLine(); + String input = scanner.nextLine(); + return new Lotto(LottoNumbersParser.parse(input)); } public static int showLottoBonusNumberInput() { diff --git a/src/main/java/view/OutputView.java b/src/main/java/view/OutputView.java index 9fa2942956..a8015e1df4 100644 --- a/src/main/java/view/OutputView.java +++ b/src/main/java/view/OutputView.java @@ -1,6 +1,7 @@ package view; import lotto.Lotto; +import lotto.LottoNumber; import lotto.LottoRank; import lotto.LottosResult; @@ -18,7 +19,7 @@ public static void showTotalLottoCount(int manualLottoCount, int autoLottoCount) System.out.println("\n수동으로 " + manualLottoCount + "장, 자동으로 " + autoLottoCount + "개를 구매했습니다."); } - public static void showLottoNumbers(Set numbers) { + public static void showLottoNumbers(Set numbers) { System.out.println(numbers); } diff --git a/src/test/java/lotto/LottoNumberTest.java b/src/test/java/lotto/LottoNumberTest.java new file mode 100644 index 0000000000..c83026933e --- /dev/null +++ b/src/test/java/lotto/LottoNumberTest.java @@ -0,0 +1,26 @@ +package lotto; + +import org.junit.jupiter.api.Test; + +import static org.assertj.core.api.Assertions.assertThatThrownBy; +import static org.assertj.core.api.AssertionsForClassTypes.assertThat; + +public class LottoNumberTest { + + @Test + void of_1에서_45사이_숫자면_같은_객체_반환한다() { + assertThat(LottoNumber.of(2)).isEqualTo(LottoNumber.of(2)); + } + + @Test + void of_1미만일_경우_예외를_던진다() { + assertThatThrownBy(() -> LottoNumber.of(0)) + .isInstanceOf(IllegalArgumentException.class); + } + + @Test + void of_45초과일_경우_예외를_던진다() { + assertThatThrownBy(() -> LottoNumber.of(46)) + .isInstanceOf(IllegalArgumentException.class); + } +} diff --git a/src/test/java/lotto/LottoTest.java b/src/test/java/lotto/LottoTest.java index 4d85954d9d..c23fb864e7 100644 --- a/src/test/java/lotto/LottoTest.java +++ b/src/test/java/lotto/LottoTest.java @@ -3,7 +3,6 @@ import org.junit.jupiter.api.Test; import java.util.Arrays; -import java.util.List; import static org.assertj.core.api.AssertionsForClassTypes.assertThat; import static org.assertj.core.api.AssertionsForClassTypes.assertThatThrownBy; @@ -12,44 +11,43 @@ public class LottoTest { @Test void getLottoRank_None() { - List lottoNumbers = Arrays.asList(5, 6, 7, 10, 11, 12); - List winningNumbers = Arrays.asList(1, 2, 3, 40, 41, 42); + Lotto lotto = new Lotto(Arrays.asList(5, 6, 7, 10, 11, 12)); + Lotto winningNumbers = new Lotto(Arrays.asList(1, 2, 3, 40, 41, 42)); + int bonusNumber = 19; - Lotto lotto = new Lotto(lottoNumbers); - LottoRank result = lotto.getLottoRank(winningNumbers, null); + LottoRank result = lotto.getLottoRank(winningNumbers, bonusNumber); assertThat(result).isEqualTo(LottoRank.NONE); } @Test void getLottoRank_Fifth() { - List lottoNumbers = Arrays.asList(1, 2, 3, 10, 11, 12); - List winningNumbers = Arrays.asList(1, 2, 3, 40, 41, 42); + Lotto lotto = new Lotto(Arrays.asList(1, 2, 3, 10, 11, 12)); + Lotto winningNumbers = new Lotto(Arrays.asList(1, 2, 3, 40, 41, 42)); + int bonusNumber = 19; - Lotto lotto = new Lotto(lottoNumbers); - LottoRank result = lotto.getLottoRank(winningNumbers, null); + LottoRank result = lotto.getLottoRank(winningNumbers, bonusNumber); assertThat(result).isEqualTo(LottoRank.FIFTH); } @Test void getLottoRank_First() { - List lottoNumbers = Arrays.asList(1, 2, 3, 10, 11, 12); - List winningNumbers = Arrays.asList(1, 2, 3, 10, 11, 12); + Lotto lotto = new Lotto(Arrays.asList(1, 2, 3, 10, 11, 12)); + Lotto winningNumbers = new Lotto(Arrays.asList(1, 2, 3, 10, 11, 12)); + int bonusNumber = 19; - Lotto lotto = new Lotto(lottoNumbers); - LottoRank result = lotto.getLottoRank(winningNumbers, null); + LottoRank result = lotto.getLottoRank(winningNumbers, bonusNumber); assertThat(result).isEqualTo(LottoRank.FIRST); } @Test void getLottoRank_Second() { - List lottoNumbers = Arrays.asList(1, 2, 3, 10, 11, 19); - List winningNumbers = Arrays.asList(1, 2, 3, 10, 11, 12); - Integer bonusNumber = 19; + Lotto lotto = new Lotto(Arrays.asList(1, 2, 3, 10, 11, 19)); + Lotto winningNumbers = new Lotto(Arrays.asList(1, 2, 3, 10, 11, 12)); + int bonusNumber = 19; - Lotto lotto = new Lotto(lottoNumbers); LottoRank result = lotto.getLottoRank(winningNumbers, bonusNumber); assertThat(result).isEqualTo(LottoRank.SECOND);