From 3fa5d556e503702355b9edcce94da3c546e5bac1 Mon Sep 17 00:00:00 2001 From: ichangyu Date: Fri, 2 Apr 2021 12:17:46 +0900 Subject: [PATCH 1/2] =?UTF-8?q?feat:=20=EB=A1=9C=EB=98=90=201=EB=8B=A8?= =?UTF-8?q?=EA=B3=84-=EC=9E=90=EB=8F=99=EB=AF=B8=EC=85=98=20=EC=A0=9C?= =?UTF-8?q?=EC=B6=9C?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/main/java/LottoApplication.java | 51 ++++++++++++++ src/main/java/domain/EnumWinningStatus.java | 59 ++++++++++++++++ src/main/java/domain/LottoFactory.java | 23 +++++++ src/main/java/domain/LottoMachine.java | 68 +++++++++++++++++++ src/main/java/domain/Profit.java | 21 ++++++ src/main/java/domain/WinningStatus.java | 31 +++++++++ src/main/java/{ => domain}/empty.txt | 0 .../NotValidLottoLengthException.java | 9 +++ .../LastWeekWinningBonusBall.java | 13 ++++ .../LastWeekWinningLotto.java | 18 +++++ src/main/java/domain/lottoticket/Lotto.java | 7 ++ .../java/domain/lottoticket/LottoTicket.java | 25 +++++++ src/main/java/domain/lottoticket/Lottos.java | 15 ++++ .../lottoticket/NumberOfLottoTicket.java | 25 +++++++ .../LottoWinningBonusBallResult.java | 15 ++++ .../LottoWinningResult.java | 15 ++++ .../strategy/RandomLottoNumberStrategy.java | 33 +++++++++ src/main/java/ui/Printer.java | 42 ++++++++++++ src/main/java/ui/Receiver.java | 36 ++++++++++ 19 files changed, 506 insertions(+) create mode 100644 src/main/java/LottoApplication.java create mode 100644 src/main/java/domain/EnumWinningStatus.java create mode 100644 src/main/java/domain/LottoFactory.java create mode 100644 src/main/java/domain/LottoMachine.java create mode 100644 src/main/java/domain/Profit.java create mode 100644 src/main/java/domain/WinningStatus.java rename src/main/java/{ => domain}/empty.txt (100%) create mode 100644 src/main/java/domain/exception/NotValidLottoLengthException.java create mode 100644 src/main/java/domain/lastweekwinninglotto/LastWeekWinningBonusBall.java create mode 100644 src/main/java/domain/lastweekwinninglotto/LastWeekWinningLotto.java create mode 100644 src/main/java/domain/lottoticket/Lotto.java create mode 100644 src/main/java/domain/lottoticket/LottoTicket.java create mode 100644 src/main/java/domain/lottoticket/Lottos.java create mode 100644 src/main/java/domain/lottoticket/NumberOfLottoTicket.java create mode 100644 src/main/java/domain/lottowinningresult/LottoWinningBonusBallResult.java create mode 100644 src/main/java/domain/lottowinningresult/LottoWinningResult.java create mode 100644 src/main/java/domain/strategy/RandomLottoNumberStrategy.java create mode 100644 src/main/java/ui/Printer.java create mode 100644 src/main/java/ui/Receiver.java diff --git a/src/main/java/LottoApplication.java b/src/main/java/LottoApplication.java new file mode 100644 index 0000000..fdfe006 --- /dev/null +++ b/src/main/java/LottoApplication.java @@ -0,0 +1,51 @@ +import domain.LottoMachine; +import domain.Profit; +import domain.WinningStatus; +import domain.lastweekwinninglotto.LastWeekWinningBonusBall; +import domain.lastweekwinninglotto.LastWeekWinningLotto; +import domain.lottoticket.LottoTicket; +import domain.lottoticket.Lottos; +import domain.lottoticket.NumberOfLottoTicket; +import domain.strategy.RandomLottoNumberStrategy; +import ui.Printer; +import ui.Receiver; + +import java.util.ArrayList; +import java.util.List; + +public class LottoApplication { + private final Printer printer = new Printer(); + private final Receiver receiver = new Receiver(); + private static LottoMachine lottoMachine = new LottoMachine(); + private final RandomLottoNumberStrategy randomLottoNumberStrategy = new RandomLottoNumberStrategy(); + + public void run() { + printer.requestPurchaseAmount(); + NumberOfLottoTicket numberOfLottoTicket = new NumberOfLottoTicket(receiver.receiveLottoTotalAmount()); + Lottos lottos = makeLottos(numberOfLottoTicket); + printer.printAllLotto(lottos); + printer.requestLastWeekLottoWinningNumber(); + List LastWeekLottoWinningNumbers = receiver.receiveLastWeekLottoWinningNumbers(); + LastWeekWinningLotto lastWeekWinningLotto = new LastWeekWinningLotto(LastWeekLottoWinningNumbers); + printer.requestLottoBonusBallNumber(); + LastWeekWinningBonusBall lastWeekWinningBonusBall = new LastWeekWinningBonusBall(receiver.receiveLottoBonusBallNumber()); + ArrayList getLottoPrices = lottoMachine.Discriminator(lottos, lastWeekWinningLotto, lastWeekWinningBonusBall, numberOfLottoTicket); + Profit profit = new Profit(getLottoPrices); + printer.printLottoProfit(profit.getCalculatedProfit(numberOfLottoTicket)); + } + + private Lottos makeLottos(NumberOfLottoTicket numberOfLottoTicket) { + ArrayList lottoDummy = new ArrayList<>(); + for (int i = 0; i < numberOfLottoTicket.getNumberOfLottoTicket(); i++) { + LottoTicket lotto = new LottoTicket(randomLottoNumberStrategy.getRandomLottoNumbers()); + lottoDummy.add(lotto); + } + Lottos lottos = new Lottos(lottoDummy); + return lottos; + } + + public static void main(String[] args) { + LottoApplication app = new LottoApplication(); + app.run(); + } +} \ No newline at end of file diff --git a/src/main/java/domain/EnumWinningStatus.java b/src/main/java/domain/EnumWinningStatus.java new file mode 100644 index 0000000..671fe6e --- /dev/null +++ b/src/main/java/domain/EnumWinningStatus.java @@ -0,0 +1,59 @@ +package domain; + +import domain.lottoticket.NumberOfLottoTicket; +import domain.lottowinningresult.LottoWinningBonusBallResult; +import domain.lottowinningresult.LottoWinningResult; +import ui.Printer; + +import java.util.ArrayList; +import java.util.HashMap; +import java.util.Map; + +public class EnumWinningStatus { + private static final int NOT_MATCH_LOTTO = 0; + private ArrayList lottoPrices = new ArrayList<>(); + private Map mappingLottoWithBonusBall = new HashMap<>(); + private Printer printer = new Printer(); + + public ArrayList getLottoPrices(LottoFactory lottoFactory, NumberOfLottoTicket numberOfLottoTicket){ + LottoWinningResult lottoWinningResults = lottoFactory.getLottoWinningResult(); + LottoWinningBonusBallResult lottoWinningBonusBallResult = lottoFactory.getLottoWinningBonusBallResult(); + + for (int i = 0; i < numberOfLottoTicket.getNumberOfLottoTicket(); i++) { + int lottoMatchedNumber = lottoWinningResults.getLottoWinningResult().get(i); + Boolean lottoBonusBallNumber = lottoWinningBonusBallResult.getLottoWinningBonusBallResult().get(i); + getWinningLottoTicketPrices(lottoMatchedNumber, lottoBonusBallNumber); + } + printer.printAllMatchedLottoResult(getMappingLottoWithBonusBall()); + return lottoPrices; + } + + private void getWinningLottoTicketPrices(int lottoMatchedNumber, boolean lottoBonusBallNumber) { + for(WinningStatus winningStatus: WinningStatus.values()){ + int matchedWinningNumberCount = winningStatus.getMatchCount(); + boolean isMatchedBonusBallCount = winningStatus.hasBonusBall(); + makeWinningLottoTicket(lottoMatchedNumber, matchedWinningNumberCount, isMatchedBonusBallCount, lottoBonusBallNumber, winningStatus); + } + } + + private void makeWinningLottoTicket( + int lottoMatchedNumber, + int matchedWinningNumberCount, + boolean isMatchedBonusBallCount, + boolean lottoBonusBallNumber, + WinningStatus winningStatus + ){ + if((lottoMatchedNumber == matchedWinningNumberCount) && (isMatchedBonusBallCount == lottoBonusBallNumber)){ + lottoPrices.add(winningStatus); + } + } + + private Map getMappingLottoWithBonusBall() { + for (WinningStatus key: lottoPrices + ) { + mappingLottoWithBonusBall.put(key, mappingLottoWithBonusBall.getOrDefault(key, 0)+1); + } + return mappingLottoWithBonusBall; + } + +} \ No newline at end of file diff --git a/src/main/java/domain/LottoFactory.java b/src/main/java/domain/LottoFactory.java new file mode 100644 index 0000000..fb17f23 --- /dev/null +++ b/src/main/java/domain/LottoFactory.java @@ -0,0 +1,23 @@ +package domain; + +import domain.lottowinningresult.LottoWinningBonusBallResult; +import domain.lottowinningresult.LottoWinningResult; + +public class LottoFactory { + private LottoWinningResult lottoWinningResult; + private LottoWinningBonusBallResult lottoWinningBonusBallResult; + + public LottoFactory(LottoWinningResult lottoWinningResults, LottoWinningBonusBallResult lottoWinningBonusBallResults){ + this.lottoWinningResult = lottoWinningResults; + this.lottoWinningBonusBallResult = lottoWinningBonusBallResults; + } + + public LottoWinningResult getLottoWinningResult(){ + return this.lottoWinningResult; + } + + public LottoWinningBonusBallResult getLottoWinningBonusBallResult(){ + return this.lottoWinningBonusBallResult; + } + +} diff --git a/src/main/java/domain/LottoMachine.java b/src/main/java/domain/LottoMachine.java new file mode 100644 index 0000000..bcce726 --- /dev/null +++ b/src/main/java/domain/LottoMachine.java @@ -0,0 +1,68 @@ +package domain; + +import domain.lastweekwinninglotto.LastWeekWinningBonusBall; +import domain.lastweekwinninglotto.LastWeekWinningLotto; +import domain.lottoticket.LottoTicket; +import domain.lottoticket.Lottos; +import domain.lottoticket.NumberOfLottoTicket; +import domain.lottowinningresult.LottoWinningBonusBallResult; +import domain.lottowinningresult.LottoWinningResult; + +import java.util.ArrayList; +import java.util.List; + +public class LottoMachine { + EnumWinningStatus enumWinningStatus = new EnumWinningStatus(); + ArrayList lottoWinningResults = new ArrayList<>(); + ArrayList lottoWinningBonusBallResults = new ArrayList<>(); + + public ArrayList Discriminator( + Lottos lottos, + LastWeekWinningLotto lastWeekWinningLotto, + LastWeekWinningBonusBall lastWeekWinningBonusBall, + NumberOfLottoTicket numberOfLottoTicket + ){ + for (LottoTicket lotto : lottos.getLottos()) + { + List lottoMatchedResult = getMatchLottoNumber(lotto, lastWeekWinningLotto); + Boolean lottoMatchedBonusBallResult = getMatchLottoBonusBallNumber(lotto, lastWeekWinningBonusBall); + int matchLottoNumberCount = getMatchLottoNumberCount(lottoMatchedResult); + lottoWinningResults.add(matchLottoNumberCount); + lottoWinningBonusBallResults.add(lottoMatchedBonusBallResult); + } + LottoFactory lottoFactory = createLottoFactory(lottoWinningResults, lottoWinningBonusBallResults); + return enumWinningStatus.getLottoPrices(lottoFactory, numberOfLottoTicket); + } + + private LottoFactory createLottoFactory(ArrayList lottoWinningResults, ArrayList lottoWinningBonusBallResults) { + LottoWinningBonusBallResult lottoWinningBonusBallResult = new LottoWinningBonusBallResult(lottoWinningBonusBallResults); + LottoWinningResult winningResult = new LottoWinningResult(lottoWinningResults); + + LottoFactory lottoFactory = new LottoFactory(winningResult, lottoWinningBonusBallResult); + return lottoFactory; + } + + private int getMatchLottoNumberCount(List lottoMatchedResult){ + return (int) lottoMatchedResult.stream().filter(index-> (index)).count(); + } + + private List getMatchLottoNumber(LottoTicket lotto, LastWeekWinningLotto lastWeekWinningLotto){ + List lottoList = lotto.getLotto(); + List lastWeekWinningLottos = lastWeekWinningLotto.getLotto(); + ArrayList lottoMatchedResult = new ArrayList<>(); + + for (int winningLottoNumber = 0; winningLottoNumber < lastWeekWinningLottos.size(); winningLottoNumber++) { + Boolean isMatchLottoNumber = lottoList.contains(lastWeekWinningLottos.get(winningLottoNumber)); + lottoMatchedResult.add(isMatchLottoNumber); + } + return lottoMatchedResult; + } + + private Boolean getMatchLottoBonusBallNumber(LottoTicket lotto, LastWeekWinningBonusBall lastWeekWinningBonusBall) { + List lottoBonusBalls = lotto.getLotto(); + int lastWeekWinningBonusBalls = lastWeekWinningBonusBall.getLastWeekWinningBonusBall(); + Boolean isMatchLottoNumber = lottoBonusBalls.contains(lastWeekWinningBonusBalls); + return isMatchLottoNumber; + + } +} \ No newline at end of file diff --git a/src/main/java/domain/Profit.java b/src/main/java/domain/Profit.java new file mode 100644 index 0000000..dcf305b --- /dev/null +++ b/src/main/java/domain/Profit.java @@ -0,0 +1,21 @@ +package domain; + +import domain.lottoticket.NumberOfLottoTicket; + +import java.util.List; + +public class Profit { + private static int totalLottoPrice; + public Profit(List lottoPrices) { + int sumLottoPrices = sumLottoPrices(lottoPrices); + totalLottoPrice = sumLottoPrices; + } + + private int sumLottoPrices(List lottoPrices){ + return lottoPrices.stream().mapToInt(WinningStatus::getWinningMoney).sum(); + } + + public float getCalculatedProfit(NumberOfLottoTicket numberOfLottoTicket) { + return (float) totalLottoPrice / numberOfLottoTicket.getMoney(); + } +} \ No newline at end of file diff --git a/src/main/java/domain/WinningStatus.java b/src/main/java/domain/WinningStatus.java new file mode 100644 index 0000000..0c4d1e7 --- /dev/null +++ b/src/main/java/domain/WinningStatus.java @@ -0,0 +1,31 @@ +package domain; + +public enum WinningStatus { + SIX_MATCH(6, false, 2000000000), + FIVE_MATCH_WITH_BONUS_BALL(5, true, 30000000), + FIVE_MATCH(5, false, 1500000), + FOUR_MATCH(4, false, 50000), + THREE_MATCH(3, false, 5000); + + private final int matchCount; + private final int winningMoney; + private final boolean BonusBall; + + WinningStatus(int matchCount, boolean BonusBall, int winningMoney){ + this.matchCount = matchCount; + this.winningMoney = winningMoney; + this.BonusBall = BonusBall; + } + + public int getMatchCount() { + return this.matchCount; + } + + public boolean hasBonusBall() { + return this.BonusBall; + } + + public int getWinningMoney() { + return this.winningMoney; + } +} \ No newline at end of file diff --git a/src/main/java/empty.txt b/src/main/java/domain/empty.txt similarity index 100% rename from src/main/java/empty.txt rename to src/main/java/domain/empty.txt diff --git a/src/main/java/domain/exception/NotValidLottoLengthException.java b/src/main/java/domain/exception/NotValidLottoLengthException.java new file mode 100644 index 0000000..19e90ac --- /dev/null +++ b/src/main/java/domain/exception/NotValidLottoLengthException.java @@ -0,0 +1,9 @@ +package domain.exception; + +public class NotValidLottoLengthException extends RuntimeException { + private static final String MESSAGE = "번호는 6개를 입력해야 합니다."; + + public NotValidLottoLengthException() { + super(MESSAGE); + } +} \ No newline at end of file diff --git a/src/main/java/domain/lastweekwinninglotto/LastWeekWinningBonusBall.java b/src/main/java/domain/lastweekwinninglotto/LastWeekWinningBonusBall.java new file mode 100644 index 0000000..7599b48 --- /dev/null +++ b/src/main/java/domain/lastweekwinninglotto/LastWeekWinningBonusBall.java @@ -0,0 +1,13 @@ +package domain.lastweekwinninglotto; + +public class LastWeekWinningBonusBall { + + private final int bonusBall; + public LastWeekWinningBonusBall(int bonusBall){ + this.bonusBall = bonusBall; + } + + public int getLastWeekWinningBonusBall(){ + return this.bonusBall; + } +} \ No newline at end of file diff --git a/src/main/java/domain/lastweekwinninglotto/LastWeekWinningLotto.java b/src/main/java/domain/lastweekwinninglotto/LastWeekWinningLotto.java new file mode 100644 index 0000000..742d857 --- /dev/null +++ b/src/main/java/domain/lastweekwinninglotto/LastWeekWinningLotto.java @@ -0,0 +1,18 @@ +package domain.lastweekwinninglotto; + +import domain.lottoticket.Lotto; + +import java.util.List; + +public class LastWeekWinningLotto implements Lotto { + private final List winningLotto; + + public LastWeekWinningLotto(List winningLotto){ + this.winningLotto = winningLotto; + } + + @Override + public List getLotto(){ + return this.winningLotto; + } +} \ No newline at end of file diff --git a/src/main/java/domain/lottoticket/Lotto.java b/src/main/java/domain/lottoticket/Lotto.java new file mode 100644 index 0000000..e6c49a4 --- /dev/null +++ b/src/main/java/domain/lottoticket/Lotto.java @@ -0,0 +1,7 @@ +package domain.lottoticket; + +import java.util.List; + +public interface Lotto { + public List getLotto(); +} \ No newline at end of file diff --git a/src/main/java/domain/lottoticket/LottoTicket.java b/src/main/java/domain/lottoticket/LottoTicket.java new file mode 100644 index 0000000..1e4e5a8 --- /dev/null +++ b/src/main/java/domain/lottoticket/LottoTicket.java @@ -0,0 +1,25 @@ +package domain.lottoticket; + +import domain.exception.*; +import java.util.List; + +public class LottoTicket implements Lotto{ + private static final int LOTTO_NUMBER_COUNT = 6; + private final List numbers; + + public LottoTicket(List numbers ) { + checkLottoLength(numbers); + this.numbers = numbers; + } + + private void checkLottoLength(List numbers){ + if(numbers.size() !=LOTTO_NUMBER_COUNT){ + throw new NotValidLottoLengthException(); + } + } + @Override + public List getLotto(){ + return this.numbers; + } + +} \ No newline at end of file diff --git a/src/main/java/domain/lottoticket/Lottos.java b/src/main/java/domain/lottoticket/Lottos.java new file mode 100644 index 0000000..2ce7ded --- /dev/null +++ b/src/main/java/domain/lottoticket/Lottos.java @@ -0,0 +1,15 @@ +package domain.lottoticket; + +import java.util.List; + +public class Lottos { + private final List lotto; + + public Lottos(List lotto ) { + this.lotto = lotto; + } + + public List getLottos() { + return this.lotto; + } +} \ No newline at end of file diff --git a/src/main/java/domain/lottoticket/NumberOfLottoTicket.java b/src/main/java/domain/lottoticket/NumberOfLottoTicket.java new file mode 100644 index 0000000..74f3b4f --- /dev/null +++ b/src/main/java/domain/lottoticket/NumberOfLottoTicket.java @@ -0,0 +1,25 @@ +package domain.lottoticket; + +public class NumberOfLottoTicket { + private final static int LOTTO_PRICE = 1000; + private final int tickets; + private final int money; + + public NumberOfLottoTicket(int money) { + this.tickets = setNumberOfLottoTickets(money); + this.money = money; + } + + // naming 바꾸기 + private int setNumberOfLottoTickets(int money) { + return money / LOTTO_PRICE; + } + + public int getNumberOfLottoTicket() { + return this.tickets; + } + + public int getMoney() { + return this.money; + } +} \ No newline at end of file diff --git a/src/main/java/domain/lottowinningresult/LottoWinningBonusBallResult.java b/src/main/java/domain/lottowinningresult/LottoWinningBonusBallResult.java new file mode 100644 index 0000000..7ae7ef3 --- /dev/null +++ b/src/main/java/domain/lottowinningresult/LottoWinningBonusBallResult.java @@ -0,0 +1,15 @@ +package domain.lottowinningresult; + +import java.util.List; + +public class LottoWinningBonusBallResult { + private final List LottoWinningBonusBall; + + public LottoWinningBonusBallResult(List LottoWinningBonusBall) { + this.LottoWinningBonusBall = LottoWinningBonusBall; + } + + public List getLottoWinningBonusBallResult(){ + return this.LottoWinningBonusBall; + } +} diff --git a/src/main/java/domain/lottowinningresult/LottoWinningResult.java b/src/main/java/domain/lottowinningresult/LottoWinningResult.java new file mode 100644 index 0000000..4165c08 --- /dev/null +++ b/src/main/java/domain/lottowinningresult/LottoWinningResult.java @@ -0,0 +1,15 @@ +package domain.lottowinningresult; + +import java.util.List; + +public class LottoWinningResult { + private final List lottoWinning; + public LottoWinningResult(List lottoWinning) { + this.lottoWinning = lottoWinning; + } + + public List getLottoWinningResult() { + return this.lottoWinning; + + } +} diff --git a/src/main/java/domain/strategy/RandomLottoNumberStrategy.java b/src/main/java/domain/strategy/RandomLottoNumberStrategy.java new file mode 100644 index 0000000..9700e52 --- /dev/null +++ b/src/main/java/domain/strategy/RandomLottoNumberStrategy.java @@ -0,0 +1,33 @@ +package domain.strategy; + +import java.util.ArrayList; +import java.util.Collections; +import java.util.List; +import java.util.Random; + +public class RandomLottoNumberStrategy { + private final static int UPPER_BOUND = 45; + private final static int LOWER_BOUND = 1; + private final static int LOTTO_NUMBER_COUNT = 6; + + public List getRandomLottoNumbers(){ + List lottoNumberRange = setLottoNumberRange(); + return getLottoNumbers(lottoNumberRange); + } + + private List setLottoNumberRange(){ + ArrayList lottoNumberIndex = new ArrayList<>(); + for (int lottoNumber = LOWER_BOUND; lottoNumber < UPPER_BOUND; lottoNumber++) { + lottoNumberIndex.add(lottoNumber); + } + return lottoNumberIndex; + } + + private List getLottoNumbers(List lottoNumberRange){ + Collections.shuffle(lottoNumberRange); + List collectedNumbers = lottoNumberRange.subList(0,LOTTO_NUMBER_COUNT); + Collections.sort(collectedNumbers); + return collectedNumbers; + } + +} \ No newline at end of file diff --git a/src/main/java/ui/Printer.java b/src/main/java/ui/Printer.java new file mode 100644 index 0000000..bbd09fb --- /dev/null +++ b/src/main/java/ui/Printer.java @@ -0,0 +1,42 @@ +package ui; + +import domain.WinningStatus; +import domain.lottoticket.LottoTicket; +import domain.lottoticket.Lottos; + +import java.util.*; + +public class Printer { + private static final String REQUEST_PURCHASE_AMOUNT_MESSAGE = "구입금액을 입력해 주세요."; + private static final String REQUEST_LAST_WEEK_LOTTO_WINNING_NUMBER_MESSAGE = "지난 주 당첨 번호를 입력해 주세요."; + private static final String REQUEST_LOTTO_BONUS_BALL_NUMBER_MESSAGE = "보너스 볼을 입력해주세요"; + private static final String PRINT_FINAL_MATCHED_LOTTO_RESULT_MESSAGE = "%s개 일치 (%s원)- %s개"; + private static final String PRINT_LOTTO_PROFIT_MESSAGE = "총 수익률은 %f입니다."; + public void requestPurchaseAmount() { + System.out.println(REQUEST_PURCHASE_AMOUNT_MESSAGE); + } + public void requestLastWeekLottoWinningNumber() { + System.out.println(REQUEST_LAST_WEEK_LOTTO_WINNING_NUMBER_MESSAGE); + } + public void requestLottoBonusBallNumber() { + System.out.println(REQUEST_LOTTO_BONUS_BALL_NUMBER_MESSAGE); + } + public void printAllLotto(Lottos lottos){ + for (LottoTicket lotto : lottos.getLottos()) { + System.out.println(lotto.getLotto()); + } + } + + public void printAllMatchedLottoResult(Map lottoPrices) { + List keySet = new ArrayList(lottoPrices.keySet()); + keySet.sort(Comparator.comparingInt(WinningStatus::getWinningMoney)); + + for(WinningStatus key: keySet) { + System.out.println(String.format(PRINT_FINAL_MATCHED_LOTTO_RESULT_MESSAGE, key.getMatchCount(), key.getWinningMoney(), lottoPrices.get(key))); + } + } + + public void printLottoProfit(float calculatedProfit) { + System.out.println(String.format(PRINT_LOTTO_PROFIT_MESSAGE, calculatedProfit)); + } +} \ No newline at end of file diff --git a/src/main/java/ui/Receiver.java b/src/main/java/ui/Receiver.java new file mode 100644 index 0000000..04a600c --- /dev/null +++ b/src/main/java/ui/Receiver.java @@ -0,0 +1,36 @@ +package ui; + +import java.util.Arrays; +import java.util.List; +import java.util.Scanner; +import java.util.stream.Collectors; + +public class Receiver { + private static final Scanner scanner = new Scanner(System.in); + private static final String DELIMITER = ","; + + public int receiveLottoTotalAmount() { + int lottoTotalAmount = scanner.nextInt(); + return lottoTotalAmount; + } + + public int receiveLottoBonusBallNumber() { + int lottoBonusBallNumber = scanner.nextInt(); + return lottoBonusBallNumber; + } + + public List receiveLastWeekLottoWinningNumbers() { + String lastWeekLottoWinningNumbers = scanner.next(); + List dividedLastWeekLottoWinningNumbers = splitInputLine(lastWeekLottoWinningNumbers); + return convertStringToInt(dividedLastWeekLottoWinningNumbers); + } + + private List splitInputLine(String line) { + return Arrays.asList(line.split(DELIMITER)); + } + + private List convertStringToInt(List dividedLastWeekLottoWinningNumbers) { + return dividedLastWeekLottoWinningNumbers.stream().map(Integer::parseInt).collect(Collectors.toList()); + + } +} From c55fa2ba0035a85ae12bb397bfb9ab28cd2767f3 Mon Sep 17 00:00:00 2001 From: ichangyu Date: Thu, 8 Apr 2021 23:57:39 +0900 Subject: [PATCH 2/2] =?UTF-8?q?refactor:=201=EC=B0=A8=20=EB=AF=B8=EC=85=98?= =?UTF-8?q?=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/LottoApplication.java | 8 ++- src/main/java/domain/EnumWinningStatus.java | 6 +- src/main/java/domain/LottoMachine.java | 2 +- src/main/java/domain/Profit.java | 27 ++++++-- .../java/domain/lottoticket/LottoTicket.java | 2 +- .../strategy/RandomLottoNumberStrategy.java | 6 +- src/main/java/ui/Printer.java | 64 +++++++++++++++++-- src/main/java/ui/Receiver.java | 1 - 8 files changed, 92 insertions(+), 24 deletions(-) diff --git a/src/main/java/LottoApplication.java b/src/main/java/LottoApplication.java index fdfe006..9ef73eb 100644 --- a/src/main/java/LottoApplication.java +++ b/src/main/java/LottoApplication.java @@ -24,14 +24,18 @@ public void run() { NumberOfLottoTicket numberOfLottoTicket = new NumberOfLottoTicket(receiver.receiveLottoTotalAmount()); Lottos lottos = makeLottos(numberOfLottoTicket); printer.printAllLotto(lottos); + printer.requestLastWeekLottoWinningNumber(); List LastWeekLottoWinningNumbers = receiver.receiveLastWeekLottoWinningNumbers(); LastWeekWinningLotto lastWeekWinningLotto = new LastWeekWinningLotto(LastWeekLottoWinningNumbers); + printer.requestLottoBonusBallNumber(); LastWeekWinningBonusBall lastWeekWinningBonusBall = new LastWeekWinningBonusBall(receiver.receiveLottoBonusBallNumber()); ArrayList getLottoPrices = lottoMachine.Discriminator(lottos, lastWeekWinningLotto, lastWeekWinningBonusBall, numberOfLottoTicket); - Profit profit = new Profit(getLottoPrices); - printer.printLottoProfit(profit.getCalculatedProfit(numberOfLottoTicket)); + Profit profit = new Profit(getLottoPrices, numberOfLottoTicket); + + printer.printLottoProfit(profit.getProfit()); + printer.printIsLottoProfit(profit.isProfit()); } private Lottos makeLottos(NumberOfLottoTicket numberOfLottoTicket) { diff --git a/src/main/java/domain/EnumWinningStatus.java b/src/main/java/domain/EnumWinningStatus.java index 671fe6e..1b4829c 100644 --- a/src/main/java/domain/EnumWinningStatus.java +++ b/src/main/java/domain/EnumWinningStatus.java @@ -24,7 +24,8 @@ public ArrayList getLottoPrices(LottoFactory lottoFactory, Number Boolean lottoBonusBallNumber = lottoWinningBonusBallResult.getLottoWinningBonusBallResult().get(i); getWinningLottoTicketPrices(lottoMatchedNumber, lottoBonusBallNumber); } - printer.printAllMatchedLottoResult(getMappingLottoWithBonusBall()); + printer.printWinningStatistics(); + printer.printAllMatchedLottoResults(getMappingLottoWithBonusBall()); return lottoPrices; } @@ -49,8 +50,7 @@ private void makeWinningLottoTicket( } private Map getMappingLottoWithBonusBall() { - for (WinningStatus key: lottoPrices - ) { + for (WinningStatus key: lottoPrices) { mappingLottoWithBonusBall.put(key, mappingLottoWithBonusBall.getOrDefault(key, 0)+1); } return mappingLottoWithBonusBall; diff --git a/src/main/java/domain/LottoMachine.java b/src/main/java/domain/LottoMachine.java index bcce726..2212969 100644 --- a/src/main/java/domain/LottoMachine.java +++ b/src/main/java/domain/LottoMachine.java @@ -43,7 +43,7 @@ private LottoFactory createLottoFactory(ArrayList lottoWinningResults, } private int getMatchLottoNumberCount(List lottoMatchedResult){ - return (int) lottoMatchedResult.stream().filter(index-> (index)).count(); + return (int)lottoMatchedResult.stream().filter(index-> (index)).count(); } private List getMatchLottoNumber(LottoTicket lotto, LastWeekWinningLotto lastWeekWinningLotto){ diff --git a/src/main/java/domain/Profit.java b/src/main/java/domain/Profit.java index dcf305b..a983e81 100644 --- a/src/main/java/domain/Profit.java +++ b/src/main/java/domain/Profit.java @@ -5,17 +5,32 @@ import java.util.List; public class Profit { - private static int totalLottoPrice; - public Profit(List lottoPrices) { - int sumLottoPrices = sumLottoPrices(lottoPrices); - totalLottoPrice = sumLottoPrices; + private static final int PROFIT_THRESHOLD = 1; + private static int sumLottoPrices; + private static NumberOfLottoTicket numberOfLottoTicket; + private static float calculatedProfit; + public Profit(List lottoPrices, NumberOfLottoTicket numberOfLottoTicket) { + this.sumLottoPrices = sumLottoPrices(lottoPrices); + this.numberOfLottoTicket = numberOfLottoTicket; + this.calculatedProfit = CalculatedProfit(); } private int sumLottoPrices(List lottoPrices){ return lottoPrices.stream().mapToInt(WinningStatus::getWinningMoney).sum(); } - public float getCalculatedProfit(NumberOfLottoTicket numberOfLottoTicket) { - return (float) totalLottoPrice / numberOfLottoTicket.getMoney(); + private float CalculatedProfit() { + return (float)sumLottoPrices / numberOfLottoTicket.getMoney(); + } + + public boolean isProfit() { + if (calculatedProfit numbers; - public LottoTicket(List numbers ) { + public LottoTicket(List numbers) { checkLottoLength(numbers); this.numbers = numbers; } diff --git a/src/main/java/domain/strategy/RandomLottoNumberStrategy.java b/src/main/java/domain/strategy/RandomLottoNumberStrategy.java index 9700e52..e4462d1 100644 --- a/src/main/java/domain/strategy/RandomLottoNumberStrategy.java +++ b/src/main/java/domain/strategy/RandomLottoNumberStrategy.java @@ -10,12 +10,12 @@ public class RandomLottoNumberStrategy { private final static int LOWER_BOUND = 1; private final static int LOTTO_NUMBER_COUNT = 6; - public List getRandomLottoNumbers(){ + public List getRandomLottoNumbers() { List lottoNumberRange = setLottoNumberRange(); return getLottoNumbers(lottoNumberRange); } - private List setLottoNumberRange(){ + private List setLottoNumberRange() { ArrayList lottoNumberIndex = new ArrayList<>(); for (int lottoNumber = LOWER_BOUND; lottoNumber < UPPER_BOUND; lottoNumber++) { lottoNumberIndex.add(lottoNumber); @@ -23,7 +23,7 @@ private List setLottoNumberRange(){ return lottoNumberIndex; } - private List getLottoNumbers(List lottoNumberRange){ + private List getLottoNumbers(List lottoNumberRange) { Collections.shuffle(lottoNumberRange); List collectedNumbers = lottoNumberRange.subList(0,LOTTO_NUMBER_COUNT); Collections.sort(collectedNumbers); diff --git a/src/main/java/ui/Printer.java b/src/main/java/ui/Printer.java index bbd09fb..45b8253 100644 --- a/src/main/java/ui/Printer.java +++ b/src/main/java/ui/Printer.java @@ -10,33 +10,83 @@ public class Printer { private static final String REQUEST_PURCHASE_AMOUNT_MESSAGE = "구입금액을 입력해 주세요."; private static final String REQUEST_LAST_WEEK_LOTTO_WINNING_NUMBER_MESSAGE = "지난 주 당첨 번호를 입력해 주세요."; private static final String REQUEST_LOTTO_BONUS_BALL_NUMBER_MESSAGE = "보너스 볼을 입력해주세요"; - private static final String PRINT_FINAL_MATCHED_LOTTO_RESULT_MESSAGE = "%s개 일치 (%s원)- %s개"; - private static final String PRINT_LOTTO_PROFIT_MESSAGE = "총 수익률은 %f입니다."; + private static final String PRINT_FINAL_MATCHED_LOTTO_RESULT_MESSAGE = "%s개 일치%s(%s원)- "; + private static final String PRINT_LOTTO_PROFIT_MESSAGE = "총 수익률은 %.2f입니다."; + private static final String PRINT_MATCH_BONUS_BALL_MESSAGE = ", 보너스 볼 일치"; + private static final String PRINT_DIVIDER_MESSAGE = "---------\n"; + private static final String PRINT_WINNING_STATISTICS_MESSAGE = "\n당첨 통계\n"; + private static final String PRINT_PROFIT_LOSS_MESSAGE = "(기준이 1이기 때문에 결과적으로 손해라는 의미임)"; + public void requestPurchaseAmount() { System.out.println(REQUEST_PURCHASE_AMOUNT_MESSAGE); } + public void requestLastWeekLottoWinningNumber() { System.out.println(REQUEST_LAST_WEEK_LOTTO_WINNING_NUMBER_MESSAGE); } + public void requestLottoBonusBallNumber() { System.out.println(REQUEST_LOTTO_BONUS_BALL_NUMBER_MESSAGE); } - public void printAllLotto(Lottos lottos){ + + public void printWinningStatistics() { + System.out.print(PRINT_WINNING_STATISTICS_MESSAGE); + System.out.print(PRINT_DIVIDER_MESSAGE); + } + + public void printAllLotto(Lottos lottos) { for (LottoTicket lotto : lottos.getLottos()) { System.out.println(lotto.getLotto()); } } - public void printAllMatchedLottoResult(Map lottoPrices) { + public void printAllMatchedLottoResults(Map lottoPrices) { List keySet = new ArrayList(lottoPrices.keySet()); keySet.sort(Comparator.comparingInt(WinningStatus::getWinningMoney)); - for(WinningStatus key: keySet) { - System.out.println(String.format(PRINT_FINAL_MATCHED_LOTTO_RESULT_MESSAGE, key.getMatchCount(), key.getWinningMoney(), lottoPrices.get(key))); + for(WinningStatus winningStatus: WinningStatus.values()){ + printMatchedLottoWithBonusBallFormat(winningStatus); + printMatchedLottoFormat(winningStatus); + printMatchedLottoResult(winningStatus, lottoPrices); + } + } + + private void printMatchedLottoResult(WinningStatus winningStatus, Map lottoPrices) { + if (lottoPrices.get(winningStatus) == null){ + System.out.println("0개"); + } + if (lottoPrices.get(winningStatus) != null){ + System.out.println(lottoPrices.get(winningStatus)+"개"); + } + } + + private void printMatchedLottoFormat(WinningStatus winningStatus) { + if (!winningStatus.hasBonusBall()) { + System.out.print(String.format( + PRINT_FINAL_MATCHED_LOTTO_RESULT_MESSAGE, + winningStatus.getMatchCount(), + "", + winningStatus.getWinningMoney())); + } + } + + private void printMatchedLottoWithBonusBallFormat(WinningStatus winningStatus) { + if (winningStatus.hasBonusBall()){ + System.out.print(String.format( + PRINT_FINAL_MATCHED_LOTTO_RESULT_MESSAGE, + winningStatus.getMatchCount(), + PRINT_MATCH_BONUS_BALL_MESSAGE, + winningStatus.getWinningMoney())); } } public void printLottoProfit(float calculatedProfit) { - System.out.println(String.format(PRINT_LOTTO_PROFIT_MESSAGE, calculatedProfit)); + System.out.print(String.format(PRINT_LOTTO_PROFIT_MESSAGE, calculatedProfit)); + } + + public void printIsLottoProfit(boolean isProfit) { + if(!isProfit) { + System.out.println(PRINT_PROFIT_LOSS_MESSAGE); + } } } \ No newline at end of file diff --git a/src/main/java/ui/Receiver.java b/src/main/java/ui/Receiver.java index 04a600c..a87c0ea 100644 --- a/src/main/java/ui/Receiver.java +++ b/src/main/java/ui/Receiver.java @@ -31,6 +31,5 @@ private List splitInputLine(String line) { private List convertStringToInt(List dividedLastWeekLottoWinningNumbers) { return dividedLastWeekLottoWinningNumbers.stream().map(Integer::parseInt).collect(Collectors.toList()); - } }