From a759c15b114310478a9ac9133bad33a245ef991a Mon Sep 17 00:00:00 2001 From: tjdgus3488 Date: Mon, 18 Mar 2024 17:44:18 +0900 Subject: [PATCH 1/3] =?UTF-8?q?1544=20=EC=97=B0=EA=B2=B0=20=ED=99=95?= =?UTF-8?q?=EC=9D=B8?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/main/java/lotto/Lotto.java | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/src/main/java/lotto/Lotto.java b/src/main/java/lotto/Lotto.java index 519793d..352a1bd 100644 --- a/src/main/java/lotto/Lotto.java +++ b/src/main/java/lotto/Lotto.java @@ -18,3 +18,7 @@ private void validate(List numbers) { // TODO: 추가 기능 구현 } + + + +//git 연결 확인 \ No newline at end of file From 11fe97aeec173deff6a2783494904369099a2adf Mon Sep 17 00:00:00 2001 From: tjdgus3488 Date: Fri, 22 Mar 2024 19:16:14 +0900 Subject: [PATCH 2/3] =?UTF-8?q?=EA=B8=B0=EB=8A=A5=20=EA=B5=AC=ED=98=84=20?= =?UTF-8?q?=EC=99=84=20+=20=EC=97=90=EB=9F=AC=20=EC=B2=98=EB=A6=AC=20?= =?UTF-8?q?=EB=AF=B8=EC=99=84?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/main/java/lotto/Application.java | 8 ++ src/main/java/lotto/Lotto.java | 4 + .../lotto/controller/LottoController.java | 111 ++++++++++++++++++ src/main/java/lotto/domain/LottoNumber.java | 34 ++++++ src/main/java/lotto/domain/Numbers.java | 16 +++ src/main/java/lotto/domain/Rank.java | 44 +++++++ src/main/java/lotto/view/InputView.java | 39 ++++++ src/main/java/lotto/view/OutputView.java | 16 +++ 8 files changed, 272 insertions(+) create mode 100644 src/main/java/lotto/controller/LottoController.java create mode 100644 src/main/java/lotto/domain/LottoNumber.java create mode 100644 src/main/java/lotto/domain/Numbers.java create mode 100644 src/main/java/lotto/domain/Rank.java create mode 100644 src/main/java/lotto/view/InputView.java create mode 100644 src/main/java/lotto/view/OutputView.java diff --git a/src/main/java/lotto/Application.java b/src/main/java/lotto/Application.java index d190922..cbf3bcd 100644 --- a/src/main/java/lotto/Application.java +++ b/src/main/java/lotto/Application.java @@ -1,7 +1,15 @@ package lotto; +import lotto.controller.LottoController; +import lotto.domain.Numbers; + +import java.util.List; + public class Application { public static void main(String[] args) { // TODO: 프로그램 구현 + + LottoController lottoController = new LottoController(); + lottoController.run(); } } diff --git a/src/main/java/lotto/Lotto.java b/src/main/java/lotto/Lotto.java index 352a1bd..e53a58a 100644 --- a/src/main/java/lotto/Lotto.java +++ b/src/main/java/lotto/Lotto.java @@ -16,6 +16,10 @@ private void validate(List numbers) { } } + public List getNumbers() { + return numbers; + } + // TODO: 추가 기능 구현 } diff --git a/src/main/java/lotto/controller/LottoController.java b/src/main/java/lotto/controller/LottoController.java new file mode 100644 index 0000000..2c7f3c4 --- /dev/null +++ b/src/main/java/lotto/controller/LottoController.java @@ -0,0 +1,111 @@ +package lotto.controller; + +import lotto.Lotto; +import lotto.domain.LottoNumber; +import lotto.domain.Numbers; +import lotto.domain.Rank; +import lotto.view.InputView; +import lotto.view.OutputView; + +import java.util.ArrayList; +import java.util.HashMap; +import java.util.List; +import java.util.Map; + +public class LottoController { + + private static List lottoList; + + public void run() { + try { + start(); + } catch (IllegalStateException e) { + + } + } + + public void start() { + int money = Integer.parseInt(InputView.inputMyMoney()); + int ticketCount = new LottoNumber(money).count; + OutputView.printTicketCount(ticketCount); + + lottoList = makeLottoList(ticketCount); + List winningNumber = InputView.inputWinningNumber(); + int bonusNumber = InputView.inputBonusNumber(winningNumber); + + lottoResult(lottoList, winningNumber, bonusNumber); + } + + private static List makeLottoList(int ticketCount) { + lottoList = new ArrayList<>(); + + for (int i = 0; i < ticketCount; i++) { + lottoList.add(makeLotto()); + } + return lottoList; + } + + private static Lotto makeLotto() { + List lotto = new ArrayList<>(); + lotto = Numbers.randomNumbers(); + System.out.println(lotto); + + return new Lotto(lotto); + } + + private void lottoResult(List lottoList, List winningNumber, int bonusNumber) { + System.out.println("당첨 통계"); + System.out.println("---"); + + Map count = findRank(lottoList, winningNumber, bonusNumber); + printResult(count); + printRate(count, lottoList.size()); + } + + private Map findRank(List lottoList, List winningNumber, int bonusNumber) { + Map count = setCountZero(); + + for (int i = 0; i < lottoList.size(); i++) { + Rank rank = match(lottoList.get(i), winningNumber, bonusNumber); + count.put(rank, count.get(rank) + 1); + } + return count; + } + + private Map setCountZero() { + Map count = new HashMap<>(); + + for (Rank rank : Rank.values()) { + count.put(rank, 0); + } + return count; + } + + private static Rank match(Lotto lotto, List winningNumber, int bonusNumber) { + int countMatch; + boolean containBonus; + List numbers = lotto.getNumbers(); + + countMatch = (int) numbers.stream() + .filter(winningNumber::contains) // 이중콜론 -> 메서드 참조 + .count(); + + containBonus = numbers.contains(bonusNumber); + + return Rank.findRank(countMatch, containBonus); + } + + private static void printResult(Map count) { + for (int i = Rank.values().length - 1; i >= 0; i--) { + Rank.values()[i].printMessage(count.get(Rank.values()[i])); + } + } + + private static void printRate(Map count, int ticketCount) { + double rate = 0; + for (Rank rank : count.keySet()) { + rate = rate + ((double) (rank.getWinningPrice()) / (ticketCount * 1000) * count.get(rank) * 100); + } + OutputView.printRate(rate); + } +} diff --git a/src/main/java/lotto/domain/LottoNumber.java b/src/main/java/lotto/domain/LottoNumber.java new file mode 100644 index 0000000..b1e995b --- /dev/null +++ b/src/main/java/lotto/domain/LottoNumber.java @@ -0,0 +1,34 @@ +package lotto.domain; + +import lotto.Lotto; + +import java.util.ArrayList; +import java.util.List; + +public class LottoNumber { + public final int count; + public final List lottos = new ArrayList<>(); + + public LottoNumber(int money) { + moneyValidate(money); + this.count = money / 1000; + } + + private void moneyValidate(int money) { + if (money <= 0 || money % 1000 != 0) { + throw new IllegalStateException("error"); + } + } + + public void createLotto() { + for (int i = 0; i < count ; i++) { + Lotto lotto = createLottoNumber(); + lottos.add(lotto); + } + } + + public Lotto createLottoNumber() { + List integers = Numbers.randomNumbers(); + return new Lotto(integers); + } +} diff --git a/src/main/java/lotto/domain/Numbers.java b/src/main/java/lotto/domain/Numbers.java new file mode 100644 index 0000000..0272129 --- /dev/null +++ b/src/main/java/lotto/domain/Numbers.java @@ -0,0 +1,16 @@ +package lotto.domain; + +import org.kokodak.Randoms; + +import java.util.ArrayList; +import java.util.Collections; +import java.util.List; + +public class Numbers { + public static List randomNumbers() { + List numberList = Randoms.pickUniqueNumbersInRange(1, 45, 6); + Collections.sort(numberList); + + return numberList; + } +} diff --git a/src/main/java/lotto/domain/Rank.java b/src/main/java/lotto/domain/Rank.java new file mode 100644 index 0000000..faac5df --- /dev/null +++ b/src/main/java/lotto/domain/Rank.java @@ -0,0 +1,44 @@ +package lotto.domain; + +import lotto.view.OutputView; + +import java.util.Arrays; + +public enum Rank { + FIRST(6, 2_000_000_000, "6개 일치 (2,000,000,000원) - ", false), // 1등 + SECOND(5, 30_000_000, "5개 일치, 보너스 볼 일치 (30,000,000원) - ", true), // 2등 + THIRD(5, 1_500_000, "5개 일치 (1,500,000원) - ", false), // 3등 + FOURTH(4, 50_000, "4개 일치 (50,000원) - ", false), // 4등 + FIFTH(3, 5_000, "3개 일치 (5,000원) - ", false), // 5등 + MISS(0, 0, "", false); + + private final int countMatch; + private final int winningPrice; + private final String message; + private final boolean bonus; + + Rank(int countMatch, int winningPrice, String message, boolean bonus) { + this.countMatch = countMatch; + this.winningPrice = winningPrice; + this.message = message; + this.bonus = bonus; + } + + public static Rank findRank(int countMatch, boolean bonus) { + return Arrays.stream(values()) + .filter(rank -> rank.countMatch == countMatch) + .filter(rank -> rank.bonus == bonus) + .findAny() + .orElse(Rank.MISS); + } + + public void printMessage(int count) { + if (this != MISS) { + OutputView.printSuccessMessage(message, count); + } + } + + public int getWinningPrice() { + return winningPrice; + } +} diff --git a/src/main/java/lotto/view/InputView.java b/src/main/java/lotto/view/InputView.java new file mode 100644 index 0000000..371b44b --- /dev/null +++ b/src/main/java/lotto/view/InputView.java @@ -0,0 +1,39 @@ +package lotto.view; + +import lotto.Lotto; +import org.kokodak.Console; + +import java.util.ArrayList; +import java.util.List; + +public class InputView { + + public static String inputMyMoney() { + System.out.println("구입금액을 입력해 주세요."); + return Console.readLine(); + } + + public static List inputWinningNumber() { + System.out.println("당첨 번호를 입력해 주세요."); + return numberList(Console.readLine()); + } + + private static List numberList(String winningNumber) { + String[] numbers = winningNumber.split(","); + ArrayList winningNumberList = new ArrayList(); + for (int i = 0; i < numbers.length; i++) { + winningNumberList.add(Integer.parseInt(numbers[i])); + } + return winningNumberList; + } + + public static int inputBonusNumber(List winningNumber) { + System.out.println("보너스 번호를 입력해 주세요."); + int bonusNumber = Integer.parseInt(Console.readLine()); + if (winningNumber.contains(bonusNumber)) { + throw new IllegalArgumentException(); + } + return bonusNumber; + } + +} diff --git a/src/main/java/lotto/view/OutputView.java b/src/main/java/lotto/view/OutputView.java new file mode 100644 index 0000000..98358f7 --- /dev/null +++ b/src/main/java/lotto/view/OutputView.java @@ -0,0 +1,16 @@ +package lotto.view; + +public class OutputView { + + public static void printTicketCount(int count) { + System.out.println(count + "개를 구매했습니다."); + } + + public static void printSuccessMessage(String message, int count) { + System.out.println(message + count + "개"); + } + + public static void printRate(double rate) { + System.out.println("총 수익률은 " + String.format("%.1f", rate) + "%입니다."); + } +} From 3266826ddd88743a17e325feb2bdcf6014bd39b0 Mon Sep 17 00:00:00 2001 From: tjdgus3488 Date: Fri, 22 Mar 2024 21:28:50 +0900 Subject: [PATCH 3/3] =?UTF-8?q?=EC=97=90=EB=9F=AC=20=EB=AC=B8=EA=B5=AC=20?= =?UTF-8?q?=EC=B6=9C=EB=A0=A5=20=EC=99=84=20+=20=EC=BD=94=EB=93=9C=20?= =?UTF-8?q?=EB=B6=84=EB=A6=AC=20=EB=B0=8F=20=EC=A0=95=EB=A6=AC=20=ED=95=84?= =?UTF-8?q?=EC=9A=94?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/main/java/lotto/Lotto.java | 8 ++++ .../lotto/controller/LottoController.java | 41 +++++++++++++++---- src/main/java/lotto/domain/LottoNumber.java | 10 ++++- src/main/java/lotto/domain/Numbers.java | 3 +- .../java/lotto/view/ExceptionMessage.java | 39 ++++++++++++++++++ src/main/java/lotto/view/InputView.java | 27 ++++++++---- 6 files changed, 109 insertions(+), 19 deletions(-) create mode 100644 src/main/java/lotto/view/ExceptionMessage.java diff --git a/src/main/java/lotto/Lotto.java b/src/main/java/lotto/Lotto.java index e53a58a..84b370f 100644 --- a/src/main/java/lotto/Lotto.java +++ b/src/main/java/lotto/Lotto.java @@ -1,5 +1,8 @@ package lotto; +import lotto.view.ExceptionMessage; + +import java.util.HashSet; import java.util.List; public class Lotto { @@ -14,6 +17,11 @@ private void validate(List numbers) { if (numbers.size() != 6) { throw new IllegalArgumentException(); } + HashSet integers = new HashSet<>(numbers); + if (integers.size() != numbers.size()) { + throw new IllegalArgumentException(); + } + } public List getNumbers() { diff --git a/src/main/java/lotto/controller/LottoController.java b/src/main/java/lotto/controller/LottoController.java index 2c7f3c4..666cddc 100644 --- a/src/main/java/lotto/controller/LottoController.java +++ b/src/main/java/lotto/controller/LottoController.java @@ -4,13 +4,11 @@ import lotto.domain.LottoNumber; import lotto.domain.Numbers; import lotto.domain.Rank; +import lotto.view.ExceptionMessage; import lotto.view.InputView; import lotto.view.OutputView; -import java.util.ArrayList; -import java.util.HashMap; -import java.util.List; -import java.util.Map; +import java.util.*; public class LottoController { @@ -20,22 +18,49 @@ public void run() { try { start(); } catch (IllegalStateException e) { - + System.out.println(e.getMessage()); } } public void start() { - int money = Integer.parseInt(InputView.inputMyMoney()); + int money = InputView.inputMyMoney(); int ticketCount = new LottoNumber(money).count; OutputView.printTicketCount(ticketCount); lottoList = makeLottoList(ticketCount); List winningNumber = InputView.inputWinningNumber(); + validateWinningNumber(winningNumber); int bonusNumber = InputView.inputBonusNumber(winningNumber); - + validateBonusNumber(winningNumber, bonusNumber); lottoResult(lottoList, winningNumber, bonusNumber); } + private void validateWinningNumber(List winningNumber) { + if (winningNumber.size() != 6) { + ExceptionMessage.isCountNotSix(); + throw new IllegalArgumentException(); + } + for (int i = 0; i < winningNumber.size(); i++) { + if (winningNumber.get(i) < 1 || winningNumber.get(i) > 45) { + ExceptionMessage.isNotRange(); + throw new IllegalArgumentException(); + } + } + HashSet numbers = new HashSet<>(winningNumber); + if (winningNumber.size() != numbers.size()) { + ExceptionMessage.isDuplicate(); + throw new IllegalArgumentException(); + } + } + + private void validateBonusNumber(List winningNumber, int bonusNumber) { + if (winningNumber.contains(bonusNumber)) { + ExceptionMessage.isNotPossibleBonus(); + throw new IllegalArgumentException(); + } + } + + private static List makeLottoList(int ticketCount) { lottoList = new ArrayList<>(); @@ -46,7 +71,7 @@ private static List makeLottoList(int ticketCount) { } private static Lotto makeLotto() { - List lotto = new ArrayList<>(); + List lotto; lotto = Numbers.randomNumbers(); System.out.println(lotto); diff --git a/src/main/java/lotto/domain/LottoNumber.java b/src/main/java/lotto/domain/LottoNumber.java index b1e995b..271c7c7 100644 --- a/src/main/java/lotto/domain/LottoNumber.java +++ b/src/main/java/lotto/domain/LottoNumber.java @@ -1,6 +1,7 @@ package lotto.domain; import lotto.Lotto; +import lotto.view.ExceptionMessage; import java.util.ArrayList; import java.util.List; @@ -15,8 +16,13 @@ public LottoNumber(int money) { } private void moneyValidate(int money) { - if (money <= 0 || money % 1000 != 0) { - throw new IllegalStateException("error"); + if (money <= 0) { + ExceptionMessage.isPositive(); + throw new IllegalArgumentException(); + } + if (money % 1000 != 0) { + ExceptionMessage.isDivisible(); + throw new IllegalArgumentException(); } } diff --git a/src/main/java/lotto/domain/Numbers.java b/src/main/java/lotto/domain/Numbers.java index 0272129..9c40e1f 100644 --- a/src/main/java/lotto/domain/Numbers.java +++ b/src/main/java/lotto/domain/Numbers.java @@ -8,7 +8,8 @@ public class Numbers { public static List randomNumbers() { - List numberList = Randoms.pickUniqueNumbersInRange(1, 45, 6); + List numberList = new ArrayList<>(Randoms.pickUniqueNumbersInRange(1, 45, 6)); + // unsupportedoperationexception 에러 -> ArrayList로 받아서 해결 Collections.sort(numberList); return numberList; diff --git a/src/main/java/lotto/view/ExceptionMessage.java b/src/main/java/lotto/view/ExceptionMessage.java new file mode 100644 index 0000000..a2a6ef2 --- /dev/null +++ b/src/main/java/lotto/view/ExceptionMessage.java @@ -0,0 +1,39 @@ +package lotto.view; + +public class ExceptionMessage { + + // 1. 구입 금액 양수 + public static void isPositive() { + System.out.println("[ERROR] 구입 금액은 양수여야 한다."); + } + + // 2. 구입 금액 1000의 배수 + public static void isDivisible() { + System.out.println("[ERROR] 구입 금액은 1000의 배수여야 한다."); + } + + // 3. 입력 숫자 중복 + public static void isDuplicate() { + System.out.println("[ERROR] 로또 번호는 중복되지 않아야 한다."); + } + + //4. 입력 숫자 범위 + public static void isNotRange() { + System.out.println("[ERROR] 로또 번호는 1-45 사이여야 한다."); + } + + // 5. 입력 숫자 개수 6 + public static void isCountNotSix() { + System.out.println("[ERROR] 로또 번호는 6개를 선택해야 한다."); + } + + // 6. 보너스 숫자 중복 + public static void isNotPossibleBonus() { + System.out.println("[ERROR] 보너스 번호는 기존의 번호와 달라야 한다."); + } + + // 7. 숫자가 아닌 입력 + public static void isNotNumber() { + System.out.println("[ERROR] 입력은 숫자여야 한다."); + } +} \ No newline at end of file diff --git a/src/main/java/lotto/view/InputView.java b/src/main/java/lotto/view/InputView.java index 371b44b..626bee2 100644 --- a/src/main/java/lotto/view/InputView.java +++ b/src/main/java/lotto/view/InputView.java @@ -1,6 +1,5 @@ package lotto.view; -import lotto.Lotto; import org.kokodak.Console; import java.util.ArrayList; @@ -8,9 +7,15 @@ public class InputView { - public static String inputMyMoney() { + public static int inputMyMoney() { System.out.println("구입금액을 입력해 주세요."); - return Console.readLine(); + try { + return Integer.parseInt(Console.readLine()); + } catch (NumberFormatException e) { + ExceptionMessage.isNotNumber(); + throw new IllegalArgumentException(); + } + } public static List inputWinningNumber() { @@ -22,18 +27,24 @@ private static List numberList(String winningNumber) { String[] numbers = winningNumber.split(","); ArrayList winningNumberList = new ArrayList(); for (int i = 0; i < numbers.length; i++) { - winningNumberList.add(Integer.parseInt(numbers[i])); + try { + winningNumberList.add(Integer.parseInt(numbers[i])); + } catch (NumberFormatException e){ + ExceptionMessage.isNotNumber(); + throw new IllegalArgumentException(); + } } return winningNumberList; } public static int inputBonusNumber(List winningNumber) { System.out.println("보너스 번호를 입력해 주세요."); - int bonusNumber = Integer.parseInt(Console.readLine()); - if (winningNumber.contains(bonusNumber)) { + try { + return Integer.parseInt(Console.readLine()); + } catch (NumberFormatException e) { + ExceptionMessage.isNotNumber(); throw new IllegalArgumentException(); } - return bonusNumber; } -} +} \ No newline at end of file