diff --git a/src/main/java/Main.java b/src/main/java/Main.java new file mode 100644 index 00000000..7f52b65f --- /dev/null +++ b/src/main/java/Main.java @@ -0,0 +1,38 @@ +import domain.Input; +import domain.GenerateLotto; +import domain.WinningLotto; +import exception.Lotto; +import exception.Money; +import view.Print; + +import java.util.ArrayList; + +public class Main { + public static void main(String[] args) { + GenerateLotto lotto = new GenerateLotto(); + WinningLotto winningLotto = new WinningLotto(); + Print print = new Print(); + Input input = new Input(); + + int purchaseAmount = input.setPurchaseAmount(); + + int manualCount = input.setManualCount(); + + if (manualCount > 0) { + lotto.getManualLotto(purchaseAmount, manualCount); + } + + ArrayList> totalLottos = lotto.getLotto(lotto.getRemainingMoney(purchaseAmount, manualCount)); + + print.printPurchasedLottoCount(manualCount, totalLottos); + + ArrayList winningNumbers = input.setWinningNumber(); + + int bonusNumber = input.setBonusNumber(winningNumbers); + + winningLotto.totalCheckLotto(totalLottos, winningNumbers, bonusNumber); + + print.printWinningCount(winningLotto.winningCount, winningLotto.calculateRate(purchaseAmount)); + + } +} \ No newline at end of file diff --git a/src/main/java/domain/GenerateLotto.java b/src/main/java/domain/GenerateLotto.java new file mode 100644 index 00000000..71a6ecfd --- /dev/null +++ b/src/main/java/domain/GenerateLotto.java @@ -0,0 +1,66 @@ +package domain; + +import exception.Lotto; +import exception.ManualNumber; + +import java.util.ArrayList; +import java.util.Collections; +import java.util.HashSet; +import java.util.Set; + +public class GenerateLotto { + ArrayList> totalLotto = new ArrayList<>(); + + private final int LOTTO_PRICE = 1000; + + private ArrayList getOne() { + GenerateRandom random = new GenerateRandom(); + + Set set = new HashSet<>(); + + while (set.size() != 6) { + set.add(random.generateRandom()); + } + ArrayList lotto = new ArrayList<>(set); + + + Collections.sort(lotto); + + return lotto; + } + + public ArrayList> getLotto(int money) { + for (int i = 0; i < money; i += LOTTO_PRICE) { + totalLotto.add(this.getOne()); + } + + return totalLotto; + } + + public ArrayList getManualOne() { + + Input input = new Input(); + + ArrayList manualOne = input.setManualNumber(); + + Collections.sort(manualOne); + + return new Lotto(manualOne).lotto(); + } + + public void getManualLotto(int purchaseAmount, int manualCount) { + // TODO + ManualNumber manualNumber = new ManualNumber(purchaseAmount, manualCount); + + System.out.println("\n수동으로 구매할 번호를 입력해 주세요."); + + for (int i = 0; i < manualNumber.count(); i++) { + totalLotto.add(this.getManualOne()); + } + } + + public int getRemainingMoney(int money, int manualCount) { + return money - (LOTTO_PRICE * manualCount); + } + +} diff --git a/src/main/java/domain/GenerateRandom.java b/src/main/java/domain/GenerateRandom.java new file mode 100644 index 00000000..e3e1f70b --- /dev/null +++ b/src/main/java/domain/GenerateRandom.java @@ -0,0 +1,12 @@ +package domain; + +import java.util.Random; + +public class GenerateRandom { + public int generateRandom() { + Random random = new Random(); + + return random.nextInt(45) + 1; + } + +} diff --git a/src/main/java/domain/Input.java b/src/main/java/domain/Input.java new file mode 100644 index 00000000..4a80fee1 --- /dev/null +++ b/src/main/java/domain/Input.java @@ -0,0 +1,66 @@ +package domain; + +import exception.BonusNumber; +import exception.Lotto; +import exception.Money; + +import java.util.ArrayList; +import java.util.Scanner; + +public record Input() { + + public int setPurchaseAmount() { + System.out.println("구입금액을 입력해주세요."); + Scanner scanner = new Scanner(System.in); + + return new Money(scanner.nextInt()).money(); + } + + public ArrayList setWinningNumber() { + System.out.println("\n지난 주 당첨 번호를 입력해 주세요."); + Scanner scanner = new Scanner(System.in); + + String line = scanner.nextLine(); + + return new Lotto(separateNumber(line)).lotto(); + } + + public int setBonusNumber(ArrayList winningNumbers) { + System.out.println("\n보너스 볼을 입력해 주세요"); + Scanner scanner = new Scanner(System.in); + int bonusNumber = scanner.nextInt(); + + winningNumbers.add(bonusNumber); + + return new BonusNumber(winningNumbers, bonusNumber).bonusNumber(); + } + + public int setManualCount() { + System.out.println("\n수동으로 구매할 로또 수를 입력해 주세요."); + Scanner scanner = new Scanner(System.in); + + return scanner.nextInt(); + + } + + public ArrayList setManualNumber() { + Scanner scanner = new Scanner(System.in); + + String line = scanner.nextLine(); + + return separateNumber(line); + } + + public ArrayList separateNumber(String raw) { + String[] numberStrings = raw.split(", "); + ArrayList numbers = new ArrayList<>(); + + for (String numberString : numberStrings) { + numbers.add(Integer.parseInt(numberString)); + } + + return numbers; + } + + +} diff --git a/src/main/java/domain/WinningLotto.java b/src/main/java/domain/WinningLotto.java new file mode 100644 index 00000000..7b3dd9cd --- /dev/null +++ b/src/main/java/domain/WinningLotto.java @@ -0,0 +1,60 @@ +package domain; + +import java.util.ArrayList; +import java.util.Arrays; + +public class WinningLotto { + public ArrayList winningCount = new ArrayList<>(Arrays.asList(0, 0, 0, 0, 0)); + + private int checkLotto(ArrayList lotto, ArrayList winningNumbers) { + int count = 0; + + for (int winningNumber : winningNumbers) { + + if (lotto.contains(winningNumber)) { + count++; + } + } + + return count; + } + + private void addWinningCount(ArrayList totalLotto, int count, int bonusNumber) { + + if (count == 3) { + winningCount.set(0, winningCount.get(0) + 1); + return; + } + if (count == 4) { + winningCount.set(1, winningCount.get(1) + 1); + return; + } + if (count == 5) { + addBonusCount(totalLotto, bonusNumber); + return; + } + if (count == 6) { + winningCount.set(4, winningCount.get(4) + 1); + } + } + + private void addBonusCount(ArrayList lotto, int bonusNumber) { + if (lotto.contains(bonusNumber)) { + winningCount.set(3, winningCount.get(3) + 1); + return; + } + + winningCount.set(2, winningCount.get(2) + 1); + } + + public void totalCheckLotto(ArrayList> totalLottes, ArrayList winningNumbers, int bonusNumber) { + for (ArrayList totalLotto : totalLottes) { + addWinningCount(totalLotto, checkLotto(totalLotto, winningNumbers), bonusNumber); + } + } + + public double calculateRate(int money) { + return (double) (WinningNumbers.findByIndex(0) * winningCount.get(0) + WinningNumbers.findByIndex(1) * winningCount.get(1) + WinningNumbers.findByIndex(2) * winningCount.get(2) + WinningNumbers.findByIndex(3) * winningCount.get(3) + WinningNumbers.findByIndex(4) * winningCount.get(4)) / money; + } +} + diff --git a/src/main/java/domain/WinningNumbers.java b/src/main/java/domain/WinningNumbers.java new file mode 100644 index 00000000..1d95e5c8 --- /dev/null +++ b/src/main/java/domain/WinningNumbers.java @@ -0,0 +1,28 @@ +package domain; + +public enum WinningNumbers { + FIFTH(5000), + FOURTH(50000), + THIRD(1500000), + SECOND(30000000), + FIRST(2000000000); + + private final int amount; + + WinningNumbers(int amount) { + this.amount = amount; + } + + public int amount() { + return amount; + } + + public static int findByIndex(int index) { + if (index >= 0 && index < values().length) { + return values()[index].amount(); + } + + throw new IllegalArgumentException(); + } + +} diff --git a/src/main/java/exception/BonusNumber.java b/src/main/java/exception/BonusNumber.java new file mode 100644 index 00000000..0f636542 --- /dev/null +++ b/src/main/java/exception/BonusNumber.java @@ -0,0 +1,16 @@ +package exception; + +import java.util.ArrayList; + +public record BonusNumber(ArrayList winningNumbers, int bonusNumber) { + + public BonusNumber { + validateDuplication(winningNumbers); + } + + private static void validateDuplication(ArrayList winningNumbers) { + if (winningNumbers.stream().distinct().count() != 7) { + throw new IllegalArgumentException("숫자는 중복 불가능합니다."); + } + } +} diff --git a/src/main/java/exception/Lotto.java b/src/main/java/exception/Lotto.java new file mode 100644 index 00000000..7503b3fc --- /dev/null +++ b/src/main/java/exception/Lotto.java @@ -0,0 +1,31 @@ +package exception; + +import java.util.ArrayList; + +public record Lotto(ArrayList lotto) { + + public Lotto { + validateLottoRange(lotto); + validateDuplication(lotto); + validateLottoLength(lotto); + } + + private void validateLottoRange(ArrayList lotto) { + if (lotto.stream().allMatch(number -> number < 1 || number > 45)) { + throw new IllegalArgumentException("1 ~ 45사이의 값만 입력할 수 있습니다."); + } + } + + private static void validateDuplication(ArrayList winningNumbers) { + if (winningNumbers.stream().distinct().count() != 6) { + throw new IllegalArgumentException("로또 번호 중복 입력은 불가능합니다."); + } + } + + private void validateLottoLength(ArrayList lotto) { + if (lotto.size() != 6) { + throw new IllegalArgumentException("길이가 맞지 않습니다."); + } + } + +} diff --git a/src/main/java/exception/ManualNumber.java b/src/main/java/exception/ManualNumber.java new file mode 100644 index 00000000..cd1178ba --- /dev/null +++ b/src/main/java/exception/ManualNumber.java @@ -0,0 +1,29 @@ +package exception; + +import java.util.ArrayList; + +public record ManualNumber(int money, int count) { + private static final int LOTTO_PRICE = 1000; + + public ManualNumber { + validateNegativeNumber(count); + checkRemainingMoney(money, count); + } + + private void validateNegativeNumber(int number) { + if (number < 0) { + throw new IllegalArgumentException("음수는 입력될 수 없습니다."); + } + } + public void validateLottoRange(ArrayList lotto) { + if (lotto.stream().allMatch(number -> number >= 1 && number <= 45)) { + throw new IllegalArgumentException("1 ~ 45사이의 값만 입력할 수 있습니다."); + } + } + + public void checkRemainingMoney(int money, int manualCount) { + if (money < manualCount * LOTTO_PRICE) { + throw new IllegalArgumentException("구입 금액을 넘은 갯수 입니다."); + } + } +} diff --git a/src/main/java/exception/Money.java b/src/main/java/exception/Money.java new file mode 100644 index 00000000..53d64756 --- /dev/null +++ b/src/main/java/exception/Money.java @@ -0,0 +1,15 @@ +package exception; + +public record Money(int money) { + + public Money { + validateNegativeNumber(money); + } + + private void validateNegativeNumber(int money) { + if (money < 0) { + throw new IllegalArgumentException("구입 금액이 음수일 수 없습니다."); + } + } + +} diff --git a/src/main/java/view/Print.java b/src/main/java/view/Print.java new file mode 100644 index 00000000..e4ce3f1d --- /dev/null +++ b/src/main/java/view/Print.java @@ -0,0 +1,34 @@ +package view; + +import domain.WinningNumbers; + +import java.util.ArrayList; + +public class Print { + + // 1~6개 일치하는 갯수 + public void printPurchasedLottoCount(int manualCount, ArrayList> totalLottos) { + System.out.printf("\n수동으로 %d장, 자동으로 %d개를 구매했습니다.\n", manualCount, totalLottos.size() - manualCount); + for (ArrayList totalLotto : totalLottos) { + System.out.println(totalLotto); + } + + // for +// System.out.printf("%d개 일치 (%d원)- %d개", ); + } + + public void printWinningCount(ArrayList winningCount, double rate) { + System.out.println("\n당첨 통계"); + System.out.println("---------"); + + System.out.printf("3개 일치 (%d원)- %d개\n", WinningNumbers.findByIndex(0), winningCount.get(0)); + System.out.printf("4개 일치 (%d원)- %d개\n", WinningNumbers.findByIndex(1), winningCount.get(1)); + System.out.printf("5개 일치 (%d원)- %d개\n", WinningNumbers.findByIndex(2), winningCount.get(2)); + System.out.printf("5개 일치, 보너스 볼 일치(%d원) - %d개\n", WinningNumbers.findByIndex(3), winningCount.get(3)); + System.out.printf("6개 일치 (%d원)- %d개\n", WinningNumbers.findByIndex(4), winningCount.get(4)); + + System.out.printf("총 수익률은 %.2f입니다.\n", rate); + + } + +}