From b2121f79f5a342754d18829a6d3fdda592923054 Mon Sep 17 00:00:00 2001 From: Yeongseo Kim Date: Mon, 17 Jun 2024 00:08:16 +0900 Subject: [PATCH 01/19] =?UTF-8?q?docs:=20=EA=B8=B0=EB=8A=A5=20=EB=AA=A9?= =?UTF-8?q?=EB=A1=9D=20=EC=9E=91=EC=84=B1?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- README.md | 11 ++++++++++- 1 file changed, 10 insertions(+), 1 deletion(-) diff --git a/README.md b/README.md index 7b4e53d2437..1fc3efd194a 100644 --- a/README.md +++ b/README.md @@ -6,4 +6,13 @@ * 모든 피드백을 완료하면 다음 단계를 도전하고 앞의 과정을 반복한다. ## 온라인 코드 리뷰 과정 -* [텍스트와 이미지로 살펴보는 온라인 코드 리뷰 과정](https://github.com/next-step/nextstep-docs/tree/master/codereview) \ No newline at end of file +* [텍스트와 이미지로 살펴보는 온라인 코드 리뷰 과정](https://github.com/next-step/nextstep-docs/tree/master/codereview) + +## 기능 목록 +- [ ] 로또 티켓은 숫자를 6개 가질 수 있다. +- [ ] 로또 티켓에 들어가는 로또 숫자는 1 이상 45 이하의 숫자다. +- [ ] 로또 수를 입력하면 자동으로 입력한 수만큼 로또 티켓이 구매된다. +- [ ] 구입금액과 수동으로 구매할 티켓 수를 입력하면 남은 금액만큼 자동 구매 티켓 수가 결정된다. +- [ ] 당첨 번호 6개를 입력하면 로또 티켓에 숫자가 몇개 일치하는지 반환한다. +- [ ] 당첨 번호 6개와 보너스 볼을 입력하면 숫자가 몇개 일치하는지와 보너스 볼 일치 여부를 반환한다. +- [ ] 로또 티켓과 당첨 번호 6개, 보너스 볼을 입력하면 몇등 상인지 반환한다. \ No newline at end of file From 300739514d2fff0daf108a619b6faa42bfce3dac Mon Sep 17 00:00:00 2001 From: Yeongseo Kim Date: Mon, 17 Jun 2024 00:30:47 +0900 Subject: [PATCH 02/19] =?UTF-8?q?feat:=20LottoTicket=20=EB=A1=9C=EB=98=90?= =?UTF-8?q?=20=ED=8B=B0=EC=BC=93=EC=9D=B4=20=EC=88=AB=EC=9E=90=EB=A5=BC=20?= =?UTF-8?q?6=EA=B0=9C=20=EA=B0=80=EC=A7=80=EB=8A=94=20=EA=B8=B0=EB=8A=A5?= =?UTF-8?q?=20=EC=B6=94=EA=B0=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- README.md | 2 +- src/main/java/lotto/model/LottoTicket.java | 19 +++++++++++++ .../java/lotto/model/LottoTicketTest.java | 28 +++++++++++++++++++ 3 files changed, 48 insertions(+), 1 deletion(-) create mode 100644 src/main/java/lotto/model/LottoTicket.java create mode 100644 src/test/java/lotto/model/LottoTicketTest.java diff --git a/README.md b/README.md index 1fc3efd194a..902d6590b57 100644 --- a/README.md +++ b/README.md @@ -9,7 +9,7 @@ * [텍스트와 이미지로 살펴보는 온라인 코드 리뷰 과정](https://github.com/next-step/nextstep-docs/tree/master/codereview) ## 기능 목록 -- [ ] 로또 티켓은 숫자를 6개 가질 수 있다. +- [x] 로또 티켓은 숫자를 6개 가질 수 있다. - [ ] 로또 티켓에 들어가는 로또 숫자는 1 이상 45 이하의 숫자다. - [ ] 로또 수를 입력하면 자동으로 입력한 수만큼 로또 티켓이 구매된다. - [ ] 구입금액과 수동으로 구매할 티켓 수를 입력하면 남은 금액만큼 자동 구매 티켓 수가 결정된다. diff --git a/src/main/java/lotto/model/LottoTicket.java b/src/main/java/lotto/model/LottoTicket.java new file mode 100644 index 00000000000..8e1e38a7c2d --- /dev/null +++ b/src/main/java/lotto/model/LottoTicket.java @@ -0,0 +1,19 @@ +package lotto.model; + +import java.util.List; + +public class LottoTicket { + public static final double LOTTO_NUBERS_SIZE = 6; + private List lottoNumbers; + + public LottoTicket(List lottoNumbers) { + if (lottoNumbers.size() != LOTTO_NUBERS_SIZE) { + throw new IllegalArgumentException("로또 티켓의 로또 숫자는 6개이어야 합니다."); + } + this.lottoNumbers = lottoNumbers; + } + + public List getLottoNumbers() { + return lottoNumbers; + } +} diff --git a/src/test/java/lotto/model/LottoTicketTest.java b/src/test/java/lotto/model/LottoTicketTest.java new file mode 100644 index 00000000000..b79015cb687 --- /dev/null +++ b/src/test/java/lotto/model/LottoTicketTest.java @@ -0,0 +1,28 @@ +package lotto.model; + +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 LottoTicketTest { + @Test + @DisplayName("로또 티켓은 숫자를 6개 가질 수 있다.") + void test1() { + var lottoTicket = new LottoTicket(List.of(1,2,3,4,5,6)); + assertThat(lottoTicket.getLottoNumbers()) + .hasSize(6); + } + + @Test + @DisplayName("로또 티켓의 숫자가 6개가 아닐 경우 에러가 발생한다.") + void test2() { + assertThatThrownBy(() -> { + var lottoTicket = new LottoTicket(List.of(1,2,3,4,5,6,7)); + }) + .isInstanceOf(IllegalArgumentException.class); + } +} From 6c233f143d1d116f6b57e298f2f9479461a2f7a7 Mon Sep 17 00:00:00 2001 From: Yeongseo Kim Date: Mon, 17 Jun 2024 00:55:56 +0900 Subject: [PATCH 03/19] =?UTF-8?q?feat:=20LottoNumber=20=EB=A1=9C=EB=98=90?= =?UTF-8?q?=20=ED=8B=B0=EC=BC=93=EC=9D=98=20=EC=88=AB=EC=9E=90=20=EB=B2=94?= =?UTF-8?q?=EC=9C=84=20=EC=A0=9C=ED=95=9C=20=EA=B8=B0=EB=8A=A5=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 --- README.md | 2 +- src/main/java/lotto/model/LottoTicket.java | 14 +++++++++++--- src/test/java/lotto/model/LottoTicketTest.java | 14 ++++++++++++-- 3 files changed, 24 insertions(+), 6 deletions(-) diff --git a/README.md b/README.md index 902d6590b57..4f6b17b1970 100644 --- a/README.md +++ b/README.md @@ -10,7 +10,7 @@ ## 기능 목록 - [x] 로또 티켓은 숫자를 6개 가질 수 있다. -- [ ] 로또 티켓에 들어가는 로또 숫자는 1 이상 45 이하의 숫자다. +- [x] 로또 티켓에 들어가는 로또 숫자는 1 이상 45 이하의 숫자다. - [ ] 로또 수를 입력하면 자동으로 입력한 수만큼 로또 티켓이 구매된다. - [ ] 구입금액과 수동으로 구매할 티켓 수를 입력하면 남은 금액만큼 자동 구매 티켓 수가 결정된다. - [ ] 당첨 번호 6개를 입력하면 로또 티켓에 숫자가 몇개 일치하는지 반환한다. diff --git a/src/main/java/lotto/model/LottoTicket.java b/src/main/java/lotto/model/LottoTicket.java index 8e1e38a7c2d..91a0a9d21a0 100644 --- a/src/main/java/lotto/model/LottoTicket.java +++ b/src/main/java/lotto/model/LottoTicket.java @@ -1,19 +1,27 @@ package lotto.model; +import java.util.Arrays; import java.util.List; +import java.util.stream.Collectors; public class LottoTicket { public static final double LOTTO_NUBERS_SIZE = 6; - private List lottoNumbers; + private final List lottoNumbers; - public LottoTicket(List lottoNumbers) { + public LottoTicket(String[] lottoNumbers) { + this(Arrays.stream(lottoNumbers) + .map(s -> LottoNumber.of(Integer.parseInt(s.trim()))) + .collect(Collectors.toList())); + } + + public LottoTicket(List lottoNumbers) { if (lottoNumbers.size() != LOTTO_NUBERS_SIZE) { throw new IllegalArgumentException("로또 티켓의 로또 숫자는 6개이어야 합니다."); } this.lottoNumbers = lottoNumbers; } - public List getLottoNumbers() { + public List getLottoNumbers() { return lottoNumbers; } } diff --git a/src/test/java/lotto/model/LottoTicketTest.java b/src/test/java/lotto/model/LottoTicketTest.java index b79015cb687..302351eb898 100644 --- a/src/test/java/lotto/model/LottoTicketTest.java +++ b/src/test/java/lotto/model/LottoTicketTest.java @@ -12,7 +12,7 @@ class LottoTicketTest { @Test @DisplayName("로또 티켓은 숫자를 6개 가질 수 있다.") void test1() { - var lottoTicket = new LottoTicket(List.of(1,2,3,4,5,6)); + var lottoTicket = new LottoTicket(new String[]{"1", "2", "3", "4", "5", "6"}); assertThat(lottoTicket.getLottoNumbers()) .hasSize(6); } @@ -21,8 +21,18 @@ void test1() { @DisplayName("로또 티켓의 숫자가 6개가 아닐 경우 에러가 발생한다.") void test2() { assertThatThrownBy(() -> { - var lottoTicket = new LottoTicket(List.of(1,2,3,4,5,6,7)); + var lottoTicket = new LottoTicket(new String[]{"1", "2", "3", "4", "5", "6", "7"}); }) .isInstanceOf(IllegalArgumentException.class); } + + @Test + @DisplayName("로또 티켓에 들어가는 숫자는 1 이상 45 이하의 숫자다.") + void test3() { + assertThatThrownBy(() -> { + var lottoTicket = new LottoTicket(new String[]{"0", "1", "2", "3", "4", "5"}); + }) + .isInstanceOf(IllegalArgumentException.class) + .hasMessageContaining("로또 숫자는 1 이상 45 이하의 숫자이어야 합니다."); + } } From e64934dd418908180a09410d741e6bef896eccfb Mon Sep 17 00:00:00 2001 From: Yeongseo Kim Date: Mon, 17 Jun 2024 01:15:42 +0900 Subject: [PATCH 04/19] =?UTF-8?q?refactor:=20LottoTicket=20=EC=9D=98=20Lis?= =?UTF-8?q?t=20->=20Set=20=EB=A1=9C=20=EB=B3=80?= =?UTF-8?q?=ED=99=98?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- README.md | 2 +- src/main/java/lotto/model/LottoTicket.java | 18 +++++++++--------- src/test/java/lotto/model/LottoTicketTest.java | 6 +++--- 3 files changed, 13 insertions(+), 13 deletions(-) diff --git a/README.md b/README.md index 4f6b17b1970..09080308d3c 100644 --- a/README.md +++ b/README.md @@ -11,7 +11,7 @@ ## 기능 목록 - [x] 로또 티켓은 숫자를 6개 가질 수 있다. - [x] 로또 티켓에 들어가는 로또 숫자는 1 이상 45 이하의 숫자다. -- [ ] 로또 수를 입력하면 자동으로 입력한 수만큼 로또 티켓이 구매된다. +- [ ] 티켓 수를 입력하면 입력한 수만큼 자동 로또 티켓이 구매된다. - [ ] 구입금액과 수동으로 구매할 티켓 수를 입력하면 남은 금액만큼 자동 구매 티켓 수가 결정된다. - [ ] 당첨 번호 6개를 입력하면 로또 티켓에 숫자가 몇개 일치하는지 반환한다. - [ ] 당첨 번호 6개와 보너스 볼을 입력하면 숫자가 몇개 일치하는지와 보너스 볼 일치 여부를 반환한다. diff --git a/src/main/java/lotto/model/LottoTicket.java b/src/main/java/lotto/model/LottoTicket.java index 91a0a9d21a0..ceb38c339ea 100644 --- a/src/main/java/lotto/model/LottoTicket.java +++ b/src/main/java/lotto/model/LottoTicket.java @@ -1,27 +1,27 @@ package lotto.model; -import java.util.Arrays; import java.util.List; +import java.util.Set; import java.util.stream.Collectors; public class LottoTicket { - public static final double LOTTO_NUBERS_SIZE = 6; - private final List lottoNumbers; + public static final int LOTTO_NUBERS_SIZE = 6; + private final Set lottoNumbers; - public LottoTicket(String[] lottoNumbers) { - this(Arrays.stream(lottoNumbers) - .map(s -> LottoNumber.of(Integer.parseInt(s.trim()))) - .collect(Collectors.toList())); + public LottoTicket(List lottoNumbers) { + this(lottoNumbers.stream() + .map(number -> LottoNumber.of(number)) + .collect(Collectors.toSet())); } - public LottoTicket(List lottoNumbers) { + public LottoTicket(Set lottoNumbers) { if (lottoNumbers.size() != LOTTO_NUBERS_SIZE) { throw new IllegalArgumentException("로또 티켓의 로또 숫자는 6개이어야 합니다."); } this.lottoNumbers = lottoNumbers; } - public List getLottoNumbers() { + public Set getLottoNumbers() { return lottoNumbers; } } diff --git a/src/test/java/lotto/model/LottoTicketTest.java b/src/test/java/lotto/model/LottoTicketTest.java index 302351eb898..364b36f0cfd 100644 --- a/src/test/java/lotto/model/LottoTicketTest.java +++ b/src/test/java/lotto/model/LottoTicketTest.java @@ -12,7 +12,7 @@ class LottoTicketTest { @Test @DisplayName("로또 티켓은 숫자를 6개 가질 수 있다.") void test1() { - var lottoTicket = new LottoTicket(new String[]{"1", "2", "3", "4", "5", "6"}); + var lottoTicket = new LottoTicket(List.of(1,2,3,4,5,6)); assertThat(lottoTicket.getLottoNumbers()) .hasSize(6); } @@ -21,7 +21,7 @@ void test1() { @DisplayName("로또 티켓의 숫자가 6개가 아닐 경우 에러가 발생한다.") void test2() { assertThatThrownBy(() -> { - var lottoTicket = new LottoTicket(new String[]{"1", "2", "3", "4", "5", "6", "7"}); + var lottoTicket = new LottoTicket(List.of(1,2,3,4,5,6,7)); }) .isInstanceOf(IllegalArgumentException.class); } @@ -30,7 +30,7 @@ void test2() { @DisplayName("로또 티켓에 들어가는 숫자는 1 이상 45 이하의 숫자다.") void test3() { assertThatThrownBy(() -> { - var lottoTicket = new LottoTicket(new String[]{"0", "1", "2", "3", "4", "5"}); + var lottoTicket = new LottoTicket(List.of(0,1,2,3,4,5)); }) .isInstanceOf(IllegalArgumentException.class) .hasMessageContaining("로또 숫자는 1 이상 45 이하의 숫자이어야 합니다."); From 198e4be602707d508cfc38566825fec1eb9c50c5 Mon Sep 17 00:00:00 2001 From: Yeongseo Kim Date: Mon, 17 Jun 2024 01:28:12 +0900 Subject: [PATCH 05/19] =?UTF-8?q?feat:=20=ED=8B=B0=EC=BC=93=20=EC=88=98?= =?UTF-8?q?=EB=A5=BC=20=EC=9E=85=EB=A0=A5=ED=95=98=EB=A9=B4=20=EC=9E=85?= =?UTF-8?q?=EB=A0=A5=ED=95=9C=20=EC=88=98=EB=A7=8C=ED=81=BC=20=EC=9E=90?= =?UTF-8?q?=EB=8F=99=20=EB=A1=9C=EB=8F=84=20=ED=8B=B0=EC=BC=93=EC=9D=84=20?= =?UTF-8?q?=EC=83=9D=EC=84=B1=ED=95=98=EB=8A=94=20=EA=B8=B0=EB=8A=A5=20?= =?UTF-8?q?=EC=B6=94=EA=B0=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- README.md | 2 +- src/main/java/lotto/model/LottoNumber.java | 23 ++++++++++++++++ .../java/lotto/model/LottoTicketMaker.java | 27 +++++++++++++++++++ .../lotto/model/LottoTicketMakerTest.java | 19 +++++++++++++ 4 files changed, 70 insertions(+), 1 deletion(-) create mode 100644 src/main/java/lotto/model/LottoNumber.java create mode 100644 src/main/java/lotto/model/LottoTicketMaker.java create mode 100644 src/test/java/lotto/model/LottoTicketMakerTest.java diff --git a/README.md b/README.md index 09080308d3c..0ffd75ca20e 100644 --- a/README.md +++ b/README.md @@ -11,7 +11,7 @@ ## 기능 목록 - [x] 로또 티켓은 숫자를 6개 가질 수 있다. - [x] 로또 티켓에 들어가는 로또 숫자는 1 이상 45 이하의 숫자다. -- [ ] 티켓 수를 입력하면 입력한 수만큼 자동 로또 티켓이 구매된다. +- [x] 티켓 수를 입력하면 입력한 수만큼 자동 로또 티켓이 구매된다. - [ ] 구입금액과 수동으로 구매할 티켓 수를 입력하면 남은 금액만큼 자동 구매 티켓 수가 결정된다. - [ ] 당첨 번호 6개를 입력하면 로또 티켓에 숫자가 몇개 일치하는지 반환한다. - [ ] 당첨 번호 6개와 보너스 볼을 입력하면 숫자가 몇개 일치하는지와 보너스 볼 일치 여부를 반환한다. diff --git a/src/main/java/lotto/model/LottoNumber.java b/src/main/java/lotto/model/LottoNumber.java new file mode 100644 index 00000000000..c9afac8c5fe --- /dev/null +++ b/src/main/java/lotto/model/LottoNumber.java @@ -0,0 +1,23 @@ +package lotto.model; + +public class LottoNumber { + public static final int LOTTO_NUBER_MIN = 1; + public static final int LOTTO_NUBER_MAX = 45; + private final int number; + + public LottoNumber(int number) { + if (number < LOTTO_NUBER_MIN || number > LOTTO_NUBER_MAX) { + throw new IllegalArgumentException("로또 숫자는 1 이상 45 이하의 숫자이어야 합니다."); + } + this.number = number; + } + + public static LottoNumber of(int number) { + return new LottoNumber(number); + } + + @Override + public String toString() { + return String.valueOf(number); + } +} diff --git a/src/main/java/lotto/model/LottoTicketMaker.java b/src/main/java/lotto/model/LottoTicketMaker.java new file mode 100644 index 00000000000..f9b88fc70fa --- /dev/null +++ b/src/main/java/lotto/model/LottoTicketMaker.java @@ -0,0 +1,27 @@ +package lotto.model; + +import java.util.ArrayList; +import java.util.Collections; +import java.util.List; +import java.util.Random; +import java.util.stream.Collectors; +import java.util.stream.IntStream; + +public class LottoTicketMaker { + public static List purchase(int ticketCount) { + return IntStream.range(0, ticketCount) + .mapToObj(i -> new LottoTicket(generateRandomNumbers())) + .collect(Collectors.toList()); + } + + private static List generateRandomNumbers() { + return IntStream.rangeClosed(LottoNumber.LOTTO_NUBER_MIN, LottoNumber.LOTTO_NUBER_MAX) + .boxed() + .collect(Collectors.collectingAndThen( + Collectors.toList(), + list -> { + Collections.shuffle(list, new Random()); + return list.stream().limit(LottoTicket.LOTTO_NUBERS_SIZE).collect(Collectors.toList()); + })); + } +} diff --git a/src/test/java/lotto/model/LottoTicketMakerTest.java b/src/test/java/lotto/model/LottoTicketMakerTest.java new file mode 100644 index 00000000000..4b783d1443a --- /dev/null +++ b/src/test/java/lotto/model/LottoTicketMakerTest.java @@ -0,0 +1,19 @@ +package lotto.model; + +import static org.assertj.core.api.Assertions.assertThat; +import static org.junit.jupiter.api.Assertions.*; + +import org.junit.jupiter.api.DisplayName; +import org.junit.jupiter.api.Test; + +import java.util.List; + +class LottoTicketMakerTest { + @Test + @DisplayName("티켓 수를 입력하면 입력한 수만큼 자동 로또 티켓이 구매된다.") + void test1() { + List lottoTickets = LottoTicketMaker.purchase(100); + assertThat(lottoTickets).hasSize(100); + } + +} \ No newline at end of file From 2241c440af45841bd1d5e8b621457f6d8bce8339 Mon Sep 17 00:00:00 2001 From: Yeongseo Kim Date: Mon, 17 Jun 2024 01:44:42 +0900 Subject: [PATCH 06/19] =?UTF-8?q?fix:=20=EA=B5=AC=EC=9E=85=20=EA=B8=88?= =?UTF-8?q?=EC=95=A1=EC=9D=84=20=EC=9E=85=EB=A0=A5=ED=95=98=EB=A9=B4=20?= =?UTF-8?q?=EC=9E=90=EB=8F=99=20=EB=A1=9C=EB=98=90=20=ED=8B=B0=EC=BC=93?= =?UTF-8?q?=EC=9D=84=20=EC=83=9D=EC=84=B1=ED=95=98=EB=8F=84=EB=A1=9D=20?= =?UTF-8?q?=EA=B8=B0=EB=8A=A5=20=EC=88=98=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- README.md | 2 +- src/main/java/lotto/model/LottoTicket.java | 1 + src/main/java/lotto/model/LottoTicketMaker.java | 5 ++++- src/test/java/lotto/model/LottoTicketMakerTest.java | 13 ++++++++++--- src/test/java/lotto/model/LottoTicketTest.java | 6 +++--- 5 files changed, 19 insertions(+), 8 deletions(-) diff --git a/README.md b/README.md index 0ffd75ca20e..137fff32e5a 100644 --- a/README.md +++ b/README.md @@ -11,7 +11,7 @@ ## 기능 목록 - [x] 로또 티켓은 숫자를 6개 가질 수 있다. - [x] 로또 티켓에 들어가는 로또 숫자는 1 이상 45 이하의 숫자다. -- [x] 티켓 수를 입력하면 입력한 수만큼 자동 로또 티켓이 구매된다. +- [x] 구입금액을 입력하면 구입할 수 있을 만큼 자동 로또 티켓이 구매된다. - [ ] 구입금액과 수동으로 구매할 티켓 수를 입력하면 남은 금액만큼 자동 구매 티켓 수가 결정된다. - [ ] 당첨 번호 6개를 입력하면 로또 티켓에 숫자가 몇개 일치하는지 반환한다. - [ ] 당첨 번호 6개와 보너스 볼을 입력하면 숫자가 몇개 일치하는지와 보너스 볼 일치 여부를 반환한다. diff --git a/src/main/java/lotto/model/LottoTicket.java b/src/main/java/lotto/model/LottoTicket.java index ceb38c339ea..24d853eb4e3 100644 --- a/src/main/java/lotto/model/LottoTicket.java +++ b/src/main/java/lotto/model/LottoTicket.java @@ -5,6 +5,7 @@ import java.util.stream.Collectors; public class LottoTicket { + public static final int LOTTO_TICKET_PRICE = 1000; public static final int LOTTO_NUBERS_SIZE = 6; private final Set lottoNumbers; diff --git a/src/main/java/lotto/model/LottoTicketMaker.java b/src/main/java/lotto/model/LottoTicketMaker.java index f9b88fc70fa..5c725b3ef7b 100644 --- a/src/main/java/lotto/model/LottoTicketMaker.java +++ b/src/main/java/lotto/model/LottoTicketMaker.java @@ -8,7 +8,8 @@ import java.util.stream.IntStream; public class LottoTicketMaker { - public static List purchase(int ticketCount) { + public static List purchase(int payAmount) { + int ticketCount = payAmount / LottoTicket.LOTTO_TICKET_PRICE; return IntStream.range(0, ticketCount) .mapToObj(i -> new LottoTicket(generateRandomNumbers())) .collect(Collectors.toList()); @@ -24,4 +25,6 @@ private static List generateRandomNumbers() { return list.stream().limit(LottoTicket.LOTTO_NUBERS_SIZE).collect(Collectors.toList()); })); } + + } diff --git a/src/test/java/lotto/model/LottoTicketMakerTest.java b/src/test/java/lotto/model/LottoTicketMakerTest.java index 4b783d1443a..a17e77bcbb6 100644 --- a/src/test/java/lotto/model/LottoTicketMakerTest.java +++ b/src/test/java/lotto/model/LottoTicketMakerTest.java @@ -10,10 +10,17 @@ class LottoTicketMakerTest { @Test - @DisplayName("티켓 수를 입력하면 입력한 수만큼 자동 로또 티켓이 구매된다.") + @DisplayName("구입금액을 입력하면 구입할 수 있을 만큼 자동 로또 티켓이 구매된다.") void test1() { - List lottoTickets = LottoTicketMaker.purchase(100); - assertThat(lottoTickets).hasSize(100); + List lottoTickets = LottoTicketMaker.purchase(14000); + assertThat(lottoTickets).hasSize(14); + } + + @Test + @DisplayName("구입금액과 수동으로 구매할 티켓 수를 입력하면 남은 금액만큼 자동 구매 티켓 수가 결정된다.") + void test2() { +// List lottoTickets = LottoTicketMaker.purchase(14000); +// assertThat(lottoTickets).hasSize(14); } } \ No newline at end of file diff --git a/src/test/java/lotto/model/LottoTicketTest.java b/src/test/java/lotto/model/LottoTicketTest.java index 364b36f0cfd..46d763ad9e0 100644 --- a/src/test/java/lotto/model/LottoTicketTest.java +++ b/src/test/java/lotto/model/LottoTicketTest.java @@ -12,7 +12,7 @@ class LottoTicketTest { @Test @DisplayName("로또 티켓은 숫자를 6개 가질 수 있다.") void test1() { - var lottoTicket = new LottoTicket(List.of(1,2,3,4,5,6)); + LottoTicket lottoTicket = new LottoTicket(List.of(1,2,3,4,5,6)); assertThat(lottoTicket.getLottoNumbers()) .hasSize(6); } @@ -21,7 +21,7 @@ void test1() { @DisplayName("로또 티켓의 숫자가 6개가 아닐 경우 에러가 발생한다.") void test2() { assertThatThrownBy(() -> { - var lottoTicket = new LottoTicket(List.of(1,2,3,4,5,6,7)); + LottoTicket lottoTicket = new LottoTicket(List.of(1,2,3,4,5,6,7)); }) .isInstanceOf(IllegalArgumentException.class); } @@ -30,7 +30,7 @@ void test2() { @DisplayName("로또 티켓에 들어가는 숫자는 1 이상 45 이하의 숫자다.") void test3() { assertThatThrownBy(() -> { - var lottoTicket = new LottoTicket(List.of(0,1,2,3,4,5)); + LottoTicket lottoTicket = new LottoTicket(List.of(0,1,2,3,4,5)); }) .isInstanceOf(IllegalArgumentException.class) .hasMessageContaining("로또 숫자는 1 이상 45 이하의 숫자이어야 합니다."); From 39b6586199d85e4374d4950a1da499d30abe5ba4 Mon Sep 17 00:00:00 2001 From: Yeongseo Kim Date: Mon, 17 Jun 2024 04:23:26 +0900 Subject: [PATCH 07/19] =?UTF-8?q?fear:=20View,=20Controller,=20LottoTicket?= =?UTF-8?q?Bundle=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/LottoApplication.java | 10 ++++++ .../java/lotto/controller/LottoManager.java | 34 +++++++++++++++++++ src/main/java/lotto/model/LottoGame.java | 21 ++++++++++++ ...icketMaker.java => LottoTicketBundle.java} | 21 ++++++++---- src/main/java/lotto/view/InputView.java | 32 +++++++++++++++++ src/main/java/lotto/view/ResultView.java | 15 ++++++++ src/test/java/lotto/model/LottoGameTest.java | 15 ++++++++ .../lotto/model/LottoTicketBundleTest.java | 15 ++++++++ .../lotto/model/LottoTicketMakerTest.java | 26 -------------- 9 files changed, 157 insertions(+), 32 deletions(-) create mode 100644 src/main/java/lotto/LottoApplication.java create mode 100644 src/main/java/lotto/controller/LottoManager.java create mode 100644 src/main/java/lotto/model/LottoGame.java rename src/main/java/lotto/model/{LottoTicketMaker.java => LottoTicketBundle.java} (64%) create mode 100644 src/main/java/lotto/view/InputView.java create mode 100644 src/main/java/lotto/view/ResultView.java create mode 100644 src/test/java/lotto/model/LottoGameTest.java create mode 100644 src/test/java/lotto/model/LottoTicketBundleTest.java delete mode 100644 src/test/java/lotto/model/LottoTicketMakerTest.java diff --git a/src/main/java/lotto/LottoApplication.java b/src/main/java/lotto/LottoApplication.java new file mode 100644 index 00000000000..94012b56fee --- /dev/null +++ b/src/main/java/lotto/LottoApplication.java @@ -0,0 +1,10 @@ +package lotto; + +import lotto.controller.LottoManager; + +public class LottoApplication { + public static void main(String[] args) { + new LottoManager().run(); + } + +} diff --git a/src/main/java/lotto/controller/LottoManager.java b/src/main/java/lotto/controller/LottoManager.java new file mode 100644 index 00000000000..4b9223d53b9 --- /dev/null +++ b/src/main/java/lotto/controller/LottoManager.java @@ -0,0 +1,34 @@ +package lotto.controller; + +import lotto.model.LottoGame; +import lotto.model.LottoTicket; +import lotto.model.LottoTicketBundle; +import lotto.view.InputView; +import lotto.view.ResultView; + +import java.util.stream.Collectors; +import java.util.stream.IntStream; + +public class LottoManager { + private final InputView inputView = new InputView(); + private final ResultView resultView = new ResultView(); + + public void run() { + int payAmount = inputView.inputPayAmount(); + int manualLottoTicketCount = inputView.inputManualLottoTicketCount(); + + inputView.printManualLottoNumbers(); + LottoTicketBundle manualLottoTickets = new LottoTicketBundle( + IntStream.range(0, manualLottoTicketCount) + .mapToObj(i -> new LottoTicket(inputView.inputManualLottoNumbers())) + .collect(Collectors.toList()) + ); + + int autoLottoTicketCount = (payAmount-(1000*manualLottoTickets.getLottoTickets().size()))/1000; + + LottoGame lottoGame = new LottoGame(manualLottoTickets, LottoTicketBundle.create(autoLottoTicketCount*1000)); + + resultView.printLottoTicketCounts(manualLottoTicketCount, autoLottoTicketCount); + resultView.printUserLottoTickets(lottoGame); + } +} diff --git a/src/main/java/lotto/model/LottoGame.java b/src/main/java/lotto/model/LottoGame.java new file mode 100644 index 00000000000..69d7e85d550 --- /dev/null +++ b/src/main/java/lotto/model/LottoGame.java @@ -0,0 +1,21 @@ +package lotto.model; + +import java.util.stream.Collectors; +import java.util.stream.Stream; + +public class LottoGame { + private final LottoTicketBundle userLottoTickets; + + public LottoGame(LottoTicketBundle userLottoTickets) { + this.userLottoTickets = userLottoTickets; + } + + public LottoGame(LottoTicketBundle manualLottoTickets, LottoTicketBundle autoLottoTickets) { + this(new LottoTicketBundle(Stream.concat(manualLottoTickets.getLottoTickets().stream(), autoLottoTickets.getLottoTickets().stream()) + .collect(Collectors.toList()))); + } + + public LottoTicketBundle getUserLottoTickets() { + return userLottoTickets; + } +} diff --git a/src/main/java/lotto/model/LottoTicketMaker.java b/src/main/java/lotto/model/LottoTicketBundle.java similarity index 64% rename from src/main/java/lotto/model/LottoTicketMaker.java rename to src/main/java/lotto/model/LottoTicketBundle.java index 5c725b3ef7b..30c4af2ca9b 100644 --- a/src/main/java/lotto/model/LottoTicketMaker.java +++ b/src/main/java/lotto/model/LottoTicketBundle.java @@ -1,18 +1,25 @@ package lotto.model; -import java.util.ArrayList; import java.util.Collections; import java.util.List; import java.util.Random; import java.util.stream.Collectors; import java.util.stream.IntStream; -public class LottoTicketMaker { - public static List purchase(int payAmount) { +public class LottoTicketBundle { + private final List lottoTickets; + + public LottoTicketBundle(List lottoTickets) { + this.lottoTickets = lottoTickets; + } + + public static LottoTicketBundle create(int payAmount) { int ticketCount = payAmount / LottoTicket.LOTTO_TICKET_PRICE; - return IntStream.range(0, ticketCount) + return new LottoTicketBundle( + IntStream.range(0, ticketCount) .mapToObj(i -> new LottoTicket(generateRandomNumbers())) - .collect(Collectors.toList()); + .collect(Collectors.toList()) + ); } private static List generateRandomNumbers() { @@ -26,5 +33,7 @@ private static List generateRandomNumbers() { })); } - + public List getLottoTickets() { + return lottoTickets; + } } diff --git a/src/main/java/lotto/view/InputView.java b/src/main/java/lotto/view/InputView.java new file mode 100644 index 00000000000..8849b863aaa --- /dev/null +++ b/src/main/java/lotto/view/InputView.java @@ -0,0 +1,32 @@ +package lotto.view; + +import java.util.Arrays; +import java.util.List; +import java.util.Scanner; +import java.util.stream.Collectors; + +public class InputView { + private static final Scanner scanner = new Scanner(System.in); + + public int inputPayAmount() { + System.out.println("구입금액을 입력해 주세요."); + return scanner.nextInt(); + } + + public int inputManualLottoTicketCount() { + System.out.println("수동으로 구매할 로또 수를 입력해 주세요."); + return scanner.nextInt(); + } + + public void printManualLottoNumbers() { + scanner.nextLine(); + System.out.println("수동으로 구매할 번호를 입력해 주세요."); + } + + public List inputManualLottoNumbers() { + return Arrays.stream(scanner.nextLine().split(",")) + .map(String::trim) + .map(Integer::parseInt) + .collect(Collectors.toList()); + } +} diff --git a/src/main/java/lotto/view/ResultView.java b/src/main/java/lotto/view/ResultView.java new file mode 100644 index 00000000000..fb00316c1b1 --- /dev/null +++ b/src/main/java/lotto/view/ResultView.java @@ -0,0 +1,15 @@ +package lotto.view; + +import lotto.model.LottoGame; + +public class ResultView { + + public void printLottoTicketCounts(int manualLottoTicketCount, int autoLottoTicketCount) { + System.out.printf("수동으로 %s장, 자동으로 %s개를 구매했습니다.\n", manualLottoTicketCount, autoLottoTicketCount); + } + + public void printUserLottoTickets(LottoGame lottoGame) { + lottoGame.getUserLottoTickets().getLottoTickets().stream() + .forEach(lottoTicket -> System.out.println(lottoTicket.getLottoNumbers())); + } +} diff --git a/src/test/java/lotto/model/LottoGameTest.java b/src/test/java/lotto/model/LottoGameTest.java new file mode 100644 index 00000000000..ae0cc80a103 --- /dev/null +++ b/src/test/java/lotto/model/LottoGameTest.java @@ -0,0 +1,15 @@ +package lotto.model; + +import org.junit.jupiter.api.DisplayName; +import org.junit.jupiter.api.Test; + +import java.util.ArrayList; +import java.util.List; + +class LottoGameTest { + @Test + @DisplayName("수동으로 구입한 로또 티켓과 자동으로 구입한 로또 티켓을 합친다.") + void test1() { + List manualLottoTickets = new ArrayList<>(); + } +} \ No newline at end of file diff --git a/src/test/java/lotto/model/LottoTicketBundleTest.java b/src/test/java/lotto/model/LottoTicketBundleTest.java new file mode 100644 index 00000000000..94cccfc84be --- /dev/null +++ b/src/test/java/lotto/model/LottoTicketBundleTest.java @@ -0,0 +1,15 @@ +package lotto.model; + +import static org.assertj.core.api.Assertions.assertThat; + +import org.junit.jupiter.api.DisplayName; +import org.junit.jupiter.api.Test; + +class LottoTicketBundleTest { + @Test + @DisplayName("구입금액을 입력하면 구입할 수 있을 만큼 자동 로또 티켓이 구매된다.") + void test1() { + LottoTicketBundle lottoTickets = LottoTicketBundle.create(14000); + assertThat(lottoTickets.getLottoTickets()).hasSize(14); + } +} \ No newline at end of file diff --git a/src/test/java/lotto/model/LottoTicketMakerTest.java b/src/test/java/lotto/model/LottoTicketMakerTest.java deleted file mode 100644 index a17e77bcbb6..00000000000 --- a/src/test/java/lotto/model/LottoTicketMakerTest.java +++ /dev/null @@ -1,26 +0,0 @@ -package lotto.model; - -import static org.assertj.core.api.Assertions.assertThat; -import static org.junit.jupiter.api.Assertions.*; - -import org.junit.jupiter.api.DisplayName; -import org.junit.jupiter.api.Test; - -import java.util.List; - -class LottoTicketMakerTest { - @Test - @DisplayName("구입금액을 입력하면 구입할 수 있을 만큼 자동 로또 티켓이 구매된다.") - void test1() { - List lottoTickets = LottoTicketMaker.purchase(14000); - assertThat(lottoTickets).hasSize(14); - } - - @Test - @DisplayName("구입금액과 수동으로 구매할 티켓 수를 입력하면 남은 금액만큼 자동 구매 티켓 수가 결정된다.") - void test2() { -// List lottoTickets = LottoTicketMaker.purchase(14000); -// assertThat(lottoTickets).hasSize(14); - } - -} \ No newline at end of file From eec46a86e591b8f5935687cf13c42bda349bda53 Mon Sep 17 00:00:00 2001 From: Yeongseo Kim Date: Sun, 23 Jun 2024 15:42:22 +0900 Subject: [PATCH 08/19] =?UTF-8?q?feat:=20=EB=8B=B9=EC=B2=A8=EB=B2=88?= =?UTF-8?q?=ED=98=B8,=20=EB=B3=B4=EB=84=88=EC=8A=A4=EB=B3=BC=20=EC=9E=85?= =?UTF-8?q?=EB=A0=A5=20inputView=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/controller/LottoManager.java | 2 ++ src/main/java/lotto/view/InputView.java | 13 +++++++++++++ 2 files changed, 15 insertions(+) diff --git a/src/main/java/lotto/controller/LottoManager.java b/src/main/java/lotto/controller/LottoManager.java index 4b9223d53b9..ca2df21e7bb 100644 --- a/src/main/java/lotto/controller/LottoManager.java +++ b/src/main/java/lotto/controller/LottoManager.java @@ -30,5 +30,7 @@ public void run() { resultView.printLottoTicketCounts(manualLottoTicketCount, autoLottoTicketCount); resultView.printUserLottoTickets(lottoGame); + inputView.inputWinningNumbers(); + inputView.inputBonusNumber(); } } diff --git a/src/main/java/lotto/view/InputView.java b/src/main/java/lotto/view/InputView.java index 8849b863aaa..723de1da8c2 100644 --- a/src/main/java/lotto/view/InputView.java +++ b/src/main/java/lotto/view/InputView.java @@ -29,4 +29,17 @@ public List inputManualLottoNumbers() { .map(Integer::parseInt) .collect(Collectors.toList()); } + + public List inputWinningNumbers() { + System.out.println("\n지난 주 당첨 번호를 입력해 주세요."); + return Arrays.stream(scanner.nextLine().split(",")) + .map(String::trim) + .map(Integer::parseInt) + .collect(Collectors.toList()); + } + + public int inputBonusNumber() { + System.out.println("보너스 볼을 입력해 주세요."); + return scanner.nextInt(); + } } From 702abdab219d9750fc0b34ae7455ccef892f193c Mon Sep 17 00:00:00 2001 From: Yeongseo Kim Date: Sun, 23 Jun 2024 16:42:29 +0900 Subject: [PATCH 09/19] =?UTF-8?q?feat:=20LottRank=20enum=20=ED=81=B4?= =?UTF-8?q?=EB=9E=98=EC=8A=A4=20=EC=B6=94=EA=B0=80,=20match=20=EA=B8=B0?= =?UTF-8?q?=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 --- src/main/java/lotto/model/LottoRank.java | 34 +++++++++++++++++++++ src/main/java/lotto/model/LottoTicket.java | 12 +++++++- src/main/java/lotto/model/WinningLotto.java | 19 ++++++++++++ 3 files changed, 64 insertions(+), 1 deletion(-) create mode 100644 src/main/java/lotto/model/LottoRank.java create mode 100644 src/main/java/lotto/model/WinningLotto.java diff --git a/src/main/java/lotto/model/LottoRank.java b/src/main/java/lotto/model/LottoRank.java new file mode 100644 index 00000000000..6b87d2f5863 --- /dev/null +++ b/src/main/java/lotto/model/LottoRank.java @@ -0,0 +1,34 @@ +package lotto.model; + +public enum LottoRank { + THREE(3, 5000), + FOUR(4, 50000), + FIVE(5, 1500000), + FIVE_BONUS(5, 30000000), + SIX(6, 2000000000); + + private final int matchCount; + private final int winningPrize; + + LottoRank(int matchCount, int winningPrize) { + this.matchCount = matchCount; + this.winningPrize = winningPrize; + } + + public int getMatchCount() { + return matchCount; + } + + public int getWinningPrize() { + return winningPrize; + } + + public static LottoRank valueOf(int matchCount) { + for (LottoRank rank : values()) { + if (rank.matchCount == matchCount) { + return rank; + } + } + throw new IllegalArgumentException("일치하는 등수가 없습니다."); + } +} diff --git a/src/main/java/lotto/model/LottoTicket.java b/src/main/java/lotto/model/LottoTicket.java index 24d853eb4e3..b676ec570b5 100644 --- a/src/main/java/lotto/model/LottoTicket.java +++ b/src/main/java/lotto/model/LottoTicket.java @@ -15,7 +15,7 @@ public LottoTicket(List lottoNumbers) { .collect(Collectors.toSet())); } - public LottoTicket(Set lottoNumbers) { + protected LottoTicket(Set lottoNumbers) { if (lottoNumbers.size() != LOTTO_NUBERS_SIZE) { throw new IllegalArgumentException("로또 티켓의 로또 숫자는 6개이어야 합니다."); } @@ -25,4 +25,14 @@ public LottoTicket(Set lottoNumbers) { public Set getLottoNumbers() { return lottoNumbers; } + + public int match(LottoTicket otherNumbers) { + int matchCount = 0; + for (LottoNumber number : lottoNumbers) { + if (otherNumbers.getLottoNumbers().contains(number)) { + matchCount++; + } + } + return matchCount; + } } diff --git a/src/main/java/lotto/model/WinningLotto.java b/src/main/java/lotto/model/WinningLotto.java new file mode 100644 index 00000000000..a7580966c3f --- /dev/null +++ b/src/main/java/lotto/model/WinningLotto.java @@ -0,0 +1,19 @@ +package lotto.model; + +public class WinningLotto { + private final LottoTicket winningLotto; + private final LottoNumber bonusNumber; + + public WinningLotto(LottoTicket winningLotto, LottoNumber bonusNumber) { + this.winningLotto = winningLotto; + this.bonusNumber = bonusNumber; + } + + public int match(LottoTicket target) { + int matchCount = winningLotto.match(winningLotto); + if (winningLotto.getLottoNumbers().contains(bonusNumber)) { + matchCount++; + } + return matchCount; + } +} From a49cbc35c8110b793bf343ed252ff47efc177bed Mon Sep 17 00:00:00 2001 From: Yeongseo Kim Date: Sun, 23 Jun 2024 17:10:27 +0900 Subject: [PATCH 10/19] =?UTF-8?q?feat:=20LottoResult=20(=EB=8B=B9=EC=B2=A8?= =?UTF-8?q?=20=ED=86=B5=EA=B3=84)=20=EC=B6=94=EA=B0=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/main/java/lotto/model/LottoResult.java | 23 +++++++++++++++++++ .../java/lotto/model/LottoResultTest.java | 19 +++++++++++++++ 2 files changed, 42 insertions(+) create mode 100644 src/main/java/lotto/model/LottoResult.java create mode 100644 src/test/java/lotto/model/LottoResultTest.java diff --git a/src/main/java/lotto/model/LottoResult.java b/src/main/java/lotto/model/LottoResult.java new file mode 100644 index 00000000000..6d93afec5eb --- /dev/null +++ b/src/main/java/lotto/model/LottoResult.java @@ -0,0 +1,23 @@ +package lotto.model; + +import java.util.EnumMap; +import java.util.Map; + +public class LottoResult { + private final Map resultMap; + + public LottoResult() { + resultMap = new EnumMap<>(LottoRank.class); + for (LottoRank rank : LottoRank.values()) { + resultMap.put(rank, 0); + } + } + + public void addRank(LottoRank rank) { + resultMap.put(rank, resultMap.get(rank) + 1); + } + + public int getCount(LottoRank rank) { + return resultMap.get(rank); + } +} diff --git a/src/test/java/lotto/model/LottoResultTest.java b/src/test/java/lotto/model/LottoResultTest.java new file mode 100644 index 00000000000..b2f55507602 --- /dev/null +++ b/src/test/java/lotto/model/LottoResultTest.java @@ -0,0 +1,19 @@ +package lotto.model; + +import org.junit.jupiter.api.DisplayName; +import org.junit.jupiter.api.Test; + +import static org.assertj.core.api.Assertions.assertThat; +import static org.junit.jupiter.api.Assertions.*; + +class LottoResultTest { + @Test + @DisplayName("당첨 통계에 당첨된 등수를 추가한다.") + public void test1() { + var lottoResult = new LottoResult(); + + lottoResult.addRank(LottoRank.THREE); + assertThat(lottoResult.getCount(LottoRank.THREE)) + .isEqualTo(1); + } +} \ No newline at end of file From 98111fb163d5406320a25fb375abf997a7cba8a7 Mon Sep 17 00:00:00 2001 From: Yeongseo Kim Date: Sun, 23 Jun 2024 17:24:20 +0900 Subject: [PATCH 11/19] =?UTF-8?q?feat:=20=EB=8B=B9=EC=B2=A8=20=EB=B2=88?= =?UTF-8?q?=ED=98=B8=20=EC=88=AB=EC=9E=90=20+=20=EB=B3=B4=EB=84=88?= =?UTF-8?q?=EC=8A=A4=EB=B3=BC=20=EC=88=AB=EC=9E=90=20=EC=9D=BC=EC=B9=98=20?= =?UTF-8?q?=EA=B0=9C=EC=88=98=20=EB=B0=98=ED=99=98=20=EA=B8=B0=EB=8A=A5=20?= =?UTF-8?q?=EC=B6=94=EA=B0=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- README.md | 6 ++-- src/main/java/lotto/model/LottoNumber.java | 15 +++++++++ src/test/java/lotto/model/LottoGameTest.java | 15 +++++++-- .../java/lotto/model/WinningLottoTest.java | 31 +++++++++++++++++++ 4 files changed, 61 insertions(+), 6 deletions(-) create mode 100644 src/test/java/lotto/model/WinningLottoTest.java diff --git a/README.md b/README.md index 137fff32e5a..96101c2b957 100644 --- a/README.md +++ b/README.md @@ -12,7 +12,7 @@ - [x] 로또 티켓은 숫자를 6개 가질 수 있다. - [x] 로또 티켓에 들어가는 로또 숫자는 1 이상 45 이하의 숫자다. - [x] 구입금액을 입력하면 구입할 수 있을 만큼 자동 로또 티켓이 구매된다. -- [ ] 구입금액과 수동으로 구매할 티켓 수를 입력하면 남은 금액만큼 자동 구매 티켓 수가 결정된다. -- [ ] 당첨 번호 6개를 입력하면 로또 티켓에 숫자가 몇개 일치하는지 반환한다. -- [ ] 당첨 번호 6개와 보너스 볼을 입력하면 숫자가 몇개 일치하는지와 보너스 볼 일치 여부를 반환한다. +- [x] 구입금액과 수동으로 구매할 티켓 수를 입력하면 남은 금액만큼 자동 구매 티켓 수가 결정된다. +- [x] 당첨 번호 6개를 입력하면 로또 티켓에 숫자가 몇개 일치하는지 반환한다. +- [x] 당첨 번호 6개와 보너스 볼을 입력하면 숫자가 몇개 일치하는지와 보너스 볼 일치 여부를 반환한다. - [ ] 로또 티켓과 당첨 번호 6개, 보너스 볼을 입력하면 몇등 상인지 반환한다. \ No newline at end of file diff --git a/src/main/java/lotto/model/LottoNumber.java b/src/main/java/lotto/model/LottoNumber.java index c9afac8c5fe..9a424b145a0 100644 --- a/src/main/java/lotto/model/LottoNumber.java +++ b/src/main/java/lotto/model/LottoNumber.java @@ -1,5 +1,7 @@ package lotto.model; +import java.util.Objects; + public class LottoNumber { public static final int LOTTO_NUBER_MIN = 1; public static final int LOTTO_NUBER_MAX = 45; @@ -16,6 +18,19 @@ public static LottoNumber of(int number) { return new LottoNumber(number); } + @Override + public boolean equals(Object o) { + if (this == o) return true; + if (o == null || getClass() != o.getClass()) return false; + LottoNumber that = (LottoNumber) o; + return number == that.number; + } + + @Override + public int hashCode() { + return Objects.hashCode(number); + } + @Override public String toString() { return String.valueOf(number); diff --git a/src/test/java/lotto/model/LottoGameTest.java b/src/test/java/lotto/model/LottoGameTest.java index ae0cc80a103..5e5a1332c37 100644 --- a/src/test/java/lotto/model/LottoGameTest.java +++ b/src/test/java/lotto/model/LottoGameTest.java @@ -3,13 +3,22 @@ import org.junit.jupiter.api.DisplayName; import org.junit.jupiter.api.Test; -import java.util.ArrayList; +import java.util.Arrays; import java.util.List; class LottoGameTest { @Test - @DisplayName("수동으로 구입한 로또 티켓과 자동으로 구입한 로또 티켓을 합친다.") + @DisplayName("당첨 번호 6개를 입력하면 로또 티켓에 숫자가 몇개 일치하는지 반환한다.") void test1() { - List manualLottoTickets = new ArrayList<>(); +// var lottoTicket1 = new LottoTicket(List.of(1,2 3,4,5,6)); +// var lottoTicket2 = new LottoTicket(List.of(1,2 3,4,5,7)); +// var lottoTicketBundle1 = new LottoTicketBundle(Arrays.asList(lottoTicket1)); +// var lottoTicketBundle2 = new LottoTicketBundle(Arrays.asList(lottoTicket2)); +// LottoGame lottoGame = new LottoGame(lottoTicketBundle1, lottoTicketBundle2); +// +// var winningNumbers = new LottoTicket(List.of(1,2 3,4,5,6)); +// var bounsNumber = LottoNumber.of(7); +// WinningLotto winningLotto = new WinningLotto(winningNumbers, bounsNumber); +// winningLotto.match(lottoTicketBundle1); } } \ No newline at end of file diff --git a/src/test/java/lotto/model/WinningLottoTest.java b/src/test/java/lotto/model/WinningLottoTest.java new file mode 100644 index 00000000000..2a1ed9a87b8 --- /dev/null +++ b/src/test/java/lotto/model/WinningLottoTest.java @@ -0,0 +1,31 @@ +package lotto.model; + +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.junit.jupiter.api.Assertions.*; + +class WinningLottoTest { + @Test + @DisplayName("당첨 번호 6개를 입력하면 로또 티켓에 숫자가 몇개 일치하는지 반환한다.") + public void test1() { + WinningLotto winningLotto = new WinningLotto(new LottoTicket(List.of(1,2,3,4,5,6)), LottoNumber.of(7)); + LottoTicket targetLotto = new LottoTicket(List.of(1,2,3,4,5,6)); + int matchCount = winningLotto.match(targetLotto); + assertThat(matchCount) + .isEqualTo(6); + } + + @Test + @DisplayName("당첨 번호 6개를 입력하면 로또 티켓에 숫자와 보너스볼 일치 개수를 반환한다.") + public void test2() { + WinningLotto winningLotto = new WinningLotto(new LottoTicket(List.of(1,2,3,4,5,6)), LottoNumber.of(7)); + LottoTicket targetLotto = new LottoTicket(List.of(1,2,3,4,5,7)); + int matchCount = winningLotto.match(targetLotto); + assertThat(matchCount) + .isEqualTo(6); + } +} \ No newline at end of file From 7f81e100087afe3af3513ba9a7c4a61f178d9ac3 Mon Sep 17 00:00:00 2001 From: Yeongseo Kim Date: Sun, 23 Jun 2024 17:49:32 +0900 Subject: [PATCH 12/19] =?UTF-8?q?feat:=20=EC=88=98=EC=9D=B5=EB=A5=A0=20?= =?UTF-8?q?=EA=B3=84=EC=82=B0=20=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 | 3 ++- src/main/java/lotto/model/LottoResult.java | 7 +++++++ src/test/java/lotto/model/LottoResultTest.java | 12 ++++++++++++ 3 files changed, 21 insertions(+), 1 deletion(-) diff --git a/README.md b/README.md index 96101c2b957..3f996a8bb9c 100644 --- a/README.md +++ b/README.md @@ -15,4 +15,5 @@ - [x] 구입금액과 수동으로 구매할 티켓 수를 입력하면 남은 금액만큼 자동 구매 티켓 수가 결정된다. - [x] 당첨 번호 6개를 입력하면 로또 티켓에 숫자가 몇개 일치하는지 반환한다. - [x] 당첨 번호 6개와 보너스 볼을 입력하면 숫자가 몇개 일치하는지와 보너스 볼 일치 여부를 반환한다. -- [ ] 로또 티켓과 당첨 번호 6개, 보너스 볼을 입력하면 몇등 상인지 반환한다. \ No newline at end of file +- [x] 로또 티켓과 당첨 번호 6개, 보너스 볼을 입력하면 몇등 상인지 반환한다. +- [x] 총 수익률을 계산한다. \ No newline at end of file diff --git a/src/main/java/lotto/model/LottoResult.java b/src/main/java/lotto/model/LottoResult.java index 6d93afec5eb..7671a29a42e 100644 --- a/src/main/java/lotto/model/LottoResult.java +++ b/src/main/java/lotto/model/LottoResult.java @@ -20,4 +20,11 @@ public void addRank(LottoRank rank) { public int getCount(LottoRank rank) { return resultMap.get(rank); } + + public double getProfitRate(int totalTicketCost) { + int totalWinningPrize = resultMap.entrySet().stream() + .mapToInt(entry -> entry.getKey().getWinningPrize() * entry.getValue()) + .sum(); + return Math.floor((double) totalWinningPrize / totalTicketCost * 100) / 100; + } } diff --git a/src/test/java/lotto/model/LottoResultTest.java b/src/test/java/lotto/model/LottoResultTest.java index b2f55507602..a6282d8a57d 100644 --- a/src/test/java/lotto/model/LottoResultTest.java +++ b/src/test/java/lotto/model/LottoResultTest.java @@ -16,4 +16,16 @@ public void test1() { assertThat(lottoResult.getCount(LottoRank.THREE)) .isEqualTo(1); } + @Test + @DisplayName("총 수익률을 반환한다.") + public void test2() { + var lottoResult = new LottoResult(); + var totalTicketCost = 14000; // 티켓 14개 구입 + + lottoResult.addRank(LottoRank.THREE); + + assertThat(lottoResult.getProfitRate(totalTicketCost)) + .isEqualTo(0.35); + } + } \ No newline at end of file From 5cb34b996d31f27661e1dd013121ff624f197440 Mon Sep 17 00:00:00 2001 From: Yeongseo Kim Date: Sun, 23 Jun 2024 17:57:08 +0900 Subject: [PATCH 13/19] =?UTF-8?q?feat:=20=EB=A1=9C=EB=98=90=20=ED=86=B5?= =?UTF-8?q?=EA=B3=84=20=EC=B6=9C=EB=A0=A5=20=EA=B8=B0=EB=8A=A5=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/view/ResultView.java | 12 ++++++++++++ 1 file changed, 12 insertions(+) diff --git a/src/main/java/lotto/view/ResultView.java b/src/main/java/lotto/view/ResultView.java index fb00316c1b1..1f5e1416a0a 100644 --- a/src/main/java/lotto/view/ResultView.java +++ b/src/main/java/lotto/view/ResultView.java @@ -1,6 +1,10 @@ package lotto.view; import lotto.model.LottoGame; +import lotto.model.LottoRank; +import lotto.model.LottoResult; + +import java.util.Arrays; public class ResultView { @@ -12,4 +16,12 @@ public void printUserLottoTickets(LottoGame lottoGame) { lottoGame.getUserLottoTickets().getLottoTickets().stream() .forEach(lottoTicket -> System.out.println(lottoTicket.getLottoNumbers())); } + + public void printLottoResult(LottoResult lottoResult, int payAmount) { + System.out.println("당첨 통계"); + System.out.println("---------"); + Arrays.stream(LottoRank.values()) + .forEach(rank -> System.out.printf("%d개 일치 (%d원)- %d개\n", rank.getMatchCount(), rank.getWinningPrize(), lottoResult.getCount(rank))); + System.out.printf("총 수익률은 %.2f입니다.(기준이 1이기 때문에 결과적으로 손해라는 의미임)\n", lottoResult.getProfitRate(payAmount)); + } } From 597f537c90c2abaac181722c0d146ba081747c36 Mon Sep 17 00:00:00 2001 From: Yeongseo Kim Date: Sun, 23 Jun 2024 18:56:06 +0900 Subject: [PATCH 14/19] =?UTF-8?q?feat:=20=EB=B3=B4=EB=84=88=EC=8A=A4?= =?UTF-8?q?=EB=B3=BC=20=EC=B2=B4=ED=81=AC=20=EB=A1=9C=EC=A7=81=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/model/LottoRank.java | 7 +++++-- src/main/java/lotto/model/LottoTicket.java | 17 +++++++++-------- src/main/java/lotto/model/WinningLotto.java | 13 ++++++++++--- src/test/java/lotto/model/LottoResultTest.java | 2 +- 4 files changed, 25 insertions(+), 14 deletions(-) diff --git a/src/main/java/lotto/model/LottoRank.java b/src/main/java/lotto/model/LottoRank.java index 6b87d2f5863..7a44a4f3825 100644 --- a/src/main/java/lotto/model/LottoRank.java +++ b/src/main/java/lotto/model/LottoRank.java @@ -4,7 +4,7 @@ public enum LottoRank { THREE(3, 5000), FOUR(4, 50000), FIVE(5, 1500000), - FIVE_BONUS(5, 30000000), + FIVE_BONUS(6, 30000000), SIX(6, 2000000000); private final int matchCount; @@ -23,7 +23,10 @@ public int getWinningPrize() { return winningPrize; } - public static LottoRank valueOf(int matchCount) { + public static LottoRank valueOf(int matchCount, boolean hasBonus) { + if (matchCount == 6 && hasBonus) { + return FIVE_BONUS; + } for (LottoRank rank : values()) { if (rank.matchCount == matchCount) { return rank; diff --git a/src/main/java/lotto/model/LottoTicket.java b/src/main/java/lotto/model/LottoTicket.java index b676ec570b5..1d649c155b7 100644 --- a/src/main/java/lotto/model/LottoTicket.java +++ b/src/main/java/lotto/model/LottoTicket.java @@ -26,13 +26,14 @@ public Set getLottoNumbers() { return lottoNumbers; } - public int match(LottoTicket otherNumbers) { - int matchCount = 0; - for (LottoNumber number : lottoNumbers) { - if (otherNumbers.getLottoNumbers().contains(number)) { - matchCount++; - } - } - return matchCount; + public int countMatchingNumbers(LottoTicket otherNumbers) { + return (int) lottoNumbers.stream() + .filter(otherNumbers::contains) + .count(); + } + + public boolean contains(LottoNumber number) { + return lottoNumbers.contains(number); } + } diff --git a/src/main/java/lotto/model/WinningLotto.java b/src/main/java/lotto/model/WinningLotto.java index a7580966c3f..3cc412e9b9c 100644 --- a/src/main/java/lotto/model/WinningLotto.java +++ b/src/main/java/lotto/model/WinningLotto.java @@ -10,10 +10,17 @@ public WinningLotto(LottoTicket winningLotto, LottoNumber bonusNumber) { } public int match(LottoTicket target) { - int matchCount = winningLotto.match(winningLotto); - if (winningLotto.getLottoNumbers().contains(bonusNumber)) { - matchCount++; + int matchCount = winningLotto.countMatchingNumbers(winningLotto); + boolean hasBonus = target.getLottoNumbers().contains(bonusNumber); + + if (matchCount == 5 && hasBonus) { + return 6; } + return matchCount; } + + public LottoNumber getBonusNumber() { + return bonusNumber; + } } diff --git a/src/test/java/lotto/model/LottoResultTest.java b/src/test/java/lotto/model/LottoResultTest.java index a6282d8a57d..148e92a63e9 100644 --- a/src/test/java/lotto/model/LottoResultTest.java +++ b/src/test/java/lotto/model/LottoResultTest.java @@ -16,6 +16,7 @@ public void test1() { assertThat(lottoResult.getCount(LottoRank.THREE)) .isEqualTo(1); } + @Test @DisplayName("총 수익률을 반환한다.") public void test2() { @@ -27,5 +28,4 @@ public void test2() { assertThat(lottoResult.getProfitRate(totalTicketCost)) .isEqualTo(0.35); } - } \ No newline at end of file From 5b1663d943db61e3683eae2697e9ae17f28db36e Mon Sep 17 00:00:00 2001 From: Yeongseo Kim Date: Sun, 23 Jun 2024 19:00:41 +0900 Subject: [PATCH 15/19] =?UTF-8?q?refactor:=20=ED=81=B4=EB=9E=98=EC=8A=A4?= =?UTF-8?q?=20=EC=9D=B4=EB=A6=84=20=EB=B3=80=EA=B2=BD?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/main/java/lotto/LottoApplication.java | 4 ++-- ...LottoManager.java => LottoController.java} | 18 +++++++------- src/main/java/lotto/model/LottoGame.java | 21 ---------------- .../java/lotto/model/LottoTicketBundle.java | 6 +++++ src/main/java/lotto/service/LottoService.java | 14 +++++++++++ src/main/java/lotto/view/ResultView.java | 6 ++--- src/test/java/lotto/model/LottoGameTest.java | 24 ------------------- 7 files changed, 34 insertions(+), 59 deletions(-) rename src/main/java/lotto/controller/{LottoManager.java => LottoController.java} (58%) delete mode 100644 src/main/java/lotto/model/LottoGame.java create mode 100644 src/main/java/lotto/service/LottoService.java delete mode 100644 src/test/java/lotto/model/LottoGameTest.java diff --git a/src/main/java/lotto/LottoApplication.java b/src/main/java/lotto/LottoApplication.java index 94012b56fee..a0083cd27b9 100644 --- a/src/main/java/lotto/LottoApplication.java +++ b/src/main/java/lotto/LottoApplication.java @@ -1,10 +1,10 @@ package lotto; -import lotto.controller.LottoManager; +import lotto.controller.LottoController; public class LottoApplication { public static void main(String[] args) { - new LottoManager().run(); + new LottoController().run(); } } diff --git a/src/main/java/lotto/controller/LottoManager.java b/src/main/java/lotto/controller/LottoController.java similarity index 58% rename from src/main/java/lotto/controller/LottoManager.java rename to src/main/java/lotto/controller/LottoController.java index ca2df21e7bb..3cb39fb8e70 100644 --- a/src/main/java/lotto/controller/LottoManager.java +++ b/src/main/java/lotto/controller/LottoController.java @@ -1,17 +1,17 @@ package lotto.controller; -import lotto.model.LottoGame; -import lotto.model.LottoTicket; -import lotto.model.LottoTicketBundle; +import lotto.model.*; +import lotto.service.LottoService; import lotto.view.InputView; import lotto.view.ResultView; import java.util.stream.Collectors; import java.util.stream.IntStream; -public class LottoManager { +public class LottoController { private final InputView inputView = new InputView(); private final ResultView resultView = new ResultView(); + private final LottoService lottoService = new LottoService(); public void run() { int payAmount = inputView.inputPayAmount(); @@ -25,12 +25,12 @@ public void run() { ); int autoLottoTicketCount = (payAmount-(1000*manualLottoTickets.getLottoTickets().size()))/1000; + LottoTicketBundle autoLottoTickets = LottoTicketBundle.create(autoLottoTicketCount*1000); - LottoGame lottoGame = new LottoGame(manualLottoTickets, LottoTicketBundle.create(autoLottoTicketCount*1000)); - + LottoTicketBundle userLottoTickets = new LottoTicketBundle(manualLottoTickets, autoLottoTickets); resultView.printLottoTicketCounts(manualLottoTicketCount, autoLottoTicketCount); - resultView.printUserLottoTickets(lottoGame); - inputView.inputWinningNumbers(); - inputView.inputBonusNumber(); + resultView.printUserLottoTickets(userLottoTickets); + WinningLotto winningLotto = new WinningLotto(new LottoTicket(inputView.inputWinningNumbers()), new LottoNumber(inputView.inputBonusNumber())); + resultView.printLottoResult(lottoService.calculateResult(userLottoTickets, winningLotto), payAmount); } } diff --git a/src/main/java/lotto/model/LottoGame.java b/src/main/java/lotto/model/LottoGame.java deleted file mode 100644 index 69d7e85d550..00000000000 --- a/src/main/java/lotto/model/LottoGame.java +++ /dev/null @@ -1,21 +0,0 @@ -package lotto.model; - -import java.util.stream.Collectors; -import java.util.stream.Stream; - -public class LottoGame { - private final LottoTicketBundle userLottoTickets; - - public LottoGame(LottoTicketBundle userLottoTickets) { - this.userLottoTickets = userLottoTickets; - } - - public LottoGame(LottoTicketBundle manualLottoTickets, LottoTicketBundle autoLottoTickets) { - this(new LottoTicketBundle(Stream.concat(manualLottoTickets.getLottoTickets().stream(), autoLottoTickets.getLottoTickets().stream()) - .collect(Collectors.toList()))); - } - - public LottoTicketBundle getUserLottoTickets() { - return userLottoTickets; - } -} diff --git a/src/main/java/lotto/model/LottoTicketBundle.java b/src/main/java/lotto/model/LottoTicketBundle.java index 30c4af2ca9b..0b4335f229a 100644 --- a/src/main/java/lotto/model/LottoTicketBundle.java +++ b/src/main/java/lotto/model/LottoTicketBundle.java @@ -5,6 +5,7 @@ import java.util.Random; import java.util.stream.Collectors; import java.util.stream.IntStream; +import java.util.stream.Stream; public class LottoTicketBundle { private final List lottoTickets; @@ -13,6 +14,11 @@ public LottoTicketBundle(List lottoTickets) { this.lottoTickets = lottoTickets; } + public LottoTicketBundle(LottoTicketBundle manualLottoTickets, LottoTicketBundle autoLottoTickets) { + this(Stream.concat(manualLottoTickets.getLottoTickets().stream(), autoLottoTickets.getLottoTickets().stream()) + .collect(Collectors.toList())); + } + public static LottoTicketBundle create(int payAmount) { int ticketCount = payAmount / LottoTicket.LOTTO_TICKET_PRICE; return new LottoTicketBundle( diff --git a/src/main/java/lotto/service/LottoService.java b/src/main/java/lotto/service/LottoService.java new file mode 100644 index 00000000000..5fe6e864b87 --- /dev/null +++ b/src/main/java/lotto/service/LottoService.java @@ -0,0 +1,14 @@ +package lotto.service; + +import lotto.model.*; + +public class LottoService { + public LottoResult calculateResult(LottoTicketBundle userLottoTikcets, WinningLotto winningLotto) { + LottoResult lottoResult = new LottoResult(); + for (LottoTicket lotto : userLottoTikcets.getLottoTickets()) { + int matchCount = winningLotto.match(lotto); + lottoResult.addRank(LottoRank.valueOf(matchCount, lotto.contains(winningLotto.getBonusNumber()))); + } + return lottoResult; + } +} diff --git a/src/main/java/lotto/view/ResultView.java b/src/main/java/lotto/view/ResultView.java index 1f5e1416a0a..e5a074afc73 100644 --- a/src/main/java/lotto/view/ResultView.java +++ b/src/main/java/lotto/view/ResultView.java @@ -1,8 +1,8 @@ package lotto.view; -import lotto.model.LottoGame; import lotto.model.LottoRank; import lotto.model.LottoResult; +import lotto.model.LottoTicketBundle; import java.util.Arrays; @@ -12,8 +12,8 @@ public void printLottoTicketCounts(int manualLottoTicketCount, int autoLottoTick System.out.printf("수동으로 %s장, 자동으로 %s개를 구매했습니다.\n", manualLottoTicketCount, autoLottoTicketCount); } - public void printUserLottoTickets(LottoGame lottoGame) { - lottoGame.getUserLottoTickets().getLottoTickets().stream() + public void printUserLottoTickets(LottoTicketBundle userLottoTickets) { + userLottoTickets.getLottoTickets().stream() .forEach(lottoTicket -> System.out.println(lottoTicket.getLottoNumbers())); } diff --git a/src/test/java/lotto/model/LottoGameTest.java b/src/test/java/lotto/model/LottoGameTest.java deleted file mode 100644 index 5e5a1332c37..00000000000 --- a/src/test/java/lotto/model/LottoGameTest.java +++ /dev/null @@ -1,24 +0,0 @@ -package lotto.model; - -import org.junit.jupiter.api.DisplayName; -import org.junit.jupiter.api.Test; - -import java.util.Arrays; -import java.util.List; - -class LottoGameTest { - @Test - @DisplayName("당첨 번호 6개를 입력하면 로또 티켓에 숫자가 몇개 일치하는지 반환한다.") - void test1() { -// var lottoTicket1 = new LottoTicket(List.of(1,2 3,4,5,6)); -// var lottoTicket2 = new LottoTicket(List.of(1,2 3,4,5,7)); -// var lottoTicketBundle1 = new LottoTicketBundle(Arrays.asList(lottoTicket1)); -// var lottoTicketBundle2 = new LottoTicketBundle(Arrays.asList(lottoTicket2)); -// LottoGame lottoGame = new LottoGame(lottoTicketBundle1, lottoTicketBundle2); -// -// var winningNumbers = new LottoTicket(List.of(1,2 3,4,5,6)); -// var bounsNumber = LottoNumber.of(7); -// WinningLotto winningLotto = new WinningLotto(winningNumbers, bounsNumber); -// winningLotto.match(lottoTicketBundle1); - } -} \ No newline at end of file From 3379e7b737c7f8de7713f105ff54cb4c28c4cd88 Mon Sep 17 00:00:00 2001 From: Yeongseo Kim Date: Sun, 23 Jun 2024 19:19:23 +0900 Subject: [PATCH 16/19] =?UTF-8?q?refactor:=20inputView=20=EB=A6=AC?= =?UTF-8?q?=ED=8C=A9=ED=86=A0=EB=A7=81?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../lotto/controller/LottoController.java | 6 +-- src/main/java/lotto/view/InputView.java | 39 ++++++++++++------- 2 files changed, 27 insertions(+), 18 deletions(-) diff --git a/src/main/java/lotto/controller/LottoController.java b/src/main/java/lotto/controller/LottoController.java index 3cb39fb8e70..5ef4aeed402 100644 --- a/src/main/java/lotto/controller/LottoController.java +++ b/src/main/java/lotto/controller/LottoController.java @@ -18,11 +18,7 @@ public void run() { int manualLottoTicketCount = inputView.inputManualLottoTicketCount(); inputView.printManualLottoNumbers(); - LottoTicketBundle manualLottoTickets = new LottoTicketBundle( - IntStream.range(0, manualLottoTicketCount) - .mapToObj(i -> new LottoTicket(inputView.inputManualLottoNumbers())) - .collect(Collectors.toList()) - ); + LottoTicketBundle manualLottoTickets = inputView.inputManualLottoNumbers(manualLottoTicketCount); int autoLottoTicketCount = (payAmount-(1000*manualLottoTickets.getLottoTickets().size()))/1000; LottoTicketBundle autoLottoTickets = LottoTicketBundle.create(autoLottoTicketCount*1000); diff --git a/src/main/java/lotto/view/InputView.java b/src/main/java/lotto/view/InputView.java index 723de1da8c2..a71ad566fa7 100644 --- a/src/main/java/lotto/view/InputView.java +++ b/src/main/java/lotto/view/InputView.java @@ -1,21 +1,25 @@ package lotto.view; +import lotto.model.LottoTicket; +import lotto.model.LottoTicketBundle; + import java.util.Arrays; import java.util.List; import java.util.Scanner; import java.util.stream.Collectors; +import java.util.stream.IntStream; public class InputView { private static final Scanner scanner = new Scanner(System.in); public int inputPayAmount() { System.out.println("구입금액을 입력해 주세요."); - return scanner.nextInt(); + return nextIntFromScanner(); } public int inputManualLottoTicketCount() { System.out.println("수동으로 구매할 로또 수를 입력해 주세요."); - return scanner.nextInt(); + return nextIntFromScanner(); } public void printManualLottoNumbers() { @@ -23,23 +27,32 @@ public void printManualLottoNumbers() { System.out.println("수동으로 구매할 번호를 입력해 주세요."); } - public List inputManualLottoNumbers() { - return Arrays.stream(scanner.nextLine().split(",")) - .map(String::trim) - .map(Integer::parseInt) - .collect(Collectors.toList()); - } - public List inputWinningNumbers() { System.out.println("\n지난 주 당첨 번호를 입력해 주세요."); - return Arrays.stream(scanner.nextLine().split(",")) - .map(String::trim) - .map(Integer::parseInt) - .collect(Collectors.toList()); + return readIntegerListFromInput(); } public int inputBonusNumber() { System.out.println("보너스 볼을 입력해 주세요."); + return nextIntFromScanner(); + } + + public LottoTicketBundle inputManualLottoNumbers(int manualLottoTicketCount) { + return new LottoTicketBundle( + IntStream.range(0, manualLottoTicketCount) + .mapToObj(i -> new LottoTicket(readIntegerListFromInput())) + .collect(Collectors.toList()) + ); + } + + private int nextIntFromScanner() { return scanner.nextInt(); } + + private List readIntegerListFromInput() { + return Arrays.stream(scanner.nextLine().split(",")) + .map(String::trim) + .map(Integer::parseInt) + .collect(Collectors.toList()); + } } From a8dc6ae778423636449ea0ca3ca5cc9abdeb64b5 Mon Sep 17 00:00:00 2001 From: Yeongseo Kim Date: Sun, 23 Jun 2024 20:29:31 +0900 Subject: [PATCH 17/19] =?UTF-8?q?fix:=20=EB=A1=9C=EB=98=90=20=EB=93=B1?= =?UTF-8?q?=EC=88=98=20=EA=B3=84=EC=82=B0=20=EB=A1=9C=EC=A7=81=20=EC=88=98?= =?UTF-8?q?=EC=A0=95,=20=EC=88=98=EC=9D=B5=EB=A5=A0=20=EA=B3=84=EC=82=B0?= =?UTF-8?q?=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/model/LottoRank.java | 7 ++++--- src/main/java/lotto/model/LottoResult.java | 3 ++- src/main/java/lotto/model/WinningLotto.java | 4 ++-- src/main/java/lotto/view/ResultView.java | 16 +++++++++++++--- .../java/lotto/model/LottoResultTest.java | 19 +++++++++++++++---- .../java/lotto/model/WinningLottoTest.java | 16 +++++++++++++--- 6 files changed, 49 insertions(+), 16 deletions(-) diff --git a/src/main/java/lotto/model/LottoRank.java b/src/main/java/lotto/model/LottoRank.java index 7a44a4f3825..8d4521dd822 100644 --- a/src/main/java/lotto/model/LottoRank.java +++ b/src/main/java/lotto/model/LottoRank.java @@ -1,10 +1,11 @@ package lotto.model; public enum LottoRank { + BAD(0, 0), THREE(3, 5000), FOUR(4, 50000), FIVE(5, 1500000), - FIVE_BONUS(6, 30000000), + FIVE_BONUS(5, 30000000), SIX(6, 2000000000); private final int matchCount; @@ -24,7 +25,7 @@ public int getWinningPrize() { } public static LottoRank valueOf(int matchCount, boolean hasBonus) { - if (matchCount == 6 && hasBonus) { + if (matchCount == 5 && hasBonus) { return FIVE_BONUS; } for (LottoRank rank : values()) { @@ -32,6 +33,6 @@ public static LottoRank valueOf(int matchCount, boolean hasBonus) { return rank; } } - throw new IllegalArgumentException("일치하는 등수가 없습니다."); + return BAD; } } diff --git a/src/main/java/lotto/model/LottoResult.java b/src/main/java/lotto/model/LottoResult.java index 7671a29a42e..9c7ae88cb83 100644 --- a/src/main/java/lotto/model/LottoResult.java +++ b/src/main/java/lotto/model/LottoResult.java @@ -21,10 +21,11 @@ public int getCount(LottoRank rank) { return resultMap.get(rank); } - public double getProfitRate(int totalTicketCost) { + public double getProfitRate() { int totalWinningPrize = resultMap.entrySet().stream() .mapToInt(entry -> entry.getKey().getWinningPrize() * entry.getValue()) .sum(); + int totalTicketCost = resultMap.values().stream().mapToInt(count -> count * LottoTicket.LOTTO_TICKET_PRICE).sum(); return Math.floor((double) totalWinningPrize / totalTicketCost * 100) / 100; } } diff --git a/src/main/java/lotto/model/WinningLotto.java b/src/main/java/lotto/model/WinningLotto.java index 3cc412e9b9c..083f8af0bb5 100644 --- a/src/main/java/lotto/model/WinningLotto.java +++ b/src/main/java/lotto/model/WinningLotto.java @@ -10,11 +10,11 @@ public WinningLotto(LottoTicket winningLotto, LottoNumber bonusNumber) { } public int match(LottoTicket target) { - int matchCount = winningLotto.countMatchingNumbers(winningLotto); + int matchCount = winningLotto.countMatchingNumbers(target); boolean hasBonus = target.getLottoNumbers().contains(bonusNumber); if (matchCount == 5 && hasBonus) { - return 6; + return 5; } return matchCount; diff --git a/src/main/java/lotto/view/ResultView.java b/src/main/java/lotto/view/ResultView.java index e5a074afc73..0f3d23c62f4 100644 --- a/src/main/java/lotto/view/ResultView.java +++ b/src/main/java/lotto/view/ResultView.java @@ -20,8 +20,18 @@ public void printUserLottoTickets(LottoTicketBundle userLottoTickets) { public void printLottoResult(LottoResult lottoResult, int payAmount) { System.out.println("당첨 통계"); System.out.println("---------"); - Arrays.stream(LottoRank.values()) - .forEach(rank -> System.out.printf("%d개 일치 (%d원)- %d개\n", rank.getMatchCount(), rank.getWinningPrize(), lottoResult.getCount(rank))); - System.out.printf("총 수익률은 %.2f입니다.(기준이 1이기 때문에 결과적으로 손해라는 의미임)\n", lottoResult.getProfitRate(payAmount)); + + Arrays.stream(LottoRank.values()).forEach(rank -> { + String message = buildRankMessage(rank, lottoResult.getCount(rank)); + System.out.println(message); + }); + + System.out.printf("총 수익률은 %.2f입니다.(기준이 1이기 때문에 결과적으로 손해라는 의미임)\n", lottoResult.getProfitRate()); + } + + private String buildRankMessage(LottoRank rank, int count) { + String messageFormat = "%d개 일치%s (%d원)- %d개"; + String bonusPart = rank == LottoRank.FIVE_BONUS ? ", 보너스 볼 일치" : ""; + return String.format(messageFormat, rank.getMatchCount(), bonusPart, rank.getWinningPrize(), count); } } diff --git a/src/test/java/lotto/model/LottoResultTest.java b/src/test/java/lotto/model/LottoResultTest.java index 148e92a63e9..0565dc157c7 100644 --- a/src/test/java/lotto/model/LottoResultTest.java +++ b/src/test/java/lotto/model/LottoResultTest.java @@ -18,14 +18,25 @@ public void test1() { } @Test - @DisplayName("총 수익률을 반환한다.") + @DisplayName("당첨 통계에 낙점된 경우를 추가한다.") public void test2() { var lottoResult = new LottoResult(); - var totalTicketCost = 14000; // 티켓 14개 구입 + lottoResult.addRank(LottoRank.BAD); + assertThat(lottoResult.getCount(LottoRank.BAD)) + .isEqualTo(1); + } + + @Test + @DisplayName("총 수익률을 반환한다.") + public void test3() { + var lottoResult = new LottoResult(); + + // 티켓 2개 구입 lottoResult.addRank(LottoRank.THREE); + lottoResult.addRank(LottoRank.BAD); - assertThat(lottoResult.getProfitRate(totalTicketCost)) - .isEqualTo(0.35); + assertThat(lottoResult.getProfitRate()) + .isEqualTo(2.50); } } \ No newline at end of file diff --git a/src/test/java/lotto/model/WinningLottoTest.java b/src/test/java/lotto/model/WinningLottoTest.java index 2a1ed9a87b8..40d4050d050 100644 --- a/src/test/java/lotto/model/WinningLottoTest.java +++ b/src/test/java/lotto/model/WinningLottoTest.java @@ -10,7 +10,7 @@ class WinningLottoTest { @Test - @DisplayName("당첨 번호 6개를 입력하면 로또 티켓에 숫자가 몇개 일치하는지 반환한다.") + @DisplayName("당첨 번호 6개 중 6개 일치 확인") public void test1() { WinningLotto winningLotto = new WinningLotto(new LottoTicket(List.of(1,2,3,4,5,6)), LottoNumber.of(7)); LottoTicket targetLotto = new LottoTicket(List.of(1,2,3,4,5,6)); @@ -20,12 +20,22 @@ public void test1() { } @Test - @DisplayName("당첨 번호 6개를 입력하면 로또 티켓에 숫자와 보너스볼 일치 개수를 반환한다.") + @DisplayName("당첨 번호 6개 중 3개 일치 확인") public void test2() { + WinningLotto winningLotto = new WinningLotto(new LottoTicket(List.of(1,2,3,4,5,6)), LottoNumber.of(7)); + LottoTicket targetLotto = new LottoTicket(List.of(1,2,3,8,9,10)); + int matchCount = winningLotto.match(targetLotto); + assertThat(matchCount) + .isEqualTo(3); + } + + @Test + @DisplayName("당첨 번호 6개 중 5개 + 보너스 일치 확인") + public void test3() { WinningLotto winningLotto = new WinningLotto(new LottoTicket(List.of(1,2,3,4,5,6)), LottoNumber.of(7)); LottoTicket targetLotto = new LottoTicket(List.of(1,2,3,4,5,7)); int matchCount = winningLotto.match(targetLotto); assertThat(matchCount) - .isEqualTo(6); + .isEqualTo(5); } } \ No newline at end of file From 238069e10dac87e473c3baf2b397928ed5b0668f Mon Sep 17 00:00:00 2001 From: Yeongseo Kim Date: Sun, 23 Jun 2024 20:41:05 +0900 Subject: [PATCH 18/19] =?UTF-8?q?fix:=20=EB=82=99=EC=A0=90=EB=90=9C=20?= =?UTF-8?q?=EA=B2=BD=EC=9A=B0=EB=8A=94=20=EB=8B=B9=EC=B2=A8=20=ED=86=B5?= =?UTF-8?q?=EA=B3=84=EC=97=90=EC=84=9C=20=EC=B6=9C=EB=A0=A5=ED=95=98?= =?UTF-8?q?=EC=A7=80=20=EC=95=8A=EB=8F=84=EB=A1=9D=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/view/ResultView.java | 10 ++++++---- 1 file changed, 6 insertions(+), 4 deletions(-) diff --git a/src/main/java/lotto/view/ResultView.java b/src/main/java/lotto/view/ResultView.java index 0f3d23c62f4..bf6b05c4bf8 100644 --- a/src/main/java/lotto/view/ResultView.java +++ b/src/main/java/lotto/view/ResultView.java @@ -21,10 +21,12 @@ public void printLottoResult(LottoResult lottoResult, int payAmount) { System.out.println("당첨 통계"); System.out.println("---------"); - Arrays.stream(LottoRank.values()).forEach(rank -> { - String message = buildRankMessage(rank, lottoResult.getCount(rank)); - System.out.println(message); - }); + Arrays.stream(LottoRank.values()) + .filter(rank -> rank != LottoRank.BAD) + .forEach(rank -> { + String message = buildRankMessage(rank, lottoResult.getCount(rank)); + System.out.println(message); + }); System.out.printf("총 수익률은 %.2f입니다.(기준이 1이기 때문에 결과적으로 손해라는 의미임)\n", lottoResult.getProfitRate()); } From f60c7ff2c3039c7743b53a486853db2d777ad35e Mon Sep 17 00:00:00 2001 From: Yeongseo Kim Date: Sun, 23 Jun 2024 20:44:50 +0900 Subject: [PATCH 19/19] =?UTF-8?q?refactor:=20LottoController,=20LottoServi?= =?UTF-8?q?ce=20=EB=A6=AC=ED=8C=A9=ED=86=A0=EB=A7=81?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../lotto/controller/LottoController.java | 20 ++++++++++++------- src/main/java/lotto/service/LottoService.java | 6 ++++++ 2 files changed, 19 insertions(+), 7 deletions(-) diff --git a/src/main/java/lotto/controller/LottoController.java b/src/main/java/lotto/controller/LottoController.java index 5ef4aeed402..9ee71c6ac51 100644 --- a/src/main/java/lotto/controller/LottoController.java +++ b/src/main/java/lotto/controller/LottoController.java @@ -5,28 +5,34 @@ import lotto.view.InputView; import lotto.view.ResultView; -import java.util.stream.Collectors; -import java.util.stream.IntStream; - public class LottoController { private final InputView inputView = new InputView(); private final ResultView resultView = new ResultView(); private final LottoService lottoService = new LottoService(); public void run() { + /** 구입금액 입력 */ int payAmount = inputView.inputPayAmount(); + + /** 수동 구매 로또 수 입력 입력 */ int manualLottoTicketCount = inputView.inputManualLottoTicketCount(); + /** 수동 구매할 로또 번호 입력 */ inputView.printManualLottoNumbers(); LottoTicketBundle manualLottoTickets = inputView.inputManualLottoNumbers(manualLottoTicketCount); - int autoLottoTicketCount = (payAmount-(1000*manualLottoTickets.getLottoTickets().size()))/1000; - LottoTicketBundle autoLottoTickets = LottoTicketBundle.create(autoLottoTicketCount*1000); - + /** 자동 구매 로또 생성 */ + LottoTicketBundle autoLottoTickets = lottoService.createAutoLottoTickets(payAmount, manualLottoTicketCount); LottoTicketBundle userLottoTickets = new LottoTicketBundle(manualLottoTickets, autoLottoTickets); - resultView.printLottoTicketCounts(manualLottoTicketCount, autoLottoTicketCount); + + /** 구매한 수동, 자동 로또 티켓 출력 */ + resultView.printLottoTicketCounts(manualLottoTicketCount, autoLottoTickets.getLottoTickets().size()); resultView.printUserLottoTickets(userLottoTickets); + + /** 당첨 번호, 보너스 볼 입력 */ WinningLotto winningLotto = new WinningLotto(new LottoTicket(inputView.inputWinningNumbers()), new LottoNumber(inputView.inputBonusNumber())); + + /** 당첨 통계 출력 */ resultView.printLottoResult(lottoService.calculateResult(userLottoTickets, winningLotto), payAmount); } } diff --git a/src/main/java/lotto/service/LottoService.java b/src/main/java/lotto/service/LottoService.java index 5fe6e864b87..bead3eed009 100644 --- a/src/main/java/lotto/service/LottoService.java +++ b/src/main/java/lotto/service/LottoService.java @@ -11,4 +11,10 @@ public LottoResult calculateResult(LottoTicketBundle userLottoTikcets, WinningLo } return lottoResult; } + + public LottoTicketBundle createAutoLottoTickets(int payAmount, int manualLottoTicketCount) { + int autoLottoTicketCount + = (payAmount - (LottoTicket.LOTTO_TICKET_PRICE * manualLottoTicketCount)) / LottoTicket.LOTTO_TICKET_PRICE; + return LottoTicketBundle.create(autoLottoTicketCount * LottoTicket.LOTTO_TICKET_PRICE); + } }