diff --git a/src/main/java/Application.java b/src/main/java/Application.java new file mode 100644 index 00000000..2588f582 --- /dev/null +++ b/src/main/java/Application.java @@ -0,0 +1,10 @@ +import controller.LottoController; + +import java.io.IOException; + +public class Application { + + public static void main(String [] args) throws IOException { + LottoController lottoController = new LottoController(); + } +} diff --git a/src/main/java/controller/LottoController.java b/src/main/java/controller/LottoController.java new file mode 100644 index 00000000..4832b7d5 --- /dev/null +++ b/src/main/java/controller/LottoController.java @@ -0,0 +1,72 @@ +package controller; + +import model.AutoLotto; +import model.Lotto; +import model.LottoList; +import model.LottoService; +import view.InputView; +import view.OutputView; + +import java.util.ArrayList; +import java.util.HashMap; +import java.util.List; +import java.util.Map; + +public class LottoController { + private InputView inputView = new InputView(); + private OutputView outputView = new OutputView(); + private AutoLotto autoLotto; + private LottoList lottoList=new LottoList(); + + private LottoService lottoService=new LottoService(); + + public LottoController(){ + lottoStart(); + } + public void lottoStart() { + int price = inputMoney(); + int manualPrice= inputManual(); + viewLotto(price,manualPrice); + List winningNums=inputView.inputWinningNumbers(); + lottoList.setTotalPrice(price);//넣어야함 + int bonusBall=inputView.inputBonusBall(); + lottoService.calculateWinningNumbers(winningNums,lottoList,bonusBall); + } + + public int inputMoney(){ + return inputView.inputPrice(); + } + public int inputManual(){ + return inputView.inputManualNum(); + } + public void viewLotto(int price,int manualPrice){ + int count = price/1000-manualPrice; + lottoList = generateLottoList(count,manualPrice); + outputView.countPrint(manualPrice,count); + printLottoList(lottoList);//생성된 후 출력 + } + + public void printLottoList(LottoList lottoList){ + for(Lotto lotto:lottoList.getLottoList()) + System.out.println(lotto.getNumbers()); + } + + public Lotto makeLotto(){ + List lotto = new ArrayList<>(); + AutoLotto autoLotto = new AutoLotto(); + lotto = autoLotto.getAutoLotto(); + return new Lotto(lotto); + } + public LottoList generateLottoList(int count,int manualPrice){ + inputView.InputManualLottoStart(); + for(int i=0;i lottoNums=inputView.inputManualLottoNum(); + Lotto manualLotto=new Lotto(lottoNums); + lottoList.setLottoList(manualLotto); + } + for(int j=0; j lottoNums = new ArrayList<>(); + public AutoLotto(){ + createAutoLotto(); + } + public void createAutoLotto(){ + List numbers = new ArrayList<>(); + for (int i = MIN_LOTTO_NUMBER; i <= MAX_LOTTO_NUMBER; i++) { + numbers.add(i); + } + Collections.shuffle(numbers); + lottoNums = new ArrayList<>(); + for (int i = 0; i < CNT_LOTTO_NUMBER; i++) { + int uniqueNumber = numbers.get(i); + while (lottoNums.contains(uniqueNumber)) { + Collections.shuffle(numbers); + uniqueNumber = numbers.get(i); + } + lottoNums.add(uniqueNumber); + } + Collections.sort(lottoNums); + } + public List getAutoLotto(){ + return lottoNums; + } + +} diff --git a/src/main/java/model/Lotto.java b/src/main/java/model/Lotto.java new file mode 100644 index 00000000..cd1f8f0e --- /dev/null +++ b/src/main/java/model/Lotto.java @@ -0,0 +1,16 @@ +package model; + +import java.util.List; + +public class Lotto { + private static final int BONUS_NUMBER_INDEX = 6; + private final List numbers; + + public Lotto(List numbers) { + this.numbers = numbers; + } + + public ListgetNumbers(){ + return numbers; + } +} \ No newline at end of file diff --git a/src/main/java/model/LottoList.java b/src/main/java/model/LottoList.java new file mode 100644 index 00000000..48cffa5e --- /dev/null +++ b/src/main/java/model/LottoList.java @@ -0,0 +1,29 @@ +package model; + +import view.OutputView; + +import java.util.ArrayList; +import java.util.Collections; +import java.util.List; + +public class LottoList { + List lottoList = new ArrayList<>(); + private int totalPrice; + + public LottoList(){ + + } + public void setLottoList(Lotto lotto){ + lottoList.add(lotto); + } + + public List getLottoList(){ + return lottoList; + } + public void setTotalPrice(int reward){ + this.totalPrice+=reward; + } + public int getTotalPrice(){ + return totalPrice; + } +} diff --git a/src/main/java/model/LottoService.java b/src/main/java/model/LottoService.java new file mode 100644 index 00000000..3d830bfd --- /dev/null +++ b/src/main/java/model/LottoService.java @@ -0,0 +1,51 @@ +package model; + +import view.InputView; +import view.OutputView; + +import java.sql.SQLOutput; +import java.util.HashMap; +import java.util.List; +import java.util.Map; + +public class LottoService { + + + private OutputView outputView = new OutputView(); + private Prize prize=new Prize(); + + public void calculateWinningNumbers(List winningNumbers,LottoList lottoList,int bonusBall){ + Map stats=new HashMap<>(); + for(Lotto lotto:lottoList.getLottoList()){ + int matches=countMatchNumbers(lotto.getNumbers(),winningNumbers); + int bonusMatches=calculateBonusBallMatch(lotto,matches,bonusBall); + putPrize(matches,bonusMatches,stats); + } + double revenue=calculateRevenue(stats,lottoList); + outputView.printWinningResult(stats,revenue,prize); + } + + public void putPrize(int matches,int bonusMatches,Map stats){ + if(bonusMatches==1) + matches=7; + stats.put(matches,stats.getOrDefault(matches,0)+1); + } + public int calculateBonusBallMatch(Lotto lotto,int matches,int bonusBall){ + return matches==Match.MATCH_5.getMatch() && lotto.getNumbers().contains(bonusBall) ? 1 : 0; + } + public int countMatchNumbers(List lottoNums,List winningNums){ + int matches=0; + for(Integer num:lottoNums){ + if(winningNums.contains(num)) + matches++; + } + return matches; + } + + public double calculateRevenue(Map stats,LottoList lottoList){ + int totalPrice= lottoList.getTotalPrice(); + int totalRevenue=stats.entrySet().stream().mapToInt(entry-> entry.getValue()*prize.getPrize(entry.getKey())).sum(); + double revenue=(double) totalRevenue/totalPrice; + return revenue; + } +} \ No newline at end of file diff --git a/src/main/java/model/Match.java b/src/main/java/model/Match.java new file mode 100644 index 00000000..46243b38 --- /dev/null +++ b/src/main/java/model/Match.java @@ -0,0 +1,25 @@ +package model; + +public enum Match { + MATCH_3(3, 0), // 3개 일치 + MATCH_4(4, 0), // 4개 일치 + MATCH_5(5, 0), // 5개 일치 + MATCH_5_BONUS(5, 1), // 5개 일치 + 보너스 볼 일치 + MATCH_6(6, 0); // 6개 일치 + + private final int match; // 로또 번호 일치 개수 + private final int bonusMatch; // 보너스 볼 일치 여부 (0: 불일치, 1: 일치) + + Match(int match, int bonusMatch) { + this.match = match; + this.bonusMatch = bonusMatch; + } + + public int getMatch() { + return match; + } + + public int getBonusMatch() { + return bonusMatch; + } +} \ No newline at end of file diff --git a/src/main/java/model/Prize.java b/src/main/java/model/Prize.java new file mode 100644 index 00000000..0f742de2 --- /dev/null +++ b/src/main/java/model/Prize.java @@ -0,0 +1,27 @@ +package model; + +import java.util.HashMap; +import java.util.Map; + +public class Prize { + private final Map prizeMap; + + public Prize() { + prizeMap = initializePrizeMap(); + } + + private Map initializePrizeMap() { + Map map = new HashMap<>(); + map.put(3, 5000); + map.put(4, 50000); + map.put(5, 1500000); + map.put(6, 2000000000); + map.put(7,30000000); + return map; + } + + + public int getPrize(int matches) { + return prizeMap.getOrDefault(matches, 0); + } +} \ No newline at end of file diff --git a/src/main/java/view/InputView.java b/src/main/java/view/InputView.java new file mode 100644 index 00000000..bef95646 --- /dev/null +++ b/src/main/java/view/InputView.java @@ -0,0 +1,66 @@ +package view; + +import javax.swing.*; +import java.util.ArrayList; +import java.util.List; +import java.util.Locale; +import java.util.Scanner; + +public class InputView { + + private final static String INPUT_WINNING_NUMBERS="지난 주 당첨 번호를 입력해 주세요."; + private final static String INPUT_PRICE = "구입금액을 입력해 주세요."; + private static final String INPUT_MANUAL_NUM="수동으로 구매할 로또 수를 입력해 주세요."; + private static final String INPUT_MANUAL_LOTTO_NUM="수동으로 구매할 번호를 입력해 주세요."; + private static final String INPUT_BONUS_BALL="보너스 볼을 입력해 주세요."; + private static final Scanner scanner = new Scanner(System.in); + + public int inputPrice(){ + System.out.println(INPUT_PRICE); + int price = scanner.nextInt(); + scanner.nextLine(); + return price; + } + + public List inputWinningNumbers(){ + System.out.println(); + System.out.println(INPUT_WINNING_NUMBERS); + List winningNumbers=new ArrayList<>(); + String input= scanner.nextLine().trim(); + String[] numbers=input.split(", "); + for(String num:numbers) + if(!num.isEmpty()) + winningNumbers.add(Integer.parseInt(num)); + return winningNumbers; + } + + public int inputBonusBall(){ + System.out.println(); + System.out.println(INPUT_BONUS_BALL); + int bonusBall= scanner.nextInt(); + scanner.nextLine(); + return bonusBall; + } + + public int inputManualNum(){ + System.out.println(); + System.out.println(INPUT_MANUAL_NUM); + int manualNum= scanner.nextInt(); + scanner.nextLine(); + return manualNum; + } + + public void InputManualLottoStart(){ + System.out.println(); + System.out.println(INPUT_MANUAL_LOTTO_NUM); + } + public List inputManualLottoNum(){ + List lottoNumbers=new ArrayList<>(); + String input= scanner.nextLine().trim(); + String[] numbers=input.split(", "); + for(String num:numbers) + if(!num.isEmpty()) + lottoNumbers.add(Integer.parseInt(num)); + return lottoNumbers; + } +} \ No newline at end of file diff --git a/src/main/java/view/OutputView.java b/src/main/java/view/OutputView.java new file mode 100644 index 00000000..aa2b4f60 --- /dev/null +++ b/src/main/java/view/OutputView.java @@ -0,0 +1,46 @@ +package view; + +import model.LottoService; +import model.Match; +import model.Prize; + +import java.util.HashMap; +import java.util.List; +import java.util.Map; + +public class OutputView { + + private final static String PRINT_HEAD="당첨 통계"; + private final static String PRINT_DIVIDER="---------"; + private final static String BUY_MESSAGE = "수동으로 %d장, 자동으로 %d개를 구매했습니다.\n"; + + public void countPrint (int manualNum,int count){ + System.out.printf("\n"+BUY_MESSAGE, manualNum, count); + } + + public void printWinningResult(Map stats, double revenue, Prize prize){ + System.out.println(); + System.out.println(PRINT_HEAD); + System.out.println(PRINT_DIVIDER); + printStatsResult(stats,prize); + System.out.printf("총 수익률은 %.2f입니다. (기준이 1이기 때문에 결과적으로 %s라는 의미임)\n", revenue, revenue >= 1 ? "이득이" : "손해"); + } + + public void printStatsResult(Map stats,Prize prize){ + + for(int i=3;i<=6;i++){ + int count=stats.getOrDefault(i,0); + int realPrize=prize.getPrize(i); + System.out.printf("%d개 일치 (%d원)- %d개\n", i, realPrize, count); + if(i==5) + print2ndResult(stats,prize); + } + } + + public void print2ndResult(Map stats,Prize prize){ + int count= stats.getOrDefault(7,0); + int realPrize=prize.getPrize(7); + System.out.printf("5개 일치, 보너스 볼 일치 (%d원)- %d개\n",realPrize,count); + } + +} \ No newline at end of file