diff --git a/src/main/java/Application.java b/src/main/java/Application.java new file mode 100644 index 00000000..babae7f7 --- /dev/null +++ b/src/main/java/Application.java @@ -0,0 +1,8 @@ +import controller.LottoController; + +public class Application { + public static void main(String[] args) { + LottoController lottoController = new LottoController(); + lottoController.start(); + } +} diff --git a/src/main/java/controller/LottoController.java b/src/main/java/controller/LottoController.java new file mode 100644 index 00000000..cd873439 --- /dev/null +++ b/src/main/java/controller/LottoController.java @@ -0,0 +1,100 @@ +package controller; + +import domain.LottoNumber; +import domain.Money; +import domain.Lotto; +import domain.Lottos; +import service.CalculateProfit; +import service.FindBingo; +import service.RandomLottoGenerator; +import view.InputView; +import view.OutputView; + +import java.util.ArrayList; +import java.util.List; + +public class LottoController { + + private static Lottos userLottos = new Lottos(); + private static int manualLottoNum; + + public void start() { + Money userMoney = getUserMoney(); + int ticket = userMoney.ticket(); + + addAllLottos(ticket); + showAllLotto(ticket); + + Lotto lastWeekLotto = new Lotto(getLastWeekLotto()); + int bonusNum = getBonusLottoNum(); + + makeBingo(userLottos, lastWeekLotto, bonusNum); + + showLottoResult(); + showProfit(userMoney.getMoney()); + } + + public static Money getUserMoney() { + String userMoney = InputView.readMoney(); + return new Money(userMoney); + } + + public static void addAllLottos(int ticket) { + manualLottoNum = getManualLottoNum(); + for (int i = 0; i < manualLottoNum; i++) { + addManualLottos(); + } + RandomLottoGenerator.makeAutomaticLottos(ticket - manualLottoNum, userLottos); + } + + public static int getManualLottoNum() { + Integer manualLottoNum = InputView.readManualLottoNum(); + OutputView.printManualLottoMessage(); + return manualLottoNum; + } + + public static void addManualLottos() { + + String manualLotto = InputView.readManualLotto(); + userLottos.addLotto(new Lotto(makeLottoList(manualLotto))); + } + + public static void showAllLotto(int ticket) { + OutputView.printLottos(manualLottoNum, ticket - manualLottoNum, userLottos); + } + + public static List getLastWeekLotto() { + String lastWeekLotto = InputView.readlastWeekLotto(); + return makeLottoList(lastWeekLotto); + } + + public static List makeLottoList(String lotto) { + List LottoList = new ArrayList<>(); + for (String lottoNumber : lotto.split(",\\s*")) { + LottoList.add(new LottoNumber(lottoNumber)); + } + return LottoList; + } + + public static int getBonusLottoNum() { + return InputView.readBonusNumber(); + } + + public void makeBingo(Lottos lottos, Lotto userLotto, int bonusNum) { + FindBingo findBingo = new FindBingo(); + findBingo.findBingos(lottos, userLotto, bonusNum); + } + + public static void showLottoResult() { + OutputView.printResult(); + } + + public static double calculate(int money) { + CalculateProfit.calcProfit(); + return CalculateProfit.calcProfitPercent(money); + } + + public static void showProfit(int money) { + OutputView.printPercent(calculate(money)); + } +} diff --git a/src/main/java/domain/Bingo.java b/src/main/java/domain/Bingo.java new file mode 100644 index 00000000..b3704d1c --- /dev/null +++ b/src/main/java/domain/Bingo.java @@ -0,0 +1,47 @@ +package domain; + +public class Bingo { + int bingoNum; + boolean checkBonus; + private int correctLottoNum = 0; + + private Bingo(int bingoNum, boolean checkBonus) { + this.bingoNum = bingoNum; + this.checkBonus = checkBonus; + } + + private static Bingo bingo3 = new Bingo(3, false); + private static Bingo bingo4 = new Bingo(4, false); + private static Bingo bingo5 = new Bingo(5, false); + private static Bingo bingo5wB = new Bingo(5, true); + private static Bingo bingo6 = new Bingo(6, false); + + public void addCorrectLottoNum() { + correctLottoNum++; + } + + public int getCorrectLottoNum() { + return correctLottoNum; + } + + public static Bingo getBingo3() { + return bingo3; + } + + public static Bingo getBingo4() { + return bingo4; + } + + public static Bingo getBingo5() { + return bingo5; + } + + public static Bingo getBingo5wB() { + return bingo5wB; + } + + public static Bingo getBingo6() { + return bingo6; + } + +} diff --git a/src/main/java/domain/BingoResult.java b/src/main/java/domain/BingoResult.java new file mode 100644 index 00000000..543fc4ed --- /dev/null +++ b/src/main/java/domain/BingoResult.java @@ -0,0 +1,28 @@ +package domain; + +public class BingoResult { + public enum Result { + BINGO3(Bingo.getBingo3().getCorrectLottoNum(), "3개 일치 (5000원) - "), + BINGO4(Bingo.getBingo4().getCorrectLottoNum(), "4개 일치 (50000원) - "), + BINGO5(Bingo.getBingo5().getCorrectLottoNum(), "5개 일치 (1500000원) - "), + BINGO5WB(Bingo.getBingo5wB().getCorrectLottoNum(), "5개 일치, 보너스 볼 일치 (30000000원) - "), + BINGO6(Bingo.getBingo6().getCorrectLottoNum(), "6개 일치 (2000000000원) - "); + + final private int matchNum; + + final private String message; + + Result(int matchNum, final String message) { + this.matchNum = matchNum; + this.message = message; + } + + public String getMessage() { + return message; + } + + public int getMatchNum() { + return matchNum; + } + } +} diff --git a/src/main/java/domain/Lotto.java b/src/main/java/domain/Lotto.java new file mode 100644 index 00000000..543467e4 --- /dev/null +++ b/src/main/java/domain/Lotto.java @@ -0,0 +1,55 @@ +package domain; + +import java.util.ArrayList; +import java.util.HashSet; +import java.util.List; +import java.util.Set; + +public class Lotto { + private List lotto = new ArrayList<>(); + + public static final int LOTTO_SIZE = 6; + + public Lotto(List lotto) { + validate(lotto); + this.lotto = lotto; + } + + public List getLotto() { + return lotto; + } + + private void validate(List numbers) { + validateSize(numbers); + validateDuplication(numbers); + } + + private void validateSize(List numbers) { + if (numbers.size() != LOTTO_SIZE) { + throw new IllegalArgumentException("로또는 6개의 숫자로 이루어져야 합니다."); + } + } + + private void validateDuplication(List numbers) { + long duplicatedSize = checkDuplicatedSize(numbers); + if (numbers.size() != duplicatedSize) { + throw new IllegalArgumentException("로또는 중복되지 않는 6개의 숫자로 이루어져야 합니다."); + } + } + + private int checkDuplicatedSize(List numbers) { + List numbersList = new ArrayList<>(); + for (LottoNumber lottoNumber : numbers) { + numbersList.add(lottoNumber.getLottoNumber()); + } + Set nonDuplicateNumbers = new HashSet<>(numbersList); + return nonDuplicateNumbers.size(); + } + + public boolean iscontained(int number) { + for (LottoNumber lottoNumber : lotto) { + if (lottoNumber.getLottoNumber() == number) return true; + } + return false; + } +} diff --git a/src/main/java/domain/LottoNumber.java b/src/main/java/domain/LottoNumber.java new file mode 100644 index 00000000..b9b6cae7 --- /dev/null +++ b/src/main/java/domain/LottoNumber.java @@ -0,0 +1,37 @@ +package domain; + +public class LottoNumber { + int lottoNumber; + + public int getLottoNumber() { + return lottoNumber; + } + + public LottoNumber(int lottoNumber){ + this.lottoNumber=lottoNumber; + } + + public LottoNumber(String lottoNumber) { + this.lottoNumber = validate(lottoNumber); + } + private int validate(String lottoNumber) { + int IntLottoNumber = validateInteger(lottoNumber); + validateRange(IntLottoNumber); + return IntLottoNumber; + } + + private void validateRange(int lottoNumber){ + if(lottoNumber<1||lottoNumber>45){ + throw new IllegalArgumentException("로또 숫자는 1에서 45사이의 숫자이어야 합니다."); + } + } + + + public static int validateInteger(String money) { + try { + return Integer.parseInt(money); + } catch (NumberFormatException numberFormatException) { + throw new IllegalArgumentException("로또 숫자는 숫자형식이어야 합니다."); + } + } +} diff --git a/src/main/java/domain/Lottos.java b/src/main/java/domain/Lottos.java new file mode 100644 index 00000000..c2121fce --- /dev/null +++ b/src/main/java/domain/Lottos.java @@ -0,0 +1,20 @@ +package domain; + +import java.util.ArrayList; +import java.util.List; + +public class Lottos { + private List lottos=new ArrayList<>(); + + public Lottos() { + } + + public List getLottos() { + return lottos; + } + + public void addLotto(Lotto lotto){ + lottos.add(lotto); + } + +} diff --git a/src/main/java/domain/Money.java b/src/main/java/domain/Money.java new file mode 100644 index 00000000..59aff785 --- /dev/null +++ b/src/main/java/domain/Money.java @@ -0,0 +1,45 @@ +package domain; + +public class Money { + private final int money; + public static final int PRICE_UNIT = 1_000; + + public Money(String money) { + this.money = validate(money); + } + + private int validate(String money) { + int IntMoney = validateInteger(money); + validateRange(IntMoney); + validateUnit(IntMoney); + return IntMoney; + } + + public static int validateInteger(String money) { + try { + return Integer.parseInt(money); + } catch (NumberFormatException numberFormatException) { + throw new IllegalArgumentException("금액은 숫자형식이여야 합니다."); + } + } + + private void validateRange(int price) { + if (price < 0) { + throw new IllegalArgumentException("금액은 0보다 큰값이여야 합니다."); + } + } + + private void validateUnit(int price) { + if (price % 1000 != 0) { + throw new IllegalArgumentException("금액은 1000원 단위여야 합니다."); + } + } + + public int getMoney() { + return money; + } + + public int ticket() { + return money / 1000; + } +} diff --git a/src/main/java/service/CalculateProfit.java b/src/main/java/service/CalculateProfit.java new file mode 100644 index 00000000..de4826cd --- /dev/null +++ b/src/main/java/service/CalculateProfit.java @@ -0,0 +1,20 @@ +package service; + +import domain.Bingo; + +public class CalculateProfit { + private static double profit = 0; + + public static void calcProfit() { + profit += 5000 * Bingo.getBingo3().getCorrectLottoNum(); + profit += 50000 * Bingo.getBingo4().getCorrectLottoNum(); + profit += 1500000 * Bingo.getBingo5().getCorrectLottoNum(); + profit += 30000000 * Bingo.getBingo5wB().getCorrectLottoNum(); + profit += 2000000000 * Bingo.getBingo6().getCorrectLottoNum(); + } + + public static double calcProfitPercent(int money) { + double percent = (profit / (double) money); + return Math.round((int) (percent * 100)) / 100.0; + } +} diff --git a/src/main/java/service/FindBingo.java b/src/main/java/service/FindBingo.java new file mode 100644 index 00000000..b2da43b5 --- /dev/null +++ b/src/main/java/service/FindBingo.java @@ -0,0 +1,61 @@ +package service; + +import domain.Bingo; +import domain.Lotto; +import domain.LottoNumber; +import domain.Lottos; + +public class FindBingo { + int correctNum = 0; + int bonusFlag = 0; + + public void findBingos(Lottos lottos, Lotto lastWeekLotto, int bonusNum) { + + for (Lotto lotto : lottos.getLottos()) { + correctNum = 0; + bonusFlag = 0; + compareUserLotto(lastWeekLotto,lotto); + checkBonusNum(lastWeekLotto, bonusNum); + + checkBingoList(correctNum, bonusFlag); + } + } + + public void compareUserLotto(Lotto lastWeekLotto, Lotto userLotto) { + for (LottoNumber lastWeekNum : lastWeekLotto.getLotto()) { + if (userLotto.iscontained(lastWeekNum.getLottoNumber())) correctNum++; + } + } + + public void checkBonusNum(Lotto userLotto, int bonusNum) { + if (userLotto.iscontained(bonusNum)) bonusFlag = 1; + } + + public void checkBingoList(int correctNum, int bonusFlag) { + findBingo3(correctNum); + findBingo4(correctNum); + findBingo5(correctNum, bonusFlag); + findBingo5wB(correctNum, bonusFlag); + findBingo6(correctNum); + } + + public void findBingo3(int correctNum) { + if (correctNum == 3) Bingo.getBingo3().addCorrectLottoNum(); + } + + public void findBingo4(int correctNum) { + if (correctNum == 4) Bingo.getBingo4().addCorrectLottoNum(); + } + + public void findBingo5(int correctNum, int bonusFlag) { + if (correctNum == 5 && bonusFlag == 0) Bingo.getBingo5().addCorrectLottoNum(); + } + + public void findBingo5wB(int correctNum, int bonusFlag) { + if (correctNum == 5 && bonusFlag == 1) Bingo.getBingo5wB().addCorrectLottoNum(); + } + + public void findBingo6(int correctNum) { + if (correctNum == 6) Bingo.getBingo6().addCorrectLottoNum(); + } +} diff --git a/src/main/java/service/RandomLottoGenerator.java b/src/main/java/service/RandomLottoGenerator.java new file mode 100644 index 00000000..81fc6abc --- /dev/null +++ b/src/main/java/service/RandomLottoGenerator.java @@ -0,0 +1,36 @@ +package service; + +import domain.Lotto; +import domain.LottoNumber; +import domain.Lottos; + +import java.util.ArrayList; +import java.util.Collections; +import java.util.List; + +public class RandomLottoGenerator { + public static void makeAutomaticLottos(int automaticLottoNum, Lottos lottos) { + for (int i = 0; i < automaticLottoNum; i++) { + lottos.addLotto(new Lotto(makeLotto())); + } + } + + public static List makeLotto() { + List numbers = new ArrayList<>(); + for (int i = 1; i <= 45; i++) { + numbers.add(i); + } + + Collections.shuffle(numbers); + + List selectedNumbers = numbers.subList(0, 6); + Collections.sort(selectedNumbers); + + List lotto = new ArrayList<>(); + for (int i = 0; i < 6; i++) { + lotto.add(new LottoNumber(selectedNumbers.get(i))); + } + return lotto; + } + +} diff --git a/src/main/java/view/InputView.java b/src/main/java/view/InputView.java new file mode 100644 index 00000000..103c9b6a --- /dev/null +++ b/src/main/java/view/InputView.java @@ -0,0 +1,44 @@ +package view; + +import java.util.Scanner; + +public class InputView { + public static final Scanner scanner = new Scanner(System.in); + + public static String readMoney() { + System.out.println("구입금액을 입력해 주세요."); + String money = scanner.nextLine(); + System.out.println(); + return money; + } + + public static int readManualLottoNum() { + System.out.println("수동으로 구매할 로또수를 입력해 주세요."); + String manualLottoNum = scanner.nextLine(); + System.out.println(); + return Integer.parseInt(manualLottoNum); + } + + public static String readManualLotto() { + String manualLotto = scanner.nextLine(); + System.out.println(); + return manualLotto; + } + + + public static String readlastWeekLotto() { + System.out.println("지난 주 당첨 번호를 입력해 주세요."); + String manualLotto = scanner.nextLine(); + System.out.println(); + + return manualLotto; + } + + public static int readBonusNumber() { + System.out.println("보너스 볼을 입력해 주세요."); + String bonusNumber = scanner.nextLine(); + System.out.println(); + return Integer.parseInt(bonusNumber); + } + +} diff --git a/src/main/java/view/OutputView.java b/src/main/java/view/OutputView.java new file mode 100644 index 00000000..3ae5018b --- /dev/null +++ b/src/main/java/view/OutputView.java @@ -0,0 +1,44 @@ +package view; + +import domain.BingoResult; +import domain.Lotto; +import domain.LottoNumber; +import domain.Lottos; + +import java.util.ArrayList; +import java.util.List; + +public class OutputView { + + public static void printLottos(int manualLottoNum, int automaticLottoNum, Lottos lottos) { + System.out.println("수동으로 " + manualLottoNum + "장, 자동으로 " + automaticLottoNum + "개를 구매했습니다."); + for (Lotto lotto : lottos.getLottos()) { + printLotto(lotto.getLotto()); + } + System.out.println(); + } + + public static void printLotto(List lotto) { + List lottoList = new ArrayList<>(); + for (LottoNumber lottoNumber : lotto) { + lottoList.add(lottoNumber.getLottoNumber()); + } + System.out.println(lottoList); + } + + + public static void printManualLottoMessage() { + System.out.println("수동으로 구매할 번호를 입력해 주세요."); + } + + public static void printResult() { + System.out.println("당첨 통계\n---------"); + for (BingoResult.Result result : BingoResult.Result.values()) { + System.out.println(result.getMessage() + result.getMatchNum() + "개"); + } + } + + public static void printPercent(double profitPercent) { + System.out.println("총 수익률은 " + profitPercent + "%입니다."); + } +}