diff --git a/src/main/java/LottoApplication.java b/src/main/java/LottoApplication.java new file mode 100644 index 0000000..9ef73eb --- /dev/null +++ b/src/main/java/LottoApplication.java @@ -0,0 +1,55 @@ +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, numberOfLottoTicket); + + printer.printLottoProfit(profit.getProfit()); + printer.printIsLottoProfit(profit.isProfit()); + } + + 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..1b4829c --- /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.printWinningStatistics(); + printer.printAllMatchedLottoResults(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..2212969 --- /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..a983e81 --- /dev/null +++ b/src/main/java/domain/Profit.java @@ -0,0 +1,36 @@ +package domain; + +import domain.lottoticket.NumberOfLottoTicket; + +import java.util.List; + +public class Profit { + 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(); + } + + private float CalculatedProfit() { + return (float)sumLottoPrices / numberOfLottoTicket.getMoney(); + } + + public boolean isProfit() { + if (calculatedProfit 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..bcea143 --- /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..e4462d1 --- /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..45b8253 --- /dev/null +++ b/src/main/java/ui/Printer.java @@ -0,0 +1,92 @@ +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 = "총 수익률은 %.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 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 printAllMatchedLottoResults(Map lottoPrices) { + List keySet = new ArrayList(lottoPrices.keySet()); + keySet.sort(Comparator.comparingInt(WinningStatus::getWinningMoney)); + + 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.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 new file mode 100644 index 0000000..a87c0ea --- /dev/null +++ b/src/main/java/ui/Receiver.java @@ -0,0 +1,35 @@ +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()); + } +}