From fac353fe21f39fb7d678e28266ac3d56533c4912 Mon Sep 17 00:00:00 2001 From: Delf-Lee Date: Sun, 19 Jan 2020 09:08:08 +0900 Subject: [PATCH 1/3] =?UTF-8?q?=EB=B3=B4=EB=84=88=EC=8A=A4=EB=B3=BC=20?= =?UTF-8?q?=EA=B2=80=EC=A6=9D=20=EB=A1=9C=EC=A7=81=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/LottoApplication.java | 5 +++- src/main/java/domain/LottoStatistics.java | 8 +++---- src/main/java/domain/Rank.java | 10 +++++--- src/main/java/domain/lotto/Lotto.java | 18 ++++---------- src/main/java/domain/lotto/WinningLotto.java | 24 +++++++++++++++++++ .../java/domain/provider/LottoSeller.java | 1 - src/main/java/input/InputView.java | 19 ++++++++++----- src/main/java/output/OutputView.java | 10 ++++++-- 8 files changed, 63 insertions(+), 32 deletions(-) create mode 100644 src/main/java/domain/lotto/WinningLotto.java diff --git a/src/main/java/LottoApplication.java b/src/main/java/LottoApplication.java index 8aa16b7..86db10a 100644 --- a/src/main/java/LottoApplication.java +++ b/src/main/java/LottoApplication.java @@ -1,5 +1,7 @@ import domain.lotto.Lotto; import domain.lotto.LottoCollection; +import domain.lotto.LottoNumber; +import domain.lotto.WinningLotto; import domain.money.Money; import domain.provider.LottoSeller; import input.InputView; @@ -15,11 +17,12 @@ public static void main(String[] args) { LottoSeller lottoSeller = new LottoSeller(lottoPrice); Money money = InputView.inputMoney(); + LottoCollection myLotto = lottoSeller.sellTo(money); OutputView.printLotto(myLotto); - Lotto winningLotto = InputView.inputWinningLottoNumber(); + WinningLotto winningLotto = InputView.inputWinningLottoNumber(); LottoStatistics lottoStatistics = new LottoStatistics(winningLotto, myLotto, money); OutputView.showWinningStatistics(lottoStatistics); diff --git a/src/main/java/domain/LottoStatistics.java b/src/main/java/domain/LottoStatistics.java index c10deb7..2fe7744 100644 --- a/src/main/java/domain/LottoStatistics.java +++ b/src/main/java/domain/LottoStatistics.java @@ -2,6 +2,7 @@ import domain.lotto.Lotto; import domain.lotto.LottoCollection; +import domain.lotto.WinningLotto; import domain.money.Money; import java.util.Iterator; @@ -14,7 +15,7 @@ public class LottoStatistics implements Iterable { private Map counter; private Money invest; - public LottoStatistics(Lotto winningLotto, LottoCollection lottoCollection, Money money) { + public LottoStatistics(WinningLotto winningLotto, LottoCollection lottoCollection, Money money) { this.counter = getCounter(winningLotto, lottoCollection); this.invest = money; } @@ -25,13 +26,10 @@ public float getRor() { sum += rank.getProfit(counter.get(rank)); } - System.out.println(invest.getAmount()); return (float) sum / invest.getAmount(); } - private final static Rank[] PRINT_ORDER_RANK = {Rank.FIFTH, Rank.FOURTH, Rank.THIRD, /*Rank.SECOND, */Rank.FIRST}; - - private Map getCounter(Lotto winningLotto, LottoCollection lottoCollection) { + private Map getCounter(WinningLotto winningLotto, LottoCollection lottoCollection) { Map counter = Rank.RANK_COUNTER(); for (Lotto lotto : lottoCollection) { counter.merge(winningLotto.match(lotto), 1, Integer::sum); diff --git a/src/main/java/domain/Rank.java b/src/main/java/domain/Rank.java index bac8cac..bc41986 100644 --- a/src/main/java/domain/Rank.java +++ b/src/main/java/domain/Rank.java @@ -25,12 +25,12 @@ public enum Rank { this.winningMoney = winningMoney; } - public static Rank valueOf(int countOfMatch) { + public static Rank valueOf(int countOfMatch, boolean matchBonus) { if (countOfMatch < WINNING_MIN_COUNT) { return MISS; } - if (SECOND.matchCount(countOfMatch)) { + if (SECOND.matchCount(countOfMatch) && matchBonus) { return SECOND; } @@ -61,6 +61,10 @@ public static Map RANK_COUNTER() { @Override public String toString() { - return String.format("%d개 일치 (%,d원)", countOfMatch, winningMoney); + String note = ""; + if (this == Rank.SECOND) { + note = ", 보너스볼 일치"; + } + return String.format("%d개 일치%s (%,d원)", countOfMatch, note, winningMoney); } } diff --git a/src/main/java/domain/lotto/Lotto.java b/src/main/java/domain/lotto/Lotto.java index e48af70..dda22f6 100644 --- a/src/main/java/domain/lotto/Lotto.java +++ b/src/main/java/domain/lotto/Lotto.java @@ -7,7 +7,7 @@ */ public class Lotto { - private static final int PICK_NUM = 6; + public static final int PICK_NUM = 6; private List lotto; public Lotto(List lotto) { @@ -17,20 +17,11 @@ public Lotto(List lotto) { this.lotto = lotto; } - public Rank match(Lotto userLotto) { - int matchCount = getMatchCount(userLotto); - return Rank.valueOf(matchCount); + public int getMatchCount(Lotto userLotto) { + return (int) lotto.stream().filter(userLotto::contains).count(); } - private int getMatchCount(Lotto userLotto) { - int count = 0; - for (LottoNumber n : this.lotto) { - count += userLotto.contains(n) ? 1 : 0; - } - return count; - } - - private boolean contains(LottoNumber n) { + public boolean contains(LottoNumber n) { return lotto.contains(n); } @@ -38,5 +29,4 @@ private boolean contains(LottoNumber n) { public String toString() { return lotto.toString(); } - } diff --git a/src/main/java/domain/lotto/WinningLotto.java b/src/main/java/domain/lotto/WinningLotto.java new file mode 100644 index 0000000..77626b2 --- /dev/null +++ b/src/main/java/domain/lotto/WinningLotto.java @@ -0,0 +1,24 @@ +package domain.lotto; + +import domain.Rank; + +public class WinningLotto { + private Lotto lotto; + private LottoNumber bonusNumber; + + public WinningLotto(Lotto lotto, LottoNumber bonusNumber) { + this.lotto = lotto; + this.bonusNumber = bonusNumber; + } + + public Rank match(Lotto userLotto) { + int matchCount = lotto.getMatchCount(userLotto); + boolean matchBonus = userLotto.contains(bonusNumber); + return Rank.valueOf(matchCount, matchBonus); + } + + @Override + public String toString() { + return String.format("%s + %s", lotto , bonusNumber); + } +} diff --git a/src/main/java/domain/provider/LottoSeller.java b/src/main/java/domain/provider/LottoSeller.java index 0b0a9c8..72b1080 100644 --- a/src/main/java/domain/provider/LottoSeller.java +++ b/src/main/java/domain/provider/LottoSeller.java @@ -17,7 +17,6 @@ public class LottoSeller { public LottoSeller(Money lottoPrice) { this.lotto = lottoPrice; - } public LottoCollection sellTo(Money money) { diff --git a/src/main/java/input/InputView.java b/src/main/java/input/InputView.java index 535e94d..a4bda33 100644 --- a/src/main/java/input/InputView.java +++ b/src/main/java/input/InputView.java @@ -2,6 +2,7 @@ import domain.lotto.Lotto; import domain.lotto.LottoNumber; +import domain.lotto.WinningLotto; import domain.money.Money; import java.util.Arrays; @@ -12,6 +13,7 @@ public class InputView { private static final String buyGuideText = "구입금액을 입력해 주세요."; private static final String winningGuideText = "지난 주 당첨 번호를 입력해 주세요."; + private static final String bonusNumberGuideText = "보너스 볼을 입력해 주세요."; public static Money inputMoney() { return buyMock(1400000); @@ -19,19 +21,24 @@ public static Money inputMoney() { private static Money buyMock(int n) { System.out.println(buyGuideText); - return new Money(n); + return Money.of(n); } - public static Lotto inputWinningLottoNumber() { + public static WinningLotto inputWinningLottoNumber() { return winningLottoMock(); } - private static Lotto winningLottoMock() { + private static WinningLotto winningLottoMock() { System.out.println(winningGuideText); Lotto lotto = new Lotto(Arrays.asList(LottoNumber.of(1), LottoNumber.of(2), LottoNumber.of(3), LottoNumber.of(4), LottoNumber.of(5), LottoNumber.of(6))); - System.out.println(lotto); + System.out.println("> 입력함"); - return lotto; - } + System.out.println(bonusNumberGuideText); + WinningLotto winningLotto = new WinningLotto(lotto, LottoNumber.of(7)); + System.out.println("> 입력함"); + + System.out.println(" 입력 값: " + winningLotto + "\n"); + return winningLotto; + } } diff --git a/src/main/java/output/OutputView.java b/src/main/java/output/OutputView.java index 4eadbc6..a5508f2 100644 --- a/src/main/java/output/OutputView.java +++ b/src/main/java/output/OutputView.java @@ -1,5 +1,6 @@ package output; +import domain.Rank; import domain.lotto.LottoCollection; import domain.LottoStatistics; @@ -14,10 +15,15 @@ public static void printLotto(LottoCollection lottoCollection) { } public static void showWinningStatistics(LottoStatistics lottoStatistics) { + final Rank[] PRINT_ORDER_RANK = {Rank.FIFTH, Rank.FOURTH, Rank.THIRD, Rank.SECOND, Rank.FIRST}; + System.out.println("당첨 통계" + "\n" + "-------------"); - lottoStatistics.forEach(rank -> System.out.println( + /*lottoStatistics.forEach(rank -> System.out.println( String.format("- %s %s개", rank, lottoStatistics.getCount(rank))) - ); + );*/ + for(Rank rank : PRINT_ORDER_RANK) { + System.out.println(String.format("- %s %s개", rank, lottoStatistics.getCount(rank))); + } System.out.println(String.format("\n총 수익률은 %.2f%%입니다.", lottoStatistics.getRor())); } } From 2d075ca985cdf898b11b0fd2ff1cffd4ab9e8cf9 Mon Sep 17 00:00:00 2001 From: Delf-Lee Date: Sun, 19 Jan 2020 09:08:35 +0900 Subject: [PATCH 2/3] =?UTF-8?q?WinningLotto=20=ED=85=8C=EC=8A=A4=ED=8A=B8?= =?UTF-8?q?=20=EC=BD=94=EB=93=9C=20(=EC=A7=84=ED=96=89=EC=A4=91)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../java/domain/lotto/WinningLottoTest.java | 35 +++++++++++++++++++ 1 file changed, 35 insertions(+) create mode 100644 src/test/java/domain/lotto/WinningLottoTest.java diff --git a/src/test/java/domain/lotto/WinningLottoTest.java b/src/test/java/domain/lotto/WinningLottoTest.java new file mode 100644 index 0000000..29869b4 --- /dev/null +++ b/src/test/java/domain/lotto/WinningLottoTest.java @@ -0,0 +1,35 @@ +package domain.lotto; + +import domain.Rank; +import org.junit.jupiter.api.Test; + +import java.util.Arrays; + +import static java.util.stream.Collectors.toList; +import static org.assertj.core.api.Assertions.assertThat; + +public class WinningLottoTest { + + private final static WinningLotto WINNING_LOTTO = new WinningLotto( + new Lotto(Arrays.asList(LottoNumber.of(1), LottoNumber.of(2), LottoNumber.of(3), LottoNumber.of(4), LottoNumber.of(5), LottoNumber.of(6))), + LottoNumber.of(7) + ); + + @Test + void noMatch() { + final Lotto userLotto = generateLotto(8, 9, 10, 11, 12, 13, 14); + assertThat(WINNING_LOTTO.match(userLotto)).isEqualTo(Rank.MISS); + } + + + @Test + void matchOne() { + final Lotto userLotto = generateLotto(1, 9, 10, 11, 12, 13, 14); + assertThat(WINNING_LOTTO.match(userLotto).name()).isEqualTo(Rank.MISS); + } + + private Lotto generateLotto(int... lottoNumbers) { + return new Lotto(Arrays.stream(lottoNumbers).mapToObj(LottoNumber::of).collect(toList())); + } + +} From eea784273694e5620432207d7bf86982205243ed Mon Sep 17 00:00:00 2001 From: Delf-Lee Date: Sun, 19 Jan 2020 09:08:35 +0900 Subject: [PATCH 3/3] =?UTF-8?q?WinningLotto=20=ED=85=8C=EC=8A=A4=ED=8A=B8?= =?UTF-8?q?=20=EC=BD=94=EB=93=9C=20=EC=9E=91=EC=84=B1?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../java/domain/lotto/WinningLottoTest.java | 60 +++++++++++++++++++ 1 file changed, 60 insertions(+) create mode 100644 src/test/java/domain/lotto/WinningLottoTest.java diff --git a/src/test/java/domain/lotto/WinningLottoTest.java b/src/test/java/domain/lotto/WinningLottoTest.java new file mode 100644 index 0000000..c82cc1f --- /dev/null +++ b/src/test/java/domain/lotto/WinningLottoTest.java @@ -0,0 +1,60 @@ +package domain.lotto; + +import domain.Rank; +import org.junit.jupiter.api.Test; + +import java.util.Arrays; + +import static java.util.stream.Collectors.toList; +import static org.assertj.core.api.Assertions.assertThat; + +public class WinningLottoTest { + + private final static WinningLotto WINNING_LOTTO = new WinningLotto( + new Lotto(Arrays.asList(LottoNumber.of(1), LottoNumber.of(2), LottoNumber.of(3), LottoNumber.of(4), LottoNumber.of(5), LottoNumber.of(6))), + LottoNumber.of(7) + ); + + @Test + void noMatch() { + final Lotto userLotto = generateLotto(8, 9, 10, 11, 12, 13, 14); + assertThat(WINNING_LOTTO.match(userLotto)).isEqualTo(Rank.MISS); + } + + + @Test + void matchThree() { + final Lotto userLotto = generateLotto(1, 2, 3, 11, 12, 13); + assertThat(WINNING_LOTTO.match(userLotto)).isEqualTo(Rank.FIFTH); + } + + @Test + void matchFour() { + final Lotto userLotto = generateLotto(1, 2, 3, 4, 12, 13); + assertThat(WINNING_LOTTO.match(userLotto)).isEqualTo(Rank.FOURTH); + } + + @Test + void matchFive() { + final Lotto userLotto = generateLotto(1, 2, 3, 4, 5, 13); + assertThat(WINNING_LOTTO.match(userLotto)).isEqualTo(Rank.THIRD); + } + + @Test + void matchSix() { + final Lotto userLotto = generateLotto(1, 2, 3, 4, 5, 6); + assertThat(WINNING_LOTTO.match(userLotto)).isEqualTo(Rank.FIRST); + } + + @Test + void matchFiveAndBonus() { + final Lotto userLotto = generateLotto(1, 2, 3, 4, 5, 7, 14); + assertThat(WINNING_LOTTO.match(userLotto)).isEqualTo(Rank.SECOND); + } + + + private Lotto generateLotto(int... lottoNumbers) { + return new Lotto(Arrays.stream(lottoNumbers).mapToObj(LottoNumber::of).collect(toList())); + } + +}