From ca38e966a03a4b309dd36f4b832257fa2c66d4af Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=EC=9E=A5=EC=98=81=EC=9E=AC?= Date: Thu, 14 Mar 2024 13:46:48 +0900 Subject: [PATCH 1/4] =?UTF-8?q?=EC=A4=91=EB=B3=B5=EA=B2=80=EC=A6=9D?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/main/java/lotto/Lotto.java | 12 ++++++++++++ src/test/java/lotto/LottoTest.java | 4 ++++ 2 files changed, 16 insertions(+) diff --git a/src/main/java/lotto/Lotto.java b/src/main/java/lotto/Lotto.java index 519793d..f756419 100644 --- a/src/main/java/lotto/Lotto.java +++ b/src/main/java/lotto/Lotto.java @@ -1,5 +1,6 @@ package lotto; +import java.util.HashSet; import java.util.List; public class Lotto { @@ -7,6 +8,7 @@ public class Lotto { public Lotto(List numbers) { validate(numbers); + dupValidate(numbers); this.numbers = numbers; } @@ -17,4 +19,14 @@ private void validate(List numbers) { } // TODO: 추가 기능 구현 + private void dupValidate(List numbers){ + HashSet set = new HashSet<>(); + for(Integer e : numbers){ + set.add(String.valueOf(e)); + } + if(set.size()!=6){ + throw new IllegalArgumentException(); + } + } + } diff --git a/src/test/java/lotto/LottoTest.java b/src/test/java/lotto/LottoTest.java index 14ed50f..eb07079 100644 --- a/src/test/java/lotto/LottoTest.java +++ b/src/test/java/lotto/LottoTest.java @@ -1,8 +1,11 @@ package lotto; +import static org.assertj.core.api.Assertions.assertThat; import static org.assertj.core.api.Assertions.assertThatThrownBy; import java.util.List; + +import org.assertj.core.api.Assertions; import org.junit.jupiter.api.DisplayName; import org.junit.jupiter.api.Test; @@ -23,4 +26,5 @@ void createLottoByDuplicatedNumber() { } // 아래에 추가 테스트 작성 가능 + } From a66edf30dd6d43a16ff754319934ed3cdec3face Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=EC=9E=A5=EC=98=81=EC=9E=AC?= Date: Sun, 17 Mar 2024 19:21:59 +0900 Subject: [PATCH 2/4] =?UTF-8?q?=EB=A1=9C=EB=98=90=EB=B2=88=ED=98=B8?= =?UTF-8?q?=EC=83=9D=EC=84=B1&test?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/main/java/lotto/Application.java | 3 +++ src/main/java/lotto/Lotto.java | 6 ++++++ src/test/java/lotto/LottoTest.java | 7 +++++++ 3 files changed, 16 insertions(+) diff --git a/src/main/java/lotto/Application.java b/src/main/java/lotto/Application.java index d190922..1433e8b 100644 --- a/src/main/java/lotto/Application.java +++ b/src/main/java/lotto/Application.java @@ -3,5 +3,8 @@ public class Application { public static void main(String[] args) { // TODO: 프로그램 구현 + + LottoController lottoController = new LottoController(); + lottoController.lottoStart(); } } diff --git a/src/main/java/lotto/Lotto.java b/src/main/java/lotto/Lotto.java index f756419..6bf2bff 100644 --- a/src/main/java/lotto/Lotto.java +++ b/src/main/java/lotto/Lotto.java @@ -2,6 +2,8 @@ import java.util.HashSet; import java.util.List; +import java.util.Random; +import java.util.stream.Collectors; public class Lotto { private final List numbers; @@ -29,4 +31,8 @@ private void dupValidate(List numbers){ } } + + + + } diff --git a/src/test/java/lotto/LottoTest.java b/src/test/java/lotto/LottoTest.java index eb07079..a8bfe6b 100644 --- a/src/test/java/lotto/LottoTest.java +++ b/src/test/java/lotto/LottoTest.java @@ -27,4 +27,11 @@ void createLottoByDuplicatedNumber() { // 아래에 추가 테스트 작성 가능 + @DisplayName("랜덤으로 숫자 6개 생성") + @Test + void createRandomLottoNumber(){ + + + } + } From 67fa96260f7590347ea5c6d69c78caa1b41ff04a Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=EC=9E=A5=EC=98=81=EC=9E=AC?= Date: Mon, 18 Mar 2024 16:48:56 +0900 Subject: [PATCH 3/4] =?UTF-8?q?=EA=B0=9D=EC=B2=B4=EC=A7=80=ED=96=A5X->?= =?UTF-8?q?=EB=A6=AC=ED=8C=A9=ED=86=A0=EB=A7=81=20=EC=A7=84=ED=96=89?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/main/java/lotto/Application.java | 2 + .../lotto/controller/LottoController.java | 98 +++++++++++++++++++ src/main/java/lotto/{ => domain}/Lotto.java | 2 +- .../java/lotto/domain/LottoGenerator.java | 38 +++++++ src/test/java/lotto/LottoGeneratorTest.java | 52 ++++++++++ src/test/java/lotto/LottoTest.java | 2 +- 6 files changed, 192 insertions(+), 2 deletions(-) create mode 100644 src/main/java/lotto/controller/LottoController.java rename src/main/java/lotto/{ => domain}/Lotto.java (97%) create mode 100644 src/main/java/lotto/domain/LottoGenerator.java create mode 100644 src/test/java/lotto/LottoGeneratorTest.java diff --git a/src/main/java/lotto/Application.java b/src/main/java/lotto/Application.java index 1433e8b..4e38ae5 100644 --- a/src/main/java/lotto/Application.java +++ b/src/main/java/lotto/Application.java @@ -1,5 +1,7 @@ package lotto; +import lotto.controller.LottoController; + public class Application { public static void main(String[] args) { // TODO: 프로그램 구현 diff --git a/src/main/java/lotto/controller/LottoController.java b/src/main/java/lotto/controller/LottoController.java new file mode 100644 index 0000000..2d7a09d --- /dev/null +++ b/src/main/java/lotto/controller/LottoController.java @@ -0,0 +1,98 @@ +package lotto.controller; + +import lotto.domain.LottoGenerator; +import org.kokodak.Console; + +import java.util.ArrayList; +import java.util.Arrays; +import java.util.List; +import java.util.Scanner; +import java.util.stream.Collectors; + +public class LottoController { + + public void lottoStart(){ + int buyMoney; + int bonusNumber; + List winLottoList; + List> lottoNumberList = new ArrayList<>(); + + Scanner sc = new Scanner(System.in); + + System.out.println("구입금액을 입력"); + buyMoney = sc.nextInt(); + + LottoGenerator lottoGenerator = new LottoGenerator(buyMoney); //로또 생성기 + + lottoNumberList.add(Arrays.asList(8, 21, 23, 41, 42, 43)); + lottoNumberList.add(Arrays.asList(3, 5, 11, 16, 32, 38)); + lottoNumberList.add(Arrays.asList(7, 11, 16, 35, 36, 44)); + lottoNumberList.add(Arrays.asList(1, 8, 11, 31, 41, 42)); + lottoNumberList.add(Arrays.asList(13, 14, 16, 38, 42, 45)); + lottoNumberList.add(Arrays.asList(7, 11, 30, 40, 42, 43)); + lottoNumberList.add(Arrays.asList(2, 13, 22, 32, 38, 45)); + lottoNumberList.add(Arrays.asList(1, 3, 5, 14, 22, 45)); + + System.out.printf("%d개를 구매했습니다.\n",lottoGenerator.lottoQuantity); +// for (int i=0; i lottoNumbers : lottoNumberList) { + int matchCount = 0; + boolean bonusMatch = false; + for (int num : lottoNumbers) { + if (winLottoList.contains(num)) { + matchCount++; + } else if (num == bonusNumber) { + bonusMatch = true; + } + } + + // 결과 업데이트 + if (matchCount == 3) { + threeMatches++; + } else if (matchCount == 4) { + fourMatches++; + } else if (matchCount == 5) { + if (bonusMatch) { + fivePlusBonusMatches++; + } else { + fiveMatches++; + } + } else if (matchCount == 6) { + sixMatches++; + } + } + float profit; + + // 결과 출력 + System.out.println("3개 일치 (5,000원) - " + threeMatches + "개"); + System.out.println("4개 일치 (50,000원) - " + fourMatches + "개"); + System.out.println("5개 일치 (1,500,000원) - " + fiveMatches + "개"); + System.out.println("5개 일치, 보너스 볼 일치 (30,000,000원) - " + fivePlusBonusMatches + "개"); + System.out.println("6개 일치 (2,000,000,000원) - " + sixMatches + "개"); + profit = (float) (threeMatches * 5000 + fourMatches * 50000 + fiveMatches * 1500000 + fivePlusBonusMatches * 30000000 + sixMatches * 2000000000) /buyMoney*100; + System.out.println("총 수익률은 " + profit + "%입니다."); + + + + + } +} diff --git a/src/main/java/lotto/Lotto.java b/src/main/java/lotto/domain/Lotto.java similarity index 97% rename from src/main/java/lotto/Lotto.java rename to src/main/java/lotto/domain/Lotto.java index 6bf2bff..310d8c9 100644 --- a/src/main/java/lotto/Lotto.java +++ b/src/main/java/lotto/domain/Lotto.java @@ -1,4 +1,4 @@ -package lotto; +package lotto.domain; import java.util.HashSet; import java.util.List; diff --git a/src/main/java/lotto/domain/LottoGenerator.java b/src/main/java/lotto/domain/LottoGenerator.java new file mode 100644 index 0000000..eeb2f37 --- /dev/null +++ b/src/main/java/lotto/domain/LottoGenerator.java @@ -0,0 +1,38 @@ +package lotto.domain; + +import java.util.ArrayList; +import java.util.List; +import java.util.Random; +import java.util.stream.Collectors; + +public class LottoGenerator { + private final List lottos = new ArrayList<>(); + public final int lottoQuantity; + + public LottoGenerator(int money){ + validateMoney(money); + lottoQuantity = money / 1000; + } + + private void validateMoney(int money){ + if (isZeroOrNegativeNumber(money) || !isDividedByOneThousand(money)) { + throw new IllegalArgumentException(); + } + } + private boolean isZeroOrNegativeNumber(int money) { + return money <= 0; + } + + private boolean isDividedByOneThousand(int money) { + return money % 1000 == 0; + } + + public List generateLottos(){ + return new Random() + .ints(1, 45 + 1) + .distinct() + .limit(6) + .boxed() + .collect(Collectors.toList()); + } +} diff --git a/src/test/java/lotto/LottoGeneratorTest.java b/src/test/java/lotto/LottoGeneratorTest.java new file mode 100644 index 0000000..712e2e1 --- /dev/null +++ b/src/test/java/lotto/LottoGeneratorTest.java @@ -0,0 +1,52 @@ +package lotto; + +import lotto.domain.LottoGenerator; +import org.junit.jupiter.api.DisplayName; +import org.junit.jupiter.api.Test; + +import java.util.List; + +import static org.assertj.core.api.Assertions.assertThat; +import static org.assertj.core.api.Assertions.assertThatThrownBy; + +class LottoGeneratorTest { + + @DisplayName("0원이면 예외가 발생한다.") + @Test + void createLottoNumberByZeroSize() { + assertThatThrownBy(() -> new LottoGenerator(0)) + .isInstanceOf(IllegalArgumentException.class); + } + + @DisplayName("1000으로 안나눠지면 예외가 발생한다.") + @Test + void createLottoNumberByNotDivide() { + assertThatThrownBy(() -> new LottoGenerator(525)) + .isInstanceOf(IllegalArgumentException.class); + } + + @DisplayName("잘 개수가 생성되는가.") + @Test + void lottoNumberSize() { + //give + final LottoGenerator lottoGenerator = new LottoGenerator(1000); + //when + final List lottoNumber = lottoGenerator.generateLottos(); + //then + assertThat(lottoNumber.size()).isEqualTo(6); + } + + @DisplayName("범위가 올바른지") + @Test + void lottoNumberRange(){ + //give + final LottoGenerator lottoGenerator = new LottoGenerator(1000); + //when + final List lottoNumber = lottoGenerator.generateLottos(); + //then + assertThat(lottoNumber.stream().allMatch(v -> v >= 1 && v <= 45)).isTrue(); + } + + + +} \ No newline at end of file diff --git a/src/test/java/lotto/LottoTest.java b/src/test/java/lotto/LottoTest.java index a8bfe6b..96f4dd0 100644 --- a/src/test/java/lotto/LottoTest.java +++ b/src/test/java/lotto/LottoTest.java @@ -5,7 +5,7 @@ import java.util.List; -import org.assertj.core.api.Assertions; +import lotto.domain.Lotto; import org.junit.jupiter.api.DisplayName; import org.junit.jupiter.api.Test; From aaa1293fc0a12594064573be6a21b99be62b7695 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=EC=9E=A5=EC=98=81=EC=9E=AC?= Date: Mon, 18 Mar 2024 17:20:55 +0900 Subject: [PATCH 4/4] output divide --- .../lotto/controller/LottoController.java | 72 +++---------------- 1 file changed, 10 insertions(+), 62 deletions(-) diff --git a/src/main/java/lotto/controller/LottoController.java b/src/main/java/lotto/controller/LottoController.java index 2d7a09d..c1a5b9e 100644 --- a/src/main/java/lotto/controller/LottoController.java +++ b/src/main/java/lotto/controller/LottoController.java @@ -1,6 +1,7 @@ package lotto.controller; import lotto.domain.LottoGenerator; +import lotto.view.OutputView; import org.kokodak.Console; import java.util.ArrayList; @@ -19,80 +20,27 @@ public void lottoStart(){ Scanner sc = new Scanner(System.in); - System.out.println("구입금액을 입력"); + OutputView.printBuyMoney(); buyMoney = sc.nextInt(); LottoGenerator lottoGenerator = new LottoGenerator(buyMoney); //로또 생성기 - lottoNumberList.add(Arrays.asList(8, 21, 23, 41, 42, 43)); - lottoNumberList.add(Arrays.asList(3, 5, 11, 16, 32, 38)); - lottoNumberList.add(Arrays.asList(7, 11, 16, 35, 36, 44)); - lottoNumberList.add(Arrays.asList(1, 8, 11, 31, 41, 42)); - lottoNumberList.add(Arrays.asList(13, 14, 16, 38, 42, 45)); - lottoNumberList.add(Arrays.asList(7, 11, 30, 40, 42, 43)); - lottoNumberList.add(Arrays.asList(2, 13, 22, 32, 38, 45)); - lottoNumberList.add(Arrays.asList(1, 3, 5, 14, 22, 45)); - System.out.printf("%d개를 구매했습니다.\n",lottoGenerator.lottoQuantity); -// for (int i=0; i lottoNumbers : lottoNumberList) { - int matchCount = 0; - boolean bonusMatch = false; - for (int num : lottoNumbers) { - if (winLottoList.contains(num)) { - matchCount++; - } else if (num == bonusNumber) { - bonusMatch = true; - } - } - - // 결과 업데이트 - if (matchCount == 3) { - threeMatches++; - } else if (matchCount == 4) { - fourMatches++; - } else if (matchCount == 5) { - if (bonusMatch) { - fivePlusBonusMatches++; - } else { - fiveMatches++; - } - } else if (matchCount == 6) { - sixMatches++; - } - } - float profit; - - // 결과 출력 - System.out.println("3개 일치 (5,000원) - " + threeMatches + "개"); - System.out.println("4개 일치 (50,000원) - " + fourMatches + "개"); - System.out.println("5개 일치 (1,500,000원) - " + fiveMatches + "개"); - System.out.println("5개 일치, 보너스 볼 일치 (30,000,000원) - " + fivePlusBonusMatches + "개"); - System.out.println("6개 일치 (2,000,000,000원) - " + sixMatches + "개"); - profit = (float) (threeMatches * 5000 + fourMatches * 50000 + fiveMatches * 1500000 + fivePlusBonusMatches * 30000000 + sixMatches * 2000000000) /buyMoney*100; - System.out.println("총 수익률은 " + profit + "%입니다."); - - - + OutputView.printResult(lottoNumberList, winLottoList, bonusNumber, buyMoney); } }