From 1e74285f1bb140cd910fe2f49c9efb88041e5517 Mon Sep 17 00:00:00 2001 From: qwer920414-ctrl Date: Wed, 26 Nov 2025 07:47:42 +0900 Subject: [PATCH 01/20] =?UTF-8?q?docs:=20=EA=B8=B0=EB=B3=B8=20=EA=B8=B0?= =?UTF-8?q?=EB=8A=A5=20=EA=B5=AC=ED=98=84=20=EB=AA=A9=EB=A1=9D=20=EC=9E=91?= =?UTF-8?q?=EC=84=B1?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- README.md | 15 ++++++++++++++- src/main/java/lotto/Main.java | 4 ++++ src/main/java/lotto/domain/LottoGenerator.java | 4 ++++ .../java/lotto/domain/LottoGeneratorTest.java | 7 +++++++ 4 files changed, 29 insertions(+), 1 deletion(-) create mode 100644 src/main/java/lotto/Main.java create mode 100644 src/main/java/lotto/domain/LottoGenerator.java create mode 100644 src/test/java/lotto/domain/LottoGeneratorTest.java diff --git a/README.md b/README.md index ac3ae8e41a9..61e6744e6f7 100644 --- a/README.md +++ b/README.md @@ -23,4 +23,17 @@ * 나눗셈 * Executor * execute - * valiteInput \ No newline at end of file + * valiteInput + +# 로또 2단계(자동) +## 기능 요구사항 +* 로또 구입 금액을 입력하면 구입 금액에 해당하는 로또를 발급해야 한다. +* 로또 1장의 가격은 1000원이다. + +## 기능 구현 목록 +* domain + * LottoGenerator + * LottoChecker +* view + * InputView + * ResultView \ No newline at end of file diff --git a/src/main/java/lotto/Main.java b/src/main/java/lotto/Main.java new file mode 100644 index 00000000000..b535f803e5d --- /dev/null +++ b/src/main/java/lotto/Main.java @@ -0,0 +1,4 @@ +package lotto; + +public class Main { +} diff --git a/src/main/java/lotto/domain/LottoGenerator.java b/src/main/java/lotto/domain/LottoGenerator.java new file mode 100644 index 00000000000..a3cd4ab5282 --- /dev/null +++ b/src/main/java/lotto/domain/LottoGenerator.java @@ -0,0 +1,4 @@ +package lotto.domain; + +public class LottoGenerator { +} diff --git a/src/test/java/lotto/domain/LottoGeneratorTest.java b/src/test/java/lotto/domain/LottoGeneratorTest.java new file mode 100644 index 00000000000..795e718958a --- /dev/null +++ b/src/test/java/lotto/domain/LottoGeneratorTest.java @@ -0,0 +1,7 @@ +package lotto.domain; + +import static org.junit.jupiter.api.Assertions.*; + +class LottoGeneratorTest { + +} \ No newline at end of file From 1c52a1451dab290fa69fd76d779100eb96e4814a Mon Sep 17 00:00:00 2001 From: qwer920414-ctrl Date: Wed, 26 Nov 2025 20:32:40 +0900 Subject: [PATCH 02/20] =?UTF-8?q?feat:=20LottoGenerator=20=EA=B5=AC?= =?UTF-8?q?=ED=98=84=20->=20Lotto=20=ED=81=B4=EB=9E=98=EC=8A=A4=20?= =?UTF-8?q?=EB=B6=84=EB=A6=AC=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/lotto/domain/Lotto.java | 22 +++++++++++++++++++ .../java/lotto/domain/LottoGenerator.java | 21 ++++++++++++++++++ .../java/lotto/domain/LottoGeneratorTest.java | 9 +++++++- src/test/java/lotto/domain/LottoTest.java | 21 ++++++++++++++++++ 4 files changed, 72 insertions(+), 1 deletion(-) create mode 100644 src/main/java/lotto/domain/Lotto.java create mode 100644 src/test/java/lotto/domain/LottoTest.java diff --git a/src/main/java/lotto/domain/Lotto.java b/src/main/java/lotto/domain/Lotto.java new file mode 100644 index 00000000000..f5a8156c4c1 --- /dev/null +++ b/src/main/java/lotto/domain/Lotto.java @@ -0,0 +1,22 @@ +package lotto.domain; + +import java.util.ArrayList; +import java.util.Collections; +import java.util.List; +import java.util.stream.Collectors; +import java.util.stream.IntStream; + +public class Lotto { + private static final List DEFAULT_NUMBERS = IntStream.rangeClosed(1, 45).boxed().collect(Collectors.toUnmodifiableList()); + private List numbers; + + public Lotto() { + List tempNumbers = new ArrayList<>(DEFAULT_NUMBERS); + numbers = tempNumbers.subList(0, 6); + Collections.sort(numbers); + } + + public List numbers() { + return numbers; + } +} diff --git a/src/main/java/lotto/domain/LottoGenerator.java b/src/main/java/lotto/domain/LottoGenerator.java index a3cd4ab5282..f2dc56e8412 100644 --- a/src/main/java/lotto/domain/LottoGenerator.java +++ b/src/main/java/lotto/domain/LottoGenerator.java @@ -1,4 +1,25 @@ package lotto.domain; +import java.util.ArrayList; +import java.util.List; + public class LottoGenerator { + private static final long LOTTO_PRICE = 1000; + private final long price; + private final List lottos = new ArrayList<>(); + public LottoGenerator(long price) { + this.price = price; + generate(); + } + + private void generate() { + long count = price / LOTTO_PRICE; + for (int i = 0; i < count; i++) { + lottos.add(new Lotto()); + } + } + + public List getLottos() { + return lottos; + } } diff --git a/src/test/java/lotto/domain/LottoGeneratorTest.java b/src/test/java/lotto/domain/LottoGeneratorTest.java index 795e718958a..542ea724f7c 100644 --- a/src/test/java/lotto/domain/LottoGeneratorTest.java +++ b/src/test/java/lotto/domain/LottoGeneratorTest.java @@ -1,7 +1,14 @@ package lotto.domain; -import static org.junit.jupiter.api.Assertions.*; +import org.assertj.core.api.Assertions; +import org.junit.jupiter.api.DisplayName; +import org.junit.jupiter.api.Test; class LottoGeneratorTest { + @Test + @DisplayName("금액만큼의 로또를 생성한다") + void generate_lottos() { + Assertions.assertThat(new LottoGenerator(14000).getLottos()).hasSize(14); + } } \ No newline at end of file diff --git a/src/test/java/lotto/domain/LottoTest.java b/src/test/java/lotto/domain/LottoTest.java new file mode 100644 index 00000000000..48396f54354 --- /dev/null +++ b/src/test/java/lotto/domain/LottoTest.java @@ -0,0 +1,21 @@ +package lotto.domain; + +import org.junit.jupiter.api.DisplayName; +import org.junit.jupiter.api.Test; + +import static org.assertj.core.api.Assertions.assertThat; + +class LottoTest { + + @Test + @DisplayName("생성된 로또는 사이즈가 6이다") + void generate_lotto_size() { + assertThat(new Lotto().numbers()).hasSize(6); + } + + @Test + @DisplayName("생성된 로또는 1부터 45사이의 값을 가진다") + void generate_lotto_range() { + assertThat(new Lotto().numbers()).allMatch(number -> number >= 1 && number <= 45); + } +} \ No newline at end of file From 72e1ab2a76c2d71b3c1fb8f9662c3e455adc93ac Mon Sep 17 00:00:00 2001 From: qwer920414-ctrl Date: Wed, 26 Nov 2025 23:13:46 +0900 Subject: [PATCH 03/20] =?UTF-8?q?feat:=20Lotto=20=ED=81=B4=EB=9E=98?= =?UTF-8?q?=EC=8A=A4=20shuffle=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/lotto/domain/Lotto.java | 1 + 1 file changed, 1 insertion(+) diff --git a/src/main/java/lotto/domain/Lotto.java b/src/main/java/lotto/domain/Lotto.java index f5a8156c4c1..8208347cd78 100644 --- a/src/main/java/lotto/domain/Lotto.java +++ b/src/main/java/lotto/domain/Lotto.java @@ -12,6 +12,7 @@ public class Lotto { public Lotto() { List tempNumbers = new ArrayList<>(DEFAULT_NUMBERS); + Collections.shuffle(tempNumbers); numbers = tempNumbers.subList(0, 6); Collections.sort(numbers); } From be061d365f1a3e0a10c02a5913e323f57eb64214 Mon Sep 17 00:00:00 2001 From: qwer920414-ctrl Date: Thu, 27 Nov 2025 00:02:58 +0900 Subject: [PATCH 04/20] =?UTF-8?q?test:=20Lotto=20=ED=81=B4=EB=9E=98?= =?UTF-8?q?=EC=8A=A4=20=ED=85=8C=EC=8A=A4=ED=8A=B8=20=EC=BC=80=EC=9D=B4?= =?UTF-8?q?=EC=8A=A4=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/lotto/domain/Lotto.java | 9 +++++++-- src/test/java/lotto/domain/LottoTest.java | 21 +++++++++++++++++++++ 2 files changed, 28 insertions(+), 2 deletions(-) diff --git a/src/main/java/lotto/domain/Lotto.java b/src/main/java/lotto/domain/Lotto.java index 8208347cd78..eefd311ba83 100644 --- a/src/main/java/lotto/domain/Lotto.java +++ b/src/main/java/lotto/domain/Lotto.java @@ -8,7 +8,12 @@ public class Lotto { private static final List DEFAULT_NUMBERS = IntStream.rangeClosed(1, 45).boxed().collect(Collectors.toUnmodifiableList()); - private List numbers; + private final List numbers; + + public Lotto(List numbers) { + this.numbers = new ArrayList<>(numbers); + Collections.sort(this.numbers); + } public Lotto() { List tempNumbers = new ArrayList<>(DEFAULT_NUMBERS); @@ -18,6 +23,6 @@ public Lotto() { } public List numbers() { - return numbers; + return List.copyOf(numbers); } } diff --git a/src/test/java/lotto/domain/LottoTest.java b/src/test/java/lotto/domain/LottoTest.java index 48396f54354..95bc8a22bfc 100644 --- a/src/test/java/lotto/domain/LottoTest.java +++ b/src/test/java/lotto/domain/LottoTest.java @@ -3,7 +3,10 @@ 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 LottoTest { @@ -18,4 +21,22 @@ void generate_lotto_size() { void generate_lotto_range() { assertThat(new Lotto().numbers()).allMatch(number -> number >= 1 && number <= 45); } + + @Test + @DisplayName("생성된 로또는 정렬되어 있다") + void generate_lotto_sort() { + assertThat(new Lotto().numbers()).isSorted(); + } + + @Test + @DisplayName("생성된 로또는 수정이 불가하다") + void generate_lotto_immutable() { + assertThatThrownBy(() -> new Lotto().numbers().add(5)).isInstanceOf(UnsupportedOperationException.class); + } + + @Test + @DisplayName("수동으로도 생성 가능하다(당첨 번호 입력)") + void generate_lotto_passive() { + assertThat(new Lotto(List.of(1, 2, 3, 4, 5, 6)).numbers()).hasSize(6); + } } \ No newline at end of file From 3bb2bd6decb17d5c705c3d24a3d86180861780a0 Mon Sep 17 00:00:00 2001 From: qwer920414-ctrl Date: Thu, 27 Nov 2025 00:09:17 +0900 Subject: [PATCH 05/20] =?UTF-8?q?refactor:=20Lotto=20=EC=83=9D=EC=84=B1?= =?UTF-8?q?=EC=9E=90=20=EB=A1=9C=EC=A7=81=20=EC=88=98=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/main/java/lotto/domain/Lotto.java | 7 +++++-- 1 file changed, 5 insertions(+), 2 deletions(-) diff --git a/src/main/java/lotto/domain/Lotto.java b/src/main/java/lotto/domain/Lotto.java index eefd311ba83..c9c2f7485ef 100644 --- a/src/main/java/lotto/domain/Lotto.java +++ b/src/main/java/lotto/domain/Lotto.java @@ -16,10 +16,13 @@ public Lotto(List numbers) { } public Lotto() { + this(generateLottoNumbers()); + } + + private static List generateLottoNumbers() { List tempNumbers = new ArrayList<>(DEFAULT_NUMBERS); Collections.shuffle(tempNumbers); - numbers = tempNumbers.subList(0, 6); - Collections.sort(numbers); + return new ArrayList<>(tempNumbers.subList(0, 6)); } public List numbers() { From 98d7b01411c6453860e1a1f192cb66cbf5fbf4c5 Mon Sep 17 00:00:00 2001 From: qwer920414-ctrl Date: Thu, 27 Nov 2025 00:27:03 +0900 Subject: [PATCH 06/20] =?UTF-8?q?test:=20Lotto=20=ED=85=8C=EC=8A=A4?= =?UTF-8?q?=ED=8A=B8=20=EC=BC=80=EC=9D=B4=EC=8A=A4=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/lotto/domain/Lotto.java | 7 +++++++ src/main/java/lotto/domain/LottoChecker.java | 2 ++ src/test/java/lotto/domain/LottoCheckerTest.java | 4 ++++ src/test/java/lotto/domain/LottoTest.java | 7 +++++++ 4 files changed, 20 insertions(+) create mode 100644 src/main/java/lotto/domain/LottoChecker.java create mode 100644 src/test/java/lotto/domain/LottoCheckerTest.java diff --git a/src/main/java/lotto/domain/Lotto.java b/src/main/java/lotto/domain/Lotto.java index c9c2f7485ef..dc3380b54d2 100644 --- a/src/main/java/lotto/domain/Lotto.java +++ b/src/main/java/lotto/domain/Lotto.java @@ -11,10 +11,17 @@ public class Lotto { private final List numbers; public Lotto(List numbers) { + validateNumbers(numbers); this.numbers = new ArrayList<>(numbers); Collections.sort(this.numbers); } + private void validateNumbers(List numbers) { + if (numbers.size() != 6) { + throw new IllegalArgumentException(); + } + } + public Lotto() { this(generateLottoNumbers()); } diff --git a/src/main/java/lotto/domain/LottoChecker.java b/src/main/java/lotto/domain/LottoChecker.java new file mode 100644 index 00000000000..791e3ad7022 --- /dev/null +++ b/src/main/java/lotto/domain/LottoChecker.java @@ -0,0 +1,2 @@ +package lotto.domain;public class LottoChecker { +} diff --git a/src/test/java/lotto/domain/LottoCheckerTest.java b/src/test/java/lotto/domain/LottoCheckerTest.java new file mode 100644 index 00000000000..373b0c10165 --- /dev/null +++ b/src/test/java/lotto/domain/LottoCheckerTest.java @@ -0,0 +1,4 @@ +import static org.junit.jupiter.api.Assertions.*; +class LottoCheckerTest { + +} \ No newline at end of file diff --git a/src/test/java/lotto/domain/LottoTest.java b/src/test/java/lotto/domain/LottoTest.java index 95bc8a22bfc..28076f64fd3 100644 --- a/src/test/java/lotto/domain/LottoTest.java +++ b/src/test/java/lotto/domain/LottoTest.java @@ -39,4 +39,11 @@ void generate_lotto_immutable() { void generate_lotto_passive() { assertThat(new Lotto(List.of(1, 2, 3, 4, 5, 6)).numbers()).hasSize(6); } + + @Test + @DisplayName("로또는 6자리만 가능하다") + void generate_lotto_max() { + assertThatThrownBy(() -> new Lotto(List.of(1, 2, 3, 4, 5, 6, 7)).numbers()) + .isInstanceOf(IllegalArgumentException.class); + } } \ No newline at end of file From e67feb0d4733ead3bb37bb4f22df6504e4133665 Mon Sep 17 00:00:00 2001 From: qwer920414-ctrl Date: Thu, 27 Nov 2025 01:05:19 +0900 Subject: [PATCH 07/20] =?UTF-8?q?feat:=20LottoChecker=20=ED=81=B4=EB=9E=98?= =?UTF-8?q?=EC=8A=A4=20=EA=B5=AC=ED=98=84(=EA=B0=9C=EC=84=A0=20=EC=A0=84)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/main/java/lotto/domain/LottoChecker.java | 42 ++++++++++++++++++- .../java/lotto/domain/LottoCheckerTest.java | 32 +++++++++++++- 2 files changed, 71 insertions(+), 3 deletions(-) diff --git a/src/main/java/lotto/domain/LottoChecker.java b/src/main/java/lotto/domain/LottoChecker.java index 791e3ad7022..5622f62645a 100644 --- a/src/main/java/lotto/domain/LottoChecker.java +++ b/src/main/java/lotto/domain/LottoChecker.java @@ -1,2 +1,42 @@ -package lotto.domain;public class LottoChecker { +package lotto.domain; + +import java.util.HashMap; +import java.util.List; +import java.util.Map; + +public class LottoChecker { + + private Map lottoResult = new HashMap<>(); + + public LottoChecker() { + lottoResult.put(3, 0); + lottoResult.put(4, 0); + lottoResult.put(5, 0); + lottoResult.put(6, 0); + } + + public int countMatch(Lotto lotto, Lotto winning) { + int count = 0; + for (Integer number : lotto.numbers()) { + if (winning.numbers().contains(number)) { + count++; + } + } + return count; + } + + public Map check(List lottos, Lotto winning) { + for (Lotto lotto : lottos) { + int count = countMatch(lotto, winning); + plusCount(count); + } + return lottoResult; + } + + private void plusCount(int count) { + Integer value = lottoResult.get(count); + if (value != null) { + lottoResult.put(count, value + 1); + } + } } diff --git a/src/test/java/lotto/domain/LottoCheckerTest.java b/src/test/java/lotto/domain/LottoCheckerTest.java index 373b0c10165..929d36b9fb6 100644 --- a/src/test/java/lotto/domain/LottoCheckerTest.java +++ b/src/test/java/lotto/domain/LottoCheckerTest.java @@ -1,4 +1,32 @@ -import static org.junit.jupiter.api.Assertions.*; +package lotto.domain; + +import org.junit.jupiter.api.DisplayName; +import org.junit.jupiter.api.Test; + +import java.util.ArrayList; +import java.util.List; +import java.util.Map; + +import static org.assertj.core.api.Assertions.assertThat; + class LottoCheckerTest { - + + @Test + @DisplayName("내가 산 복권과 당첨 복권이 3개 일치") + void countMatch() { + Lotto lotto = new Lotto(List.of(1, 2, 3, 4, 5, 6)); + Lotto winning = new Lotto(List.of(1, 2, 3, 9, 10, 11)); + assertThat(new LottoChecker().countMatch(lotto, winning)).isEqualTo(3); + } + + @Test + void check() { + Lotto winning = new Lotto(List.of(1, 2, 3, 4, 5, 6)); + List lottos = new ArrayList<>(); + lottos.add(new Lotto(List.of(1, 2, 3, 10, 11, 12))); + lottos.add(new Lotto(List.of(1, 2, 11, 12, 13, 14))); + + assertThat(new LottoChecker().check(lottos, winning).get(3)).isEqualTo(1); + + } } \ No newline at end of file From 220311b7b952c8ec05b3d999ec5846ef1c01f3b5 Mon Sep 17 00:00:00 2001 From: qwer920414-ctrl Date: Thu, 27 Nov 2025 01:10:06 +0900 Subject: [PATCH 08/20] =?UTF-8?q?feat:=20InputView=20=ED=81=B4=EB=9E=98?= =?UTF-8?q?=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/lotto/view/InputView.java | 17 +++++++++++++++++ 1 file changed, 17 insertions(+) create mode 100644 src/main/java/lotto/view/InputView.java diff --git a/src/main/java/lotto/view/InputView.java b/src/main/java/lotto/view/InputView.java new file mode 100644 index 00000000000..5e903a46645 --- /dev/null +++ b/src/main/java/lotto/view/InputView.java @@ -0,0 +1,17 @@ +package lotto.view; + +import java.util.Scanner; + +public class InputView { + private static final Scanner SCANNER = new Scanner(System.in); + + public static long initLottoPrice() { + System.out.println("구매금액을 입력해 주세요."); + return SCANNER.nextLong(); + } + + public static String initWinningLotto() { + System.out.println("지난 주 당첨 번호를 입력해 주세요."); + return SCANNER.nextLine(); + } +} From 825337eb75702a2686e3fd3aa0a214a1e43bc2b6 Mon Sep 17 00:00:00 2001 From: qwer920414-ctrl Date: Thu, 27 Nov 2025 01:58:12 +0900 Subject: [PATCH 09/20] =?UTF-8?q?feat:=20view,=20main=20=ED=81=B4=EB=9E=98?= =?UTF-8?q?=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/lotto/Main.java | 25 ++++++++++++++++ src/main/java/lotto/view/InputView.java | 2 +- src/main/java/lotto/view/ResultView.java | 37 ++++++++++++++++++++++++ 3 files changed, 63 insertions(+), 1 deletion(-) create mode 100644 src/main/java/lotto/view/ResultView.java diff --git a/src/main/java/lotto/Main.java b/src/main/java/lotto/Main.java index b535f803e5d..e334d79e7bc 100644 --- a/src/main/java/lotto/Main.java +++ b/src/main/java/lotto/Main.java @@ -1,4 +1,29 @@ package lotto; +import lotto.domain.Lotto; +import lotto.domain.LottoChecker; +import lotto.domain.LottoGenerator; +import lotto.view.InputView; +import lotto.view.ResultView; + +import java.util.Arrays; +import java.util.Collections; +import java.util.Map; +import java.util.stream.Collectors; + public class Main { + public static void main(String[] args) { + long price = InputView.initLottoPrice(); + LottoGenerator lottoGenerator = new LottoGenerator(price); + ResultView.printLottos(lottoGenerator.getLottos()); + + LottoChecker lottoChecker = new LottoChecker(); + String[] split = InputView.initWinningLotto().split(","); + + Map result = + lottoChecker.check(lottoGenerator.getLottos(), new Lotto(Arrays.stream(split).map(Integer::parseInt).collect(Collectors.toList()))); + + ResultView.printResult(result); + + } } diff --git a/src/main/java/lotto/view/InputView.java b/src/main/java/lotto/view/InputView.java index 5e903a46645..426b1075f7e 100644 --- a/src/main/java/lotto/view/InputView.java +++ b/src/main/java/lotto/view/InputView.java @@ -7,7 +7,7 @@ public class InputView { public static long initLottoPrice() { System.out.println("구매금액을 입력해 주세요."); - return SCANNER.nextLong(); + return Long.parseLong(SCANNER.nextLine()); } public static String initWinningLotto() { diff --git a/src/main/java/lotto/view/ResultView.java b/src/main/java/lotto/view/ResultView.java new file mode 100644 index 00000000000..eae55e619e2 --- /dev/null +++ b/src/main/java/lotto/view/ResultView.java @@ -0,0 +1,37 @@ +package lotto.view; + +import lotto.domain.Lotto; + +import java.util.List; +import java.util.Map; + +public class ResultView { + public static void printLottos(List lottos) { + System.out.println(lottos.size() + "개를 구매했습니다."); + for (Lotto lotto : lottos) { + printNumbers(lotto.numbers()); + } + } + + private static void printNumbers(List numbers) { + StringBuilder sb = new StringBuilder(); + sb.append("["); + int count = 0; + for (Integer number : numbers) { + sb.append(number); + if (count < numbers.size() - 1) { + sb.append(","); + } + count++; + } + sb.append("]"); + System.out.println(sb); + } + + public static void printResult(Map result) { + System.out.println("당첨 통계"); + for (Integer key : result.keySet()) { + System.out.println(key + "개 일치 - " + result.get(key) + "개"); + } + } +} From 5997498b4a6f85ca02b267dbc5d832d98f3c7de5 Mon Sep 17 00:00:00 2001 From: qwer920414-ctrl Date: Sun, 30 Nov 2025 13:54:53 +0900 Subject: [PATCH 10/20] =?UTF-8?q?=EC=BD=94=EB=93=9C=20=EC=B4=88=EA=B8=B0?= =?UTF-8?q?=ED=99=94(=EC=9E=AC=EC=8B=9C=EB=8F=84)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/main/java/lotto/Main.java | 23 --------- src/main/java/lotto/domain/Lotto.java | 38 -------------- src/main/java/lotto/domain/LottoChecker.java | 42 ---------------- .../java/lotto/domain/LottoGenerator.java | 25 ---------- src/main/java/lotto/view/InputView.java | 17 ------- src/main/java/lotto/view/ResultView.java | 37 -------------- .../java/lotto/domain/LottoCheckerTest.java | 32 ------------ .../java/lotto/domain/LottoGeneratorTest.java | 14 ------ src/test/java/lotto/domain/LottoTest.java | 49 ------------------- 9 files changed, 277 deletions(-) delete mode 100644 src/main/java/lotto/domain/Lotto.java delete mode 100644 src/main/java/lotto/domain/LottoChecker.java delete mode 100644 src/main/java/lotto/domain/LottoGenerator.java delete mode 100644 src/main/java/lotto/view/InputView.java delete mode 100644 src/main/java/lotto/view/ResultView.java delete mode 100644 src/test/java/lotto/domain/LottoCheckerTest.java delete mode 100644 src/test/java/lotto/domain/LottoGeneratorTest.java delete mode 100644 src/test/java/lotto/domain/LottoTest.java diff --git a/src/main/java/lotto/Main.java b/src/main/java/lotto/Main.java index e334d79e7bc..242d1fa1b51 100644 --- a/src/main/java/lotto/Main.java +++ b/src/main/java/lotto/Main.java @@ -1,29 +1,6 @@ package lotto; -import lotto.domain.Lotto; -import lotto.domain.LottoChecker; -import lotto.domain.LottoGenerator; -import lotto.view.InputView; -import lotto.view.ResultView; - -import java.util.Arrays; -import java.util.Collections; -import java.util.Map; -import java.util.stream.Collectors; - public class Main { public static void main(String[] args) { - long price = InputView.initLottoPrice(); - LottoGenerator lottoGenerator = new LottoGenerator(price); - ResultView.printLottos(lottoGenerator.getLottos()); - - LottoChecker lottoChecker = new LottoChecker(); - String[] split = InputView.initWinningLotto().split(","); - - Map result = - lottoChecker.check(lottoGenerator.getLottos(), new Lotto(Arrays.stream(split).map(Integer::parseInt).collect(Collectors.toList()))); - - ResultView.printResult(result); - } } diff --git a/src/main/java/lotto/domain/Lotto.java b/src/main/java/lotto/domain/Lotto.java deleted file mode 100644 index dc3380b54d2..00000000000 --- a/src/main/java/lotto/domain/Lotto.java +++ /dev/null @@ -1,38 +0,0 @@ -package lotto.domain; - -import java.util.ArrayList; -import java.util.Collections; -import java.util.List; -import java.util.stream.Collectors; -import java.util.stream.IntStream; - -public class Lotto { - private static final List DEFAULT_NUMBERS = IntStream.rangeClosed(1, 45).boxed().collect(Collectors.toUnmodifiableList()); - private final List numbers; - - public Lotto(List numbers) { - validateNumbers(numbers); - this.numbers = new ArrayList<>(numbers); - Collections.sort(this.numbers); - } - - private void validateNumbers(List numbers) { - if (numbers.size() != 6) { - throw new IllegalArgumentException(); - } - } - - public Lotto() { - this(generateLottoNumbers()); - } - - private static List generateLottoNumbers() { - List tempNumbers = new ArrayList<>(DEFAULT_NUMBERS); - Collections.shuffle(tempNumbers); - return new ArrayList<>(tempNumbers.subList(0, 6)); - } - - public List numbers() { - return List.copyOf(numbers); - } -} diff --git a/src/main/java/lotto/domain/LottoChecker.java b/src/main/java/lotto/domain/LottoChecker.java deleted file mode 100644 index 5622f62645a..00000000000 --- a/src/main/java/lotto/domain/LottoChecker.java +++ /dev/null @@ -1,42 +0,0 @@ -package lotto.domain; - -import java.util.HashMap; -import java.util.List; -import java.util.Map; - -public class LottoChecker { - - private Map lottoResult = new HashMap<>(); - - public LottoChecker() { - lottoResult.put(3, 0); - lottoResult.put(4, 0); - lottoResult.put(5, 0); - lottoResult.put(6, 0); - } - - public int countMatch(Lotto lotto, Lotto winning) { - int count = 0; - for (Integer number : lotto.numbers()) { - if (winning.numbers().contains(number)) { - count++; - } - } - return count; - } - - public Map check(List lottos, Lotto winning) { - for (Lotto lotto : lottos) { - int count = countMatch(lotto, winning); - plusCount(count); - } - return lottoResult; - } - - private void plusCount(int count) { - Integer value = lottoResult.get(count); - if (value != null) { - lottoResult.put(count, value + 1); - } - } -} diff --git a/src/main/java/lotto/domain/LottoGenerator.java b/src/main/java/lotto/domain/LottoGenerator.java deleted file mode 100644 index f2dc56e8412..00000000000 --- a/src/main/java/lotto/domain/LottoGenerator.java +++ /dev/null @@ -1,25 +0,0 @@ -package lotto.domain; - -import java.util.ArrayList; -import java.util.List; - -public class LottoGenerator { - private static final long LOTTO_PRICE = 1000; - private final long price; - private final List lottos = new ArrayList<>(); - public LottoGenerator(long price) { - this.price = price; - generate(); - } - - private void generate() { - long count = price / LOTTO_PRICE; - for (int i = 0; i < count; i++) { - lottos.add(new Lotto()); - } - } - - public List getLottos() { - return lottos; - } -} diff --git a/src/main/java/lotto/view/InputView.java b/src/main/java/lotto/view/InputView.java deleted file mode 100644 index 426b1075f7e..00000000000 --- a/src/main/java/lotto/view/InputView.java +++ /dev/null @@ -1,17 +0,0 @@ -package lotto.view; - -import java.util.Scanner; - -public class InputView { - private static final Scanner SCANNER = new Scanner(System.in); - - public static long initLottoPrice() { - System.out.println("구매금액을 입력해 주세요."); - return Long.parseLong(SCANNER.nextLine()); - } - - public static String initWinningLotto() { - System.out.println("지난 주 당첨 번호를 입력해 주세요."); - return SCANNER.nextLine(); - } -} diff --git a/src/main/java/lotto/view/ResultView.java b/src/main/java/lotto/view/ResultView.java deleted file mode 100644 index eae55e619e2..00000000000 --- a/src/main/java/lotto/view/ResultView.java +++ /dev/null @@ -1,37 +0,0 @@ -package lotto.view; - -import lotto.domain.Lotto; - -import java.util.List; -import java.util.Map; - -public class ResultView { - public static void printLottos(List lottos) { - System.out.println(lottos.size() + "개를 구매했습니다."); - for (Lotto lotto : lottos) { - printNumbers(lotto.numbers()); - } - } - - private static void printNumbers(List numbers) { - StringBuilder sb = new StringBuilder(); - sb.append("["); - int count = 0; - for (Integer number : numbers) { - sb.append(number); - if (count < numbers.size() - 1) { - sb.append(","); - } - count++; - } - sb.append("]"); - System.out.println(sb); - } - - public static void printResult(Map result) { - System.out.println("당첨 통계"); - for (Integer key : result.keySet()) { - System.out.println(key + "개 일치 - " + result.get(key) + "개"); - } - } -} diff --git a/src/test/java/lotto/domain/LottoCheckerTest.java b/src/test/java/lotto/domain/LottoCheckerTest.java deleted file mode 100644 index 929d36b9fb6..00000000000 --- a/src/test/java/lotto/domain/LottoCheckerTest.java +++ /dev/null @@ -1,32 +0,0 @@ -package lotto.domain; - -import org.junit.jupiter.api.DisplayName; -import org.junit.jupiter.api.Test; - -import java.util.ArrayList; -import java.util.List; -import java.util.Map; - -import static org.assertj.core.api.Assertions.assertThat; - -class LottoCheckerTest { - - @Test - @DisplayName("내가 산 복권과 당첨 복권이 3개 일치") - void countMatch() { - Lotto lotto = new Lotto(List.of(1, 2, 3, 4, 5, 6)); - Lotto winning = new Lotto(List.of(1, 2, 3, 9, 10, 11)); - assertThat(new LottoChecker().countMatch(lotto, winning)).isEqualTo(3); - } - - @Test - void check() { - Lotto winning = new Lotto(List.of(1, 2, 3, 4, 5, 6)); - List lottos = new ArrayList<>(); - lottos.add(new Lotto(List.of(1, 2, 3, 10, 11, 12))); - lottos.add(new Lotto(List.of(1, 2, 11, 12, 13, 14))); - - assertThat(new LottoChecker().check(lottos, winning).get(3)).isEqualTo(1); - - } -} \ No newline at end of file diff --git a/src/test/java/lotto/domain/LottoGeneratorTest.java b/src/test/java/lotto/domain/LottoGeneratorTest.java deleted file mode 100644 index 542ea724f7c..00000000000 --- a/src/test/java/lotto/domain/LottoGeneratorTest.java +++ /dev/null @@ -1,14 +0,0 @@ -package lotto.domain; - -import org.assertj.core.api.Assertions; -import org.junit.jupiter.api.DisplayName; -import org.junit.jupiter.api.Test; - -class LottoGeneratorTest { - - @Test - @DisplayName("금액만큼의 로또를 생성한다") - void generate_lottos() { - Assertions.assertThat(new LottoGenerator(14000).getLottos()).hasSize(14); - } -} \ No newline at end of file diff --git a/src/test/java/lotto/domain/LottoTest.java b/src/test/java/lotto/domain/LottoTest.java deleted file mode 100644 index 28076f64fd3..00000000000 --- a/src/test/java/lotto/domain/LottoTest.java +++ /dev/null @@ -1,49 +0,0 @@ -package lotto.domain; - -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 LottoTest { - - @Test - @DisplayName("생성된 로또는 사이즈가 6이다") - void generate_lotto_size() { - assertThat(new Lotto().numbers()).hasSize(6); - } - - @Test - @DisplayName("생성된 로또는 1부터 45사이의 값을 가진다") - void generate_lotto_range() { - assertThat(new Lotto().numbers()).allMatch(number -> number >= 1 && number <= 45); - } - - @Test - @DisplayName("생성된 로또는 정렬되어 있다") - void generate_lotto_sort() { - assertThat(new Lotto().numbers()).isSorted(); - } - - @Test - @DisplayName("생성된 로또는 수정이 불가하다") - void generate_lotto_immutable() { - assertThatThrownBy(() -> new Lotto().numbers().add(5)).isInstanceOf(UnsupportedOperationException.class); - } - - @Test - @DisplayName("수동으로도 생성 가능하다(당첨 번호 입력)") - void generate_lotto_passive() { - assertThat(new Lotto(List.of(1, 2, 3, 4, 5, 6)).numbers()).hasSize(6); - } - - @Test - @DisplayName("로또는 6자리만 가능하다") - void generate_lotto_max() { - assertThatThrownBy(() -> new Lotto(List.of(1, 2, 3, 4, 5, 6, 7)).numbers()) - .isInstanceOf(IllegalArgumentException.class); - } -} \ No newline at end of file From b97a1a84865e0864e4b133f42a3b6c85108fe915 Mon Sep 17 00:00:00 2001 From: qwer920414-ctrl Date: Sun, 30 Nov 2025 14:03:52 +0900 Subject: [PATCH 11/20] =?UTF-8?q?feat:=20Lotto=20=ED=81=B4=EB=9E=98?= =?UTF-8?q?=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/lotto/domain/Lotto.java | 28 +++++++++++++++++++++++ src/test/java/lotto/domain/LottoTest.java | 20 ++++++++++++++++ 2 files changed, 48 insertions(+) create mode 100644 src/main/java/lotto/domain/Lotto.java create mode 100644 src/test/java/lotto/domain/LottoTest.java diff --git a/src/main/java/lotto/domain/Lotto.java b/src/main/java/lotto/domain/Lotto.java new file mode 100644 index 00000000000..4c3d0ef6bed --- /dev/null +++ b/src/main/java/lotto/domain/Lotto.java @@ -0,0 +1,28 @@ +package lotto.domain; + +import java.util.Arrays; +import java.util.HashSet; +import java.util.List; +import java.util.Set; + +public class Lotto { + public static final int LOTTO_NUMBER_SIZE = 6; + private final List numbers; + public Lotto(Integer... numbers) { + this(Arrays.asList(numbers)); + } + public Lotto(List numbers) { + validate(numbers); + this.numbers = List.copyOf(numbers); + } + private void validate(List numbers) { + if (numbers.size() != LOTTO_NUMBER_SIZE) { + throw new IllegalArgumentException(); + } + + Set noDuplicateNumbers = new HashSet<>(numbers); + if (noDuplicateNumbers.size() != LOTTO_NUMBER_SIZE) { + throw new IllegalArgumentException(); + } + } +} diff --git a/src/test/java/lotto/domain/LottoTest.java b/src/test/java/lotto/domain/LottoTest.java new file mode 100644 index 00000000000..2998085842f --- /dev/null +++ b/src/test/java/lotto/domain/LottoTest.java @@ -0,0 +1,20 @@ +package lotto.domain; + +import org.junit.jupiter.api.DisplayName; +import org.junit.jupiter.api.Test; + +import static org.assertj.core.api.AssertionsForClassTypes.assertThatThrownBy; + +class LottoTest { + @Test + @DisplayName("로또번호가 6개만 허용된다") + void lotto_generate() { + assertThatThrownBy(() -> new Lotto(1, 2, 3, 4, 5)).isInstanceOf(IllegalArgumentException.class); + assertThatThrownBy(() -> new Lotto(1, 2, 3, 4, 5, 6, 7)).isInstanceOf(IllegalArgumentException.class); + } + @Test + @DisplayName("로또번호는 중복되면 안된다") + void lotto_duplicate() { + assertThatThrownBy(() -> new Lotto(1, 2, 2, 3, 4, 5)).isInstanceOf(IllegalArgumentException.class); + } +} \ No newline at end of file From 32139a41d129ce3702940e2cdde8d4b11c0b6abf Mon Sep 17 00:00:00 2001 From: qwer920414-ctrl Date: Sun, 30 Nov 2025 22:40:50 +0900 Subject: [PATCH 12/20] =?UTF-8?q?Lottos=20=ED=81=B4=EB=9E=98=EC=8A=A4=20?= =?UTF-8?q?=EC=83=9D=EC=84=B1=20-=20=EC=83=9D=EC=84=B1=EC=97=AD=ED=95=A0?= =?UTF-8?q?=EC=9D=80=20Factory=EB=A1=9C=20=EB=82=98=EB=88=84=EA=B8=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/main/java/lotto/domain/Lotto.java | 6 ++++ src/main/java/lotto/domain/LottoFactory.java | 33 ++++++++++++++++++++ src/main/java/lotto/domain/Lottos.java | 19 +++++++++++ src/test/java/lotto/domain/LottosTest.java | 15 +++++++++ 4 files changed, 73 insertions(+) create mode 100644 src/main/java/lotto/domain/LottoFactory.java create mode 100644 src/main/java/lotto/domain/Lottos.java create mode 100644 src/test/java/lotto/domain/LottosTest.java diff --git a/src/main/java/lotto/domain/Lotto.java b/src/main/java/lotto/domain/Lotto.java index 4c3d0ef6bed..a4bf1b8cb39 100644 --- a/src/main/java/lotto/domain/Lotto.java +++ b/src/main/java/lotto/domain/Lotto.java @@ -7,7 +7,13 @@ public class Lotto { public static final int LOTTO_NUMBER_SIZE = 6; + private final List numbers; + + public Lotto() { + this(LottoFactory.generateLotto()); + } + public Lotto(Integer... numbers) { this(Arrays.asList(numbers)); } diff --git a/src/main/java/lotto/domain/LottoFactory.java b/src/main/java/lotto/domain/LottoFactory.java new file mode 100644 index 00000000000..6174ee3fca2 --- /dev/null +++ b/src/main/java/lotto/domain/LottoFactory.java @@ -0,0 +1,33 @@ +package lotto.domain; + +import java.util.ArrayList; +import java.util.Collections; +import java.util.List; +import java.util.stream.Collectors; +import java.util.stream.IntStream; + +public class LottoFactory { + + private static final List DEFAULT_NUMBERS = IntStream + .rangeClosed(1, 45) + .boxed() + .collect(Collectors.toList()); + + private static final int LOTTO_SIZE = 6; + + public static List generateLotto() { + List numbers = new ArrayList<>(DEFAULT_NUMBERS); + Collections.shuffle(numbers); + List lottoNumbers = numbers.subList(0, LOTTO_SIZE); + Collections.sort(lottoNumbers); + return new ArrayList<>(lottoNumbers); + } + + public static List generateLottos(int count) { + List list = new ArrayList<>(); + for (int i = 0; i < count; i++) { + list.add(new Lotto()); + } + return list; + } +} diff --git a/src/main/java/lotto/domain/Lottos.java b/src/main/java/lotto/domain/Lottos.java new file mode 100644 index 00000000000..7d36cdf4217 --- /dev/null +++ b/src/main/java/lotto/domain/Lottos.java @@ -0,0 +1,19 @@ +package lotto.domain; + +import java.util.List; + +public class Lottos { + private final List lottos; + + public Lottos(int count) { + this(LottoFactory.generateLottos(count)); + } + + public Lottos(List lottos) { + this.lottos = lottos; + } + + public List values() { + return lottos; + } +} diff --git a/src/test/java/lotto/domain/LottosTest.java b/src/test/java/lotto/domain/LottosTest.java new file mode 100644 index 00000000000..05d4cfd8be9 --- /dev/null +++ b/src/test/java/lotto/domain/LottosTest.java @@ -0,0 +1,15 @@ +package lotto.domain; + +import org.assertj.core.api.Assertions; +import org.junit.jupiter.api.DisplayName; +import org.junit.jupiter.api.Test; + +import static org.junit.jupiter.api.Assertions.*; + +class LottosTest { + @Test + @DisplayName("Lottos는 생성된 숫자만큼의 로또를 가진다") + void size() { + Assertions.assertThat(new Lottos(3).values()).hasSize(3); + } +} \ No newline at end of file From 3f27e242d079f54c91a9eed589a2f8a74a160257 Mon Sep 17 00:00:00 2001 From: qwer920414-ctrl Date: Sun, 30 Nov 2025 22:47:37 +0900 Subject: [PATCH 13/20] =?UTF-8?q?Lotto=20=ED=81=B4=EB=9E=98=EC=8A=A4=20?= =?UTF-8?q?=ED=85=8C=EC=8A=A4=ED=8A=B8=20=EC=BD=94=EB=93=9C=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/lotto/domain/Lotto.java | 9 +++++++++ src/test/java/lotto/domain/LottoTest.java | 7 +++++++ src/test/java/lotto/domain/LottosTest.java | 2 -- 3 files changed, 16 insertions(+), 2 deletions(-) diff --git a/src/main/java/lotto/domain/Lotto.java b/src/main/java/lotto/domain/Lotto.java index a4bf1b8cb39..2ba2179e6ec 100644 --- a/src/main/java/lotto/domain/Lotto.java +++ b/src/main/java/lotto/domain/Lotto.java @@ -17,10 +17,12 @@ public Lotto() { public Lotto(Integer... numbers) { this(Arrays.asList(numbers)); } + public Lotto(List numbers) { validate(numbers); this.numbers = List.copyOf(numbers); } + private void validate(List numbers) { if (numbers.size() != LOTTO_NUMBER_SIZE) { throw new IllegalArgumentException(); @@ -30,5 +32,12 @@ private void validate(List numbers) { if (noDuplicateNumbers.size() != LOTTO_NUMBER_SIZE) { throw new IllegalArgumentException(); } + + boolean invalidNumber = numbers.stream() + .anyMatch(n -> n < 1 || n > 45); + if (invalidNumber) { + throw new IllegalArgumentException(); + } + } } diff --git a/src/test/java/lotto/domain/LottoTest.java b/src/test/java/lotto/domain/LottoTest.java index 2998085842f..330ad5838d7 100644 --- a/src/test/java/lotto/domain/LottoTest.java +++ b/src/test/java/lotto/domain/LottoTest.java @@ -12,9 +12,16 @@ void lotto_generate() { assertThatThrownBy(() -> new Lotto(1, 2, 3, 4, 5)).isInstanceOf(IllegalArgumentException.class); assertThatThrownBy(() -> new Lotto(1, 2, 3, 4, 5, 6, 7)).isInstanceOf(IllegalArgumentException.class); } + @Test @DisplayName("로또번호는 중복되면 안된다") void lotto_duplicate() { assertThatThrownBy(() -> new Lotto(1, 2, 2, 3, 4, 5)).isInstanceOf(IllegalArgumentException.class); } + + @Test + @DisplayName("로또는 1부터 45까지의 숫자를 가진다") + void lotto_number_limit() { + assertThatThrownBy(() -> new Lotto(1, 2, 3, 4, 5, 60)).isInstanceOf(IllegalArgumentException.class); + } } \ No newline at end of file diff --git a/src/test/java/lotto/domain/LottosTest.java b/src/test/java/lotto/domain/LottosTest.java index 05d4cfd8be9..0e2423590bc 100644 --- a/src/test/java/lotto/domain/LottosTest.java +++ b/src/test/java/lotto/domain/LottosTest.java @@ -4,8 +4,6 @@ import org.junit.jupiter.api.DisplayName; import org.junit.jupiter.api.Test; -import static org.junit.jupiter.api.Assertions.*; - class LottosTest { @Test @DisplayName("Lottos는 생성된 숫자만큼의 로또를 가진다") From 70c380c24b5ec1528225d017255afb9c7aa18c5a Mon Sep 17 00:00:00 2001 From: qwer920414-ctrl Date: Sun, 30 Nov 2025 22:58:25 +0900 Subject: [PATCH 14/20] =?UTF-8?q?Money=20=ED=81=B4=EB=9E=98=EC=8A=A4=20?= =?UTF-8?q?=EA=B5=AC=ED=98=84=20-=20LottoGame=20=ED=81=B4=EB=9E=98?= =?UTF-8?q?=EC=8A=A4=20=EA=B5=AC=ED=98=84=EC=9D=84=20=EC=9C=84=ED=95=9C?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/main/java/lotto/domain/LottoGame.java | 11 +++++++++++ src/main/java/lotto/domain/Money.java | 18 ++++++++++++++++++ src/test/java/lotto/domain/LottoGameTest.java | 7 +++++++ src/test/java/lotto/domain/MoneyTest.java | 15 +++++++++++++++ 4 files changed, 51 insertions(+) create mode 100644 src/main/java/lotto/domain/LottoGame.java create mode 100644 src/main/java/lotto/domain/Money.java create mode 100644 src/test/java/lotto/domain/LottoGameTest.java create mode 100644 src/test/java/lotto/domain/MoneyTest.java diff --git a/src/main/java/lotto/domain/LottoGame.java b/src/main/java/lotto/domain/LottoGame.java new file mode 100644 index 00000000000..e19adf565a1 --- /dev/null +++ b/src/main/java/lotto/domain/LottoGame.java @@ -0,0 +1,11 @@ +package lotto.domain; + +public class LottoGame { + private final Lottos lottos; + private final Money money; + + public LottoGame(Lottos lottos, Money money) { + this.lottos = lottos; + this.money = money; + } +} diff --git a/src/main/java/lotto/domain/Money.java b/src/main/java/lotto/domain/Money.java new file mode 100644 index 00000000000..22c5cf8785a --- /dev/null +++ b/src/main/java/lotto/domain/Money.java @@ -0,0 +1,18 @@ +package lotto.domain; + +public class Money { + + private final long money; + + public Money(long money) { + validate(money); + this.money = money; + } + + private void validate(long money) { + if (money <= 0) { + throw new IllegalArgumentException(); + } + } + +} diff --git a/src/test/java/lotto/domain/LottoGameTest.java b/src/test/java/lotto/domain/LottoGameTest.java new file mode 100644 index 00000000000..c4cb0425386 --- /dev/null +++ b/src/test/java/lotto/domain/LottoGameTest.java @@ -0,0 +1,7 @@ +package lotto.domain; + +import static org.junit.jupiter.api.Assertions.*; + +class LottoGameTest { + +} \ No newline at end of file diff --git a/src/test/java/lotto/domain/MoneyTest.java b/src/test/java/lotto/domain/MoneyTest.java new file mode 100644 index 00000000000..34c254d8522 --- /dev/null +++ b/src/test/java/lotto/domain/MoneyTest.java @@ -0,0 +1,15 @@ +package lotto.domain; + +import org.junit.jupiter.api.DisplayName; +import org.junit.jupiter.api.Test; + +import static org.assertj.core.api.Assertions.*; + +class MoneyTest { + + @Test + @DisplayName("금액은 0원 이상이어야 한다") + void moneyBiggerThan0() { + assertThatThrownBy(() -> new Money(0)).isInstanceOf(IllegalArgumentException.class); + } +} \ No newline at end of file From ea81f46f1d55b5355811d8c9391cead30fd12d0e Mon Sep 17 00:00:00 2001 From: qwer920414-ctrl Date: Sun, 30 Nov 2025 23:09:04 +0900 Subject: [PATCH 15/20] =?UTF-8?q?Money=20=ED=81=B4=EB=9E=98=EC=8A=A4=20?= =?UTF-8?q?=EC=B6=94=EA=B0=80=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/lotto/domain/Money.java | 7 ++++++- src/test/java/lotto/domain/LottoGameTest.java | 2 ++ src/test/java/lotto/domain/MoneyTest.java | 12 +++++++++--- 3 files changed, 17 insertions(+), 4 deletions(-) diff --git a/src/main/java/lotto/domain/Money.java b/src/main/java/lotto/domain/Money.java index 22c5cf8785a..95fa71c943c 100644 --- a/src/main/java/lotto/domain/Money.java +++ b/src/main/java/lotto/domain/Money.java @@ -1,6 +1,7 @@ package lotto.domain; public class Money { + private static final long LOTTO_PRICE = 1000; private final long money; @@ -10,9 +11,13 @@ public Money(long money) { } private void validate(long money) { - if (money <= 0) { + if (money < LOTTO_PRICE) { throw new IllegalArgumentException(); } } + public int buyCount() { + return (int) (money / LOTTO_PRICE); + } + } diff --git a/src/test/java/lotto/domain/LottoGameTest.java b/src/test/java/lotto/domain/LottoGameTest.java index c4cb0425386..b66738ab77c 100644 --- a/src/test/java/lotto/domain/LottoGameTest.java +++ b/src/test/java/lotto/domain/LottoGameTest.java @@ -4,4 +4,6 @@ class LottoGameTest { + + } \ No newline at end of file diff --git a/src/test/java/lotto/domain/MoneyTest.java b/src/test/java/lotto/domain/MoneyTest.java index 34c254d8522..c01790abed2 100644 --- a/src/test/java/lotto/domain/MoneyTest.java +++ b/src/test/java/lotto/domain/MoneyTest.java @@ -8,8 +8,14 @@ class MoneyTest { @Test - @DisplayName("금액은 0원 이상이어야 한다") - void moneyBiggerThan0() { - assertThatThrownBy(() -> new Money(0)).isInstanceOf(IllegalArgumentException.class); + @DisplayName("금액은 1000원 이상이어야 한다") + void lotto_buy() { + assertThatThrownBy(() -> new Money(999)).isInstanceOf(IllegalArgumentException.class); + } + + @Test + @DisplayName("1000단위로 로또를 구매할 수 있다") + void lotto_buyCount() { + assertThat(new Money(3500).buyCount()).isEqualTo(3); } } \ No newline at end of file From 888683b4e4728bc26c39838c6c24b9a81b4a86f4 Mon Sep 17 00:00:00 2001 From: qwer920414-ctrl Date: Sun, 30 Nov 2025 23:35:55 +0900 Subject: [PATCH 16/20] =?UTF-8?q?LottoGame=20=ED=81=B4=EB=9E=98=EC=8A=A4?= =?UTF-8?q?=20=EA=B5=AC=ED=98=84,=20=EC=A4=91=EA=B0=84=20=ED=99=95?= =?UTF-8?q?=EC=9D=B8=EC=9D=84=20=EC=9C=84=ED=95=B4=20view=20=ED=81=B4?= =?UTF-8?q?=EB=9E=98=EC=8A=A4=20=EC=9D=BC=EB=B6=80=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/lotto/Main.java | 7 +++++++ src/main/java/lotto/domain/Lotto.java | 4 ++++ src/main/java/lotto/domain/LottoGame.java | 14 ++++++++++++++ src/main/java/lotto/view/InputView.java | 17 +++++++++++++++++ src/main/java/lotto/view/ResultView.java | 14 ++++++++++++++ src/test/java/lotto/domain/LottoGameTest.java | 12 +++++++++--- 6 files changed, 65 insertions(+), 3 deletions(-) create mode 100644 src/main/java/lotto/view/InputView.java create mode 100644 src/main/java/lotto/view/ResultView.java diff --git a/src/main/java/lotto/Main.java b/src/main/java/lotto/Main.java index 242d1fa1b51..5bfce1609ea 100644 --- a/src/main/java/lotto/Main.java +++ b/src/main/java/lotto/Main.java @@ -1,6 +1,13 @@ package lotto; +import lotto.domain.LottoGame; +import lotto.view.InputView; +import lotto.view.ResultView; + public class Main { public static void main(String[] args) { + long price = InputView.initLottoPrice(); + LottoGame lottoGame = new LottoGame(price); + ResultView.printLottos(lottoGame.lottos()); } } diff --git a/src/main/java/lotto/domain/Lotto.java b/src/main/java/lotto/domain/Lotto.java index 2ba2179e6ec..b2531ce89e3 100644 --- a/src/main/java/lotto/domain/Lotto.java +++ b/src/main/java/lotto/domain/Lotto.java @@ -38,6 +38,10 @@ private void validate(List numbers) { if (invalidNumber) { throw new IllegalArgumentException(); } + } + @Override + public String toString() { + return numbers.toString(); } } diff --git a/src/main/java/lotto/domain/LottoGame.java b/src/main/java/lotto/domain/LottoGame.java index e19adf565a1..5f10a29419f 100644 --- a/src/main/java/lotto/domain/LottoGame.java +++ b/src/main/java/lotto/domain/LottoGame.java @@ -1,11 +1,25 @@ package lotto.domain; +import java.util.List; + public class LottoGame { private final Lottos lottos; private final Money money; + public LottoGame(long amount) { + this(new Money(amount)); + } + + public LottoGame(Money money) { + this(new Lottos(money.buyCount()), money); + } + public LottoGame(Lottos lottos, Money money) { this.lottos = lottos; this.money = money; } + + public List lottos() { + return lottos.values(); + } } diff --git a/src/main/java/lotto/view/InputView.java b/src/main/java/lotto/view/InputView.java new file mode 100644 index 00000000000..426b1075f7e --- /dev/null +++ b/src/main/java/lotto/view/InputView.java @@ -0,0 +1,17 @@ +package lotto.view; + +import java.util.Scanner; + +public class InputView { + private static final Scanner SCANNER = new Scanner(System.in); + + public static long initLottoPrice() { + System.out.println("구매금액을 입력해 주세요."); + return Long.parseLong(SCANNER.nextLine()); + } + + public static String initWinningLotto() { + System.out.println("지난 주 당첨 번호를 입력해 주세요."); + return SCANNER.nextLine(); + } +} diff --git a/src/main/java/lotto/view/ResultView.java b/src/main/java/lotto/view/ResultView.java new file mode 100644 index 00000000000..6b0c389d20c --- /dev/null +++ b/src/main/java/lotto/view/ResultView.java @@ -0,0 +1,14 @@ +package lotto.view; + +import lotto.domain.Lotto; + +import java.util.List; + +public class ResultView { + public static void printLottos(List lottos) { + System.out.println(lottos.size() + "개를 구매했습니다."); + for (Lotto lotto : lottos) { + System.out.println(lotto); + } + } +} diff --git a/src/test/java/lotto/domain/LottoGameTest.java b/src/test/java/lotto/domain/LottoGameTest.java index b66738ab77c..f74267330e6 100644 --- a/src/test/java/lotto/domain/LottoGameTest.java +++ b/src/test/java/lotto/domain/LottoGameTest.java @@ -1,9 +1,15 @@ package lotto.domain; -import static org.junit.jupiter.api.Assertions.*; - -class LottoGameTest { +import org.junit.jupiter.api.DisplayName; +import org.junit.jupiter.api.Test; +import static org.assertj.core.api.Assertions.assertThat; +class LottoGameTest { + @Test + @DisplayName("입력된 금액만큼의 로또가 생성되어야 한다") + void generate_lotto() { + assertThat(new LottoGame(14000).lottos()).hasSize(14); + } } \ No newline at end of file From fb651e6b33da5d4623df5e3898f2ed41b59a52b0 Mon Sep 17 00:00:00 2001 From: qwer920414-ctrl Date: Mon, 1 Dec 2025 00:15:47 +0900 Subject: [PATCH 17/20] =?UTF-8?q?LottoGame=20-=20check=20=EB=A9=94?= =?UTF-8?q?=EC=86=8C=EB=93=9C=20=EA=B5=AC=ED=98=84=20->=20Lottos=20-=20fin?= =?UTF-8?q?dResult=20->=20Lotto=20-=20match=20=EB=A9=94=EC=86=8C=EB=93=9C?= =?UTF-8?q?=20=EC=97=AD=EC=88=9C=EC=9C=BC=EB=A1=9C=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/lotto/domain/Lotto.java | 14 ++++++++++++++ src/main/java/lotto/domain/LottoGame.java | 4 ++++ src/main/java/lotto/domain/LottoResult.java | 7 +++++++ src/main/java/lotto/domain/Lottos.java | 9 +++++++++ src/test/java/lotto/domain/LottoGameTest.java | 10 ++++++++++ src/test/java/lotto/domain/LottoTest.java | 8 ++++++++ src/test/java/lotto/domain/LottosTest.java | 14 +++++++++++++- 7 files changed, 65 insertions(+), 1 deletion(-) create mode 100644 src/main/java/lotto/domain/LottoResult.java diff --git a/src/main/java/lotto/domain/Lotto.java b/src/main/java/lotto/domain/Lotto.java index b2531ce89e3..8b7d7b08009 100644 --- a/src/main/java/lotto/domain/Lotto.java +++ b/src/main/java/lotto/domain/Lotto.java @@ -40,6 +40,20 @@ private void validate(List numbers) { } } + public int match(Lotto winningLotto) { + int count = 0; + for (Integer number : numbers) { + if (winningLotto.numbers().contains(number)) { + count++; + } + } + return count; + } + + private List numbers() { + return numbers; + } + @Override public String toString() { return numbers.toString(); diff --git a/src/main/java/lotto/domain/LottoGame.java b/src/main/java/lotto/domain/LottoGame.java index 5f10a29419f..a004abe71a1 100644 --- a/src/main/java/lotto/domain/LottoGame.java +++ b/src/main/java/lotto/domain/LottoGame.java @@ -22,4 +22,8 @@ public LottoGame(Lottos lottos, Money money) { public List lottos() { return lottos.values(); } + + public LottoResult check(Lotto winningLotto) { + return lottos.findResult(winningLotto); + } } diff --git a/src/main/java/lotto/domain/LottoResult.java b/src/main/java/lotto/domain/LottoResult.java new file mode 100644 index 00000000000..e416224e335 --- /dev/null +++ b/src/main/java/lotto/domain/LottoResult.java @@ -0,0 +1,7 @@ +package lotto.domain; + +public class LottoResult { + public void addMatch(int match) { + + } +} diff --git a/src/main/java/lotto/domain/Lottos.java b/src/main/java/lotto/domain/Lottos.java index 7d36cdf4217..088a09b9413 100644 --- a/src/main/java/lotto/domain/Lottos.java +++ b/src/main/java/lotto/domain/Lottos.java @@ -16,4 +16,13 @@ public Lottos(List lottos) { public List values() { return lottos; } + + public LottoResult findResult(Lotto winningLotto) { + LottoResult result = new LottoResult(); + for (Lotto lotto : lottos) { + int match = lotto.match(winningLotto); + result.addMatch(match); + } + return result; + } } diff --git a/src/test/java/lotto/domain/LottoGameTest.java b/src/test/java/lotto/domain/LottoGameTest.java index f74267330e6..0297f6666ec 100644 --- a/src/test/java/lotto/domain/LottoGameTest.java +++ b/src/test/java/lotto/domain/LottoGameTest.java @@ -12,4 +12,14 @@ class LottoGameTest { void generate_lotto() { assertThat(new LottoGame(14000).lottos()).hasSize(14); } + + @Test + void winningResult() { + assertThat(new LottoGame(14000).check(new Lotto(1, 2, 3, 4, 5, 6))).isNotNull(); + } + + @Test + void winningResult2() { + //new LottoGame(); + } } \ No newline at end of file diff --git a/src/test/java/lotto/domain/LottoTest.java b/src/test/java/lotto/domain/LottoTest.java index 330ad5838d7..a117107a0cd 100644 --- a/src/test/java/lotto/domain/LottoTest.java +++ b/src/test/java/lotto/domain/LottoTest.java @@ -1,8 +1,10 @@ package lotto.domain; +import org.assertj.core.api.Assertions; import org.junit.jupiter.api.DisplayName; import org.junit.jupiter.api.Test; +import static org.assertj.core.api.Assertions.*; import static org.assertj.core.api.AssertionsForClassTypes.assertThatThrownBy; class LottoTest { @@ -24,4 +26,10 @@ void lotto_duplicate() { void lotto_number_limit() { assertThatThrownBy(() -> new Lotto(1, 2, 3, 4, 5, 60)).isInstanceOf(IllegalArgumentException.class); } + + @Test + @DisplayName("일치한 숫자만큼 count가 발생한다") + void match() { + assertThat(new Lotto(1, 2, 3, 4, 5, 6).match(new Lotto(1, 2, 3, 4, 5, 7))).isEqualTo(5); + } } \ No newline at end of file diff --git a/src/test/java/lotto/domain/LottosTest.java b/src/test/java/lotto/domain/LottosTest.java index 0e2423590bc..4046bfc01fe 100644 --- a/src/test/java/lotto/domain/LottosTest.java +++ b/src/test/java/lotto/domain/LottosTest.java @@ -4,10 +4,22 @@ import org.junit.jupiter.api.DisplayName; import org.junit.jupiter.api.Test; +import java.util.List; + +import static org.assertj.core.api.Assertions.*; + class LottosTest { @Test @DisplayName("Lottos는 생성된 숫자만큼의 로또를 가진다") void size() { - Assertions.assertThat(new Lottos(3).values()).hasSize(3); + assertThat(new Lottos(3).values()).hasSize(3); + } + + @Test + @DisplayName("LottoResult") + void findResult() { + Lottos lottos = new Lottos(List.of(new Lotto(1, 2, 3, 4, 5, 6) + , new Lotto(1, 2, 3, 9, 10, 11))); + assertThat(lottos.findResult(new Lotto(1, 2, 3, 4, 5, 6))).isNotNull(); } } \ No newline at end of file From 7365bbec5543fd7ef5586d21a538bc5782cb23bc Mon Sep 17 00:00:00 2001 From: qwer920414-ctrl Date: Mon, 1 Dec 2025 00:35:40 +0900 Subject: [PATCH 18/20] =?UTF-8?q?LottoResult=20=EA=B5=AC=ED=98=84=20-=20Ga?= =?UTF-8?q?me=20=ED=85=8C=EC=8A=A4=ED=8A=B8=20=EC=BD=94=EB=93=9C=20?= =?UTF-8?q?=EC=83=9D=EC=84=B1?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/main/java/lotto/domain/LottoResult.java | 18 ++++++++++++++++++ src/test/java/lotto/domain/LottoGameTest.java | 13 +++++++------ 2 files changed, 25 insertions(+), 6 deletions(-) diff --git a/src/main/java/lotto/domain/LottoResult.java b/src/main/java/lotto/domain/LottoResult.java index e416224e335..a8e6e8b5cd7 100644 --- a/src/main/java/lotto/domain/LottoResult.java +++ b/src/main/java/lotto/domain/LottoResult.java @@ -1,7 +1,25 @@ package lotto.domain; +import java.util.HashMap; +import java.util.Map; + public class LottoResult { + private final Map lottoResult = new HashMap<>(); + + public LottoResult() { + lottoResult.put(3, 0); + lottoResult.put(4, 0); + lottoResult.put(5, 0); + lottoResult.put(6, 0); + } + public void addMatch(int match) { + if (match >= 3 && match <= 6) { + lottoResult.put(match, lottoResult.get(match) + 1); + } + } + public int getCount(int match) { + return lottoResult.getOrDefault(match, 0); } } diff --git a/src/test/java/lotto/domain/LottoGameTest.java b/src/test/java/lotto/domain/LottoGameTest.java index 0297f6666ec..85afab5cff1 100644 --- a/src/test/java/lotto/domain/LottoGameTest.java +++ b/src/test/java/lotto/domain/LottoGameTest.java @@ -3,6 +3,8 @@ import org.junit.jupiter.api.DisplayName; import org.junit.jupiter.api.Test; +import java.util.List; + import static org.assertj.core.api.Assertions.assertThat; class LottoGameTest { @@ -14,12 +16,11 @@ void generate_lotto() { } @Test + @DisplayName("2개 생성 - 1등, 4등") void winningResult() { - assertThat(new LottoGame(14000).check(new Lotto(1, 2, 3, 4, 5, 6))).isNotNull(); - } - - @Test - void winningResult2() { - //new LottoGame(); + Lottos lottos = new Lottos(List.of(new Lotto(1, 2, 3, 4, 5, 6), new Lotto(1, 2, 3, 9, 10, 11))); + Money money = new Money(2000); + assertThat(new LottoGame(lottos, money).check(new Lotto(1, 2, 3, 4, 5, 6)).getCount(6)).isEqualTo(1); + assertThat(new LottoGame(lottos, money).check(new Lotto(1, 2, 3, 4, 5, 6)).getCount(3)).isEqualTo(1); } } \ No newline at end of file From f0da2f1e144e2fee4ed55eb377b264b46786872a Mon Sep 17 00:00:00 2001 From: qwer920414-ctrl Date: Mon, 1 Dec 2025 01:33:06 +0900 Subject: [PATCH 19/20] =?UTF-8?q?Rank=20=EB=8F=84=EC=9E=85=20->=20?= =?UTF-8?q?=EB=B3=80=EB=8F=99=EC=82=AC=ED=95=AD=20=EA=B0=9C=EC=84=A0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/main/java/lotto/Main.java | 7 +++ src/main/java/lotto/domain/Lotto.java | 27 ++++++++-- src/main/java/lotto/domain/LottoResult.java | 19 +++---- src/main/java/lotto/domain/Matchable.java | 5 ++ src/main/java/lotto/domain/Rank.java | 53 +++++++++++++++++++ src/main/java/lotto/view/ResultView.java | 12 +++++ src/test/java/lotto/domain/LottoGameTest.java | 4 +- 7 files changed, 112 insertions(+), 15 deletions(-) create mode 100644 src/main/java/lotto/domain/Matchable.java create mode 100644 src/main/java/lotto/domain/Rank.java diff --git a/src/main/java/lotto/Main.java b/src/main/java/lotto/Main.java index 5bfce1609ea..adf6b9dab81 100644 --- a/src/main/java/lotto/Main.java +++ b/src/main/java/lotto/Main.java @@ -1,6 +1,8 @@ package lotto; +import lotto.domain.Lotto; import lotto.domain.LottoGame; +import lotto.domain.LottoResult; import lotto.view.InputView; import lotto.view.ResultView; @@ -9,5 +11,10 @@ public static void main(String[] args) { long price = InputView.initLottoPrice(); LottoGame lottoGame = new LottoGame(price); ResultView.printLottos(lottoGame.lottos()); + + Lotto winningLotto = new Lotto(InputView.initWinningLotto()); + LottoResult result = lottoGame.check(winningLotto); + ResultView.printResult(result); + } } diff --git a/src/main/java/lotto/domain/Lotto.java b/src/main/java/lotto/domain/Lotto.java index 8b7d7b08009..88a5461c612 100644 --- a/src/main/java/lotto/domain/Lotto.java +++ b/src/main/java/lotto/domain/Lotto.java @@ -1,9 +1,6 @@ package lotto.domain; -import java.util.Arrays; -import java.util.HashSet; -import java.util.List; -import java.util.Set; +import java.util.*; public class Lotto { public static final int LOTTO_NUMBER_SIZE = 6; @@ -14,6 +11,28 @@ public Lotto() { this(LottoFactory.generateLotto()); } + public Lotto(String value) { + this(splitAndParseInt(value)); + } + + private static List splitAndParseInt(String value) { + String[] split = getSplit(value); + List numbers = strToInt(split); + return numbers; + } + + private static List strToInt(String[] split) { + List numbers = new ArrayList<>(); + for (String s : split) { + numbers.add(Integer.parseInt(s)); + } + return numbers; + } + + private static String[] getSplit(String value) { + return value.split(","); + } + public Lotto(Integer... numbers) { this(Arrays.asList(numbers)); } diff --git a/src/main/java/lotto/domain/LottoResult.java b/src/main/java/lotto/domain/LottoResult.java index a8e6e8b5cd7..1a6107a6070 100644 --- a/src/main/java/lotto/domain/LottoResult.java +++ b/src/main/java/lotto/domain/LottoResult.java @@ -4,22 +4,23 @@ import java.util.Map; public class LottoResult { - private final Map lottoResult = new HashMap<>(); + private final Map lottoResult = new HashMap<>(); public LottoResult() { - lottoResult.put(3, 0); - lottoResult.put(4, 0); - lottoResult.put(5, 0); - lottoResult.put(6, 0); + for (Rank rank : Rank.values()) { + lottoResult.put(rank, 0); + } } public void addMatch(int match) { - if (match >= 3 && match <= 6) { - lottoResult.put(match, lottoResult.get(match) + 1); + Rank rank = Rank.from(match); + if (rank == null) { + return; } + lottoResult.put(rank, lottoResult.get(rank) + 1); } - public int getCount(int match) { - return lottoResult.getOrDefault(match, 0); + public int getCount(Rank rank) { + return lottoResult.get(rank); } } diff --git a/src/main/java/lotto/domain/Matchable.java b/src/main/java/lotto/domain/Matchable.java new file mode 100644 index 00000000000..0cde7a5764c --- /dev/null +++ b/src/main/java/lotto/domain/Matchable.java @@ -0,0 +1,5 @@ +package lotto.domain; + +public interface Matchable { + boolean isMatch(int matchCount); +} diff --git a/src/main/java/lotto/domain/Rank.java b/src/main/java/lotto/domain/Rank.java new file mode 100644 index 00000000000..a360fa9536b --- /dev/null +++ b/src/main/java/lotto/domain/Rank.java @@ -0,0 +1,53 @@ +package lotto.domain; + +public enum Rank implements Matchable { + FIRST(6, 2000000_000) { + @Override + public boolean isMatch(int match) { + return match == 6; + } + }, + THIRD(5, 1500000) { + @Override + public boolean isMatch(int match) { + return match == 5; + } + }, + FOURTH(4, 50000) { + @Override + public boolean isMatch(int match) { + return match == 4; + } + }, + FIFTH(3, 5000) { + @Override + public boolean isMatch(int match) { + return match == 3; + } + }; + + private final int match; + private final int prize; + + Rank(int match, int prize) { + this.match = match; + this.prize = prize; + } + + public int prize() { + return prize; + } + + public int match() { + return match; + } + + public static Rank from(int matchCount) { + for (Rank rank : values()) { + if (rank.isMatch(matchCount)) { + return rank; + } + } + return null; + } +} diff --git a/src/main/java/lotto/view/ResultView.java b/src/main/java/lotto/view/ResultView.java index 6b0c389d20c..376828c4999 100644 --- a/src/main/java/lotto/view/ResultView.java +++ b/src/main/java/lotto/view/ResultView.java @@ -1,6 +1,8 @@ package lotto.view; import lotto.domain.Lotto; +import lotto.domain.LottoResult; +import lotto.domain.Rank; import java.util.List; @@ -11,4 +13,14 @@ public static void printLottos(List lottos) { System.out.println(lotto); } } + + public static void printResult(LottoResult result) { + System.out.println("당첨 통계"); + System.out.println("---------"); + for (Rank rank : Rank.values()) { + System.out.println(rank.match() + "개 일치 (" + rank.prize() + "원) - " + result.getCount(rank) + "개"); + } + } + + } diff --git a/src/test/java/lotto/domain/LottoGameTest.java b/src/test/java/lotto/domain/LottoGameTest.java index 85afab5cff1..dbf46def834 100644 --- a/src/test/java/lotto/domain/LottoGameTest.java +++ b/src/test/java/lotto/domain/LottoGameTest.java @@ -20,7 +20,7 @@ void generate_lotto() { void winningResult() { Lottos lottos = new Lottos(List.of(new Lotto(1, 2, 3, 4, 5, 6), new Lotto(1, 2, 3, 9, 10, 11))); Money money = new Money(2000); - assertThat(new LottoGame(lottos, money).check(new Lotto(1, 2, 3, 4, 5, 6)).getCount(6)).isEqualTo(1); - assertThat(new LottoGame(lottos, money).check(new Lotto(1, 2, 3, 4, 5, 6)).getCount(3)).isEqualTo(1); + assertThat(new LottoGame(lottos, money).check(new Lotto(1, 2, 3, 4, 5, 6)).getCount(Rank.FIRST)).isEqualTo(1); + assertThat(new LottoGame(lottos, money).check(new Lotto(1, 2, 3, 4, 5, 6)).getCount(Rank.FIFTH)).isEqualTo(1); } } \ No newline at end of file From b6564e09a4162e008052e8c53e8898c447fd5c4c Mon Sep 17 00:00:00 2001 From: qwer920414-ctrl Date: Tue, 2 Dec 2025 08:00:23 +0900 Subject: [PATCH 20/20] =?UTF-8?q?=ED=94=BC=EB=93=9C=EB=B0=B1=20=EA=B0=9C?= =?UTF-8?q?=EC=84=A0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/main/java/lotto/Main.java | 2 +- src/main/java/lotto/domain/Lotto.java | 27 +++++------ src/main/java/lotto/domain/LottoFactory.java | 5 +- src/main/java/lotto/domain/LottoGame.java | 4 ++ src/main/java/lotto/domain/LottoResult.java | 9 ++-- src/main/java/lotto/domain/Money.java | 5 +- src/main/java/lotto/domain/Rank.java | 47 +++++++------------ src/main/java/lotto/view/ResultView.java | 14 +++++- src/test/java/lotto/domain/LottoGameTest.java | 10 ++++ .../java/lotto/domain/LottoResultTest.java | 41 ++++++++++++++++ src/test/java/lotto/domain/LottoTest.java | 9 +--- 11 files changed, 109 insertions(+), 64 deletions(-) create mode 100644 src/test/java/lotto/domain/LottoResultTest.java diff --git a/src/main/java/lotto/Main.java b/src/main/java/lotto/Main.java index adf6b9dab81..a97b1f8f156 100644 --- a/src/main/java/lotto/Main.java +++ b/src/main/java/lotto/Main.java @@ -14,7 +14,7 @@ public static void main(String[] args) { Lotto winningLotto = new Lotto(InputView.initWinningLotto()); LottoResult result = lottoGame.check(winningLotto); - ResultView.printResult(result); + ResultView.printResult(result, lottoGame); } } diff --git a/src/main/java/lotto/domain/Lotto.java b/src/main/java/lotto/domain/Lotto.java index 88a5461c612..e8cadb2063c 100644 --- a/src/main/java/lotto/domain/Lotto.java +++ b/src/main/java/lotto/domain/Lotto.java @@ -5,24 +5,24 @@ public class Lotto { public static final int LOTTO_NUMBER_SIZE = 6; - private final List numbers; + private final Set numbers; public Lotto() { - this(LottoFactory.generateLotto()); + this(new TreeSet<>(LottoFactory.generateLotto())); } public Lotto(String value) { this(splitAndParseInt(value)); } - private static List splitAndParseInt(String value) { + private static Set splitAndParseInt(String value) { String[] split = getSplit(value); - List numbers = strToInt(split); + Set numbers = strToIntSet(split); return numbers; } - private static List strToInt(String[] split) { - List numbers = new ArrayList<>(); + private static Set strToIntSet(String[] split) { + Set numbers = new TreeSet<>(); for (String s : split) { numbers.add(Integer.parseInt(s)); } @@ -34,24 +34,19 @@ private static String[] getSplit(String value) { } public Lotto(Integer... numbers) { - this(Arrays.asList(numbers)); + this(new TreeSet<>(Arrays.asList(numbers))); } - public Lotto(List numbers) { + public Lotto(Set numbers) { validate(numbers); - this.numbers = List.copyOf(numbers); + this.numbers = Collections.unmodifiableSet(numbers); } - private void validate(List numbers) { + private void validate(Set numbers) { if (numbers.size() != LOTTO_NUMBER_SIZE) { throw new IllegalArgumentException(); } - Set noDuplicateNumbers = new HashSet<>(numbers); - if (noDuplicateNumbers.size() != LOTTO_NUMBER_SIZE) { - throw new IllegalArgumentException(); - } - boolean invalidNumber = numbers.stream() .anyMatch(n -> n < 1 || n > 45); if (invalidNumber) { @@ -69,7 +64,7 @@ public int match(Lotto winningLotto) { return count; } - private List numbers() { + private Set numbers() { return numbers; } diff --git a/src/main/java/lotto/domain/LottoFactory.java b/src/main/java/lotto/domain/LottoFactory.java index 6174ee3fca2..b4d3df7e74a 100644 --- a/src/main/java/lotto/domain/LottoFactory.java +++ b/src/main/java/lotto/domain/LottoFactory.java @@ -16,9 +16,8 @@ public class LottoFactory { private static final int LOTTO_SIZE = 6; public static List generateLotto() { - List numbers = new ArrayList<>(DEFAULT_NUMBERS); - Collections.shuffle(numbers); - List lottoNumbers = numbers.subList(0, LOTTO_SIZE); + Collections.shuffle(DEFAULT_NUMBERS); + List lottoNumbers = DEFAULT_NUMBERS.subList(0, LOTTO_SIZE); Collections.sort(lottoNumbers); return new ArrayList<>(lottoNumbers); } diff --git a/src/main/java/lotto/domain/LottoGame.java b/src/main/java/lotto/domain/LottoGame.java index a004abe71a1..160af474ab0 100644 --- a/src/main/java/lotto/domain/LottoGame.java +++ b/src/main/java/lotto/domain/LottoGame.java @@ -26,4 +26,8 @@ public List lottos() { public LottoResult check(Lotto winningLotto) { return lottos.findResult(winningLotto); } + + public double rateOfReturn(LottoResult result) { + return money.rateOfReturn(result.getTotal()); + } } diff --git a/src/main/java/lotto/domain/LottoResult.java b/src/main/java/lotto/domain/LottoResult.java index 1a6107a6070..f79e85165c8 100644 --- a/src/main/java/lotto/domain/LottoResult.java +++ b/src/main/java/lotto/domain/LottoResult.java @@ -14,13 +14,16 @@ public LottoResult() { public void addMatch(int match) { Rank rank = Rank.from(match); - if (rank == null) { - return; - } lottoResult.put(rank, lottoResult.get(rank) + 1); } public int getCount(Rank rank) { return lottoResult.get(rank); } + + public long getTotal() { + return lottoResult.entrySet().stream() + .mapToLong(entry -> entry.getKey().prize() * entry.getValue()) + .sum(); + } } diff --git a/src/main/java/lotto/domain/Money.java b/src/main/java/lotto/domain/Money.java index 95fa71c943c..1aa8e8786d5 100644 --- a/src/main/java/lotto/domain/Money.java +++ b/src/main/java/lotto/domain/Money.java @@ -1,7 +1,7 @@ package lotto.domain; public class Money { - private static final long LOTTO_PRICE = 1000; + private static final long LOTTO_PRICE = 1_000; private final long money; @@ -20,4 +20,7 @@ public int buyCount() { return (int) (money / LOTTO_PRICE); } + public double rateOfReturn(long getTotal) { + return Math.round((double) (getTotal / money) * 100) / 100.0; + } } diff --git a/src/main/java/lotto/domain/Rank.java b/src/main/java/lotto/domain/Rank.java index a360fa9536b..d6c63f3ea7c 100644 --- a/src/main/java/lotto/domain/Rank.java +++ b/src/main/java/lotto/domain/Rank.java @@ -1,30 +1,13 @@ package lotto.domain; -public enum Rank implements Matchable { - FIRST(6, 2000000_000) { - @Override - public boolean isMatch(int match) { - return match == 6; - } - }, - THIRD(5, 1500000) { - @Override - public boolean isMatch(int match) { - return match == 5; - } - }, - FOURTH(4, 50000) { - @Override - public boolean isMatch(int match) { - return match == 4; - } - }, - FIFTH(3, 5000) { - @Override - public boolean isMatch(int match) { - return match == 3; - } - }; +import java.util.Arrays; + +public enum Rank { + FIRST(6, 2_000_000_000), + THIRD(5, 1_500_000), + FOURTH(4, 50_000), + FIFTH(3, 5_000), + NONE(0, 0); private final int match; private final int prize; @@ -42,12 +25,14 @@ public int match() { return match; } + public boolean isMatch(int match) { + return this.match == match; + } + public static Rank from(int matchCount) { - for (Rank rank : values()) { - if (rank.isMatch(matchCount)) { - return rank; - } - } - return null; + return Arrays.stream(values()) + .filter(rank -> rank.isMatch(matchCount)) + .findFirst() + .orElse(NONE); } } diff --git a/src/main/java/lotto/view/ResultView.java b/src/main/java/lotto/view/ResultView.java index 376828c4999..946aef11e62 100644 --- a/src/main/java/lotto/view/ResultView.java +++ b/src/main/java/lotto/view/ResultView.java @@ -1,6 +1,7 @@ package lotto.view; import lotto.domain.Lotto; +import lotto.domain.LottoGame; import lotto.domain.LottoResult; import lotto.domain.Rank; @@ -14,12 +15,23 @@ public static void printLottos(List lottos) { } } - public static void printResult(LottoResult result) { + public static void printResult(LottoResult result, LottoGame lottoGame) { System.out.println("당첨 통계"); System.out.println("---------"); for (Rank rank : Rank.values()) { System.out.println(rank.match() + "개 일치 (" + rank.prize() + "원) - " + result.getCount(rank) + "개"); } + printRateOfReturn(result, lottoGame); + + } + + private static void printRateOfReturn(LottoResult result, LottoGame lottoGame) { + double rate = lottoGame.rateOfReturn(result); + String message = String.format("총 수익률은 %.2f입니다.", rate); + if (rate < 1.0) { + message += "(기준이 1이기 때문에 결과적으로 손해라는 의미임)"; + } + System.out.println(message); } diff --git a/src/test/java/lotto/domain/LottoGameTest.java b/src/test/java/lotto/domain/LottoGameTest.java index dbf46def834..364fdc243dc 100644 --- a/src/test/java/lotto/domain/LottoGameTest.java +++ b/src/test/java/lotto/domain/LottoGameTest.java @@ -23,4 +23,14 @@ void winningResult() { assertThat(new LottoGame(lottos, money).check(new Lotto(1, 2, 3, 4, 5, 6)).getCount(Rank.FIRST)).isEqualTo(1); assertThat(new LottoGame(lottos, money).check(new Lotto(1, 2, 3, 4, 5, 6)).getCount(Rank.FIFTH)).isEqualTo(1); } + + @Test + @DisplayName("2_000원으로 10_000원을 벌면 수익률은 5이다") + void rateOfReturn() { + Lottos lottos = new Lottos(List.of(new Lotto(1, 2, 3, 4, 5, 6), new Lotto(1, 2, 3, 9, 10, 11))); + Money money = new Money(2000); + LottoGame lottoGame = new LottoGame(lottos, money); + LottoResult result = new LottoGame(lottos, money).check(new Lotto(1, 2, 3, 20, 23, 45)); + assertThat(lottoGame.rateOfReturn(result)).isEqualTo(5.0); + } } \ No newline at end of file diff --git a/src/test/java/lotto/domain/LottoResultTest.java b/src/test/java/lotto/domain/LottoResultTest.java new file mode 100644 index 00000000000..79b84b0e9b8 --- /dev/null +++ b/src/test/java/lotto/domain/LottoResultTest.java @@ -0,0 +1,41 @@ +package lotto.domain; + +import org.junit.jupiter.api.DisplayName; +import org.junit.jupiter.api.Test; +import static org.assertj.core.api.Assertions.assertThat; + +class LottoResultTest { + + @Test + @DisplayName("lottoResult 초기화 시 모든 랭크는 0이다") + void result_init() { + LottoResult result = new LottoResult(); + for (Rank rank : Rank.values()) { + assertThat(result.getCount(rank)).isEqualTo(0); + } + } + + @Test + @DisplayName("6개가 일치하면, FIRST 랭크가 올라간다") + void result_first() { + LottoResult result = new LottoResult(); + result.addMatch(6); + assertThat(result.getCount(Rank.FIRST)).isEqualTo(1); + } + + @Test + @DisplayName("일치하지 않으면, None이 매칭된다") + void result_none() { + LottoResult result = new LottoResult(); + result.addMatch(0); + assertThat(result.getCount(Rank.NONE)).isEqualTo(1); + } + + @Test + @DisplayName("3개 일치 시 당청금은 5000원이다") + void getTotal() { + LottoResult result = new LottoResult(); + result.addMatch(3); + assertThat(result.getTotal()).isEqualTo(5000); + } +} \ No newline at end of file diff --git a/src/test/java/lotto/domain/LottoTest.java b/src/test/java/lotto/domain/LottoTest.java index a117107a0cd..6e96e0443c0 100644 --- a/src/test/java/lotto/domain/LottoTest.java +++ b/src/test/java/lotto/domain/LottoTest.java @@ -1,10 +1,9 @@ package lotto.domain; -import org.assertj.core.api.Assertions; import org.junit.jupiter.api.DisplayName; import org.junit.jupiter.api.Test; -import static org.assertj.core.api.Assertions.*; +import static org.assertj.core.api.Assertions.assertThat; import static org.assertj.core.api.AssertionsForClassTypes.assertThatThrownBy; class LottoTest { @@ -15,12 +14,6 @@ void lotto_generate() { assertThatThrownBy(() -> new Lotto(1, 2, 3, 4, 5, 6, 7)).isInstanceOf(IllegalArgumentException.class); } - @Test - @DisplayName("로또번호는 중복되면 안된다") - void lotto_duplicate() { - assertThatThrownBy(() -> new Lotto(1, 2, 2, 3, 4, 5)).isInstanceOf(IllegalArgumentException.class); - } - @Test @DisplayName("로또는 1부터 45까지의 숫자를 가진다") void lotto_number_limit() {