From cbc4a7488147d9edd402e521d25bf9b13be9f7e9 Mon Sep 17 00:00:00 2001 From: dradnats1012 Date: Fri, 5 Jul 2024 17:40:27 +0900 Subject: [PATCH 01/10] =?UTF-8?q?1=EB=8B=A8=EA=B3=84=20=EB=AF=B8=EC=85=98?= =?UTF-8?q?=20=EC=99=84=EB=A3=8C?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/main/java/lotto/Constant.java | 10 +++++ src/main/java/lotto/NumberGenerator.java | 8 ++++ .../java/lotto/RandomNumberGenerator.java | 23 ++++++++++ src/main/java/lotto/domain/Lotto.java | 30 +++++++++++++ src/main/java/lotto/domain/LottoGame.java | 42 +++++++++++++++++++ .../java/lotto/message/ConsoleMessage.java | 16 +++++++ src/main/java/lotto/message/ErrorMessage.java | 16 +++++++ src/main/java/lotto/view/InputView.java | 14 +++++++ src/main/java/lotto/view/OutputView.java | 17 ++++++++ src/test/java/lotto/LottoTest.java | 32 ++++++++++++++ .../lotto/mock/Lotto7NumberGenerator.java | 15 +++++++ .../java/lotto/mock/TestNumberGenerator.java | 13 ++++++ 12 files changed, 236 insertions(+) create mode 100644 src/main/java/lotto/Constant.java create mode 100644 src/main/java/lotto/NumberGenerator.java create mode 100644 src/main/java/lotto/RandomNumberGenerator.java create mode 100644 src/main/java/lotto/domain/Lotto.java create mode 100644 src/main/java/lotto/domain/LottoGame.java create mode 100644 src/main/java/lotto/message/ConsoleMessage.java create mode 100644 src/main/java/lotto/message/ErrorMessage.java create mode 100644 src/main/java/lotto/view/InputView.java create mode 100644 src/main/java/lotto/view/OutputView.java create mode 100644 src/test/java/lotto/LottoTest.java create mode 100644 src/test/java/lotto/mock/Lotto7NumberGenerator.java create mode 100644 src/test/java/lotto/mock/TestNumberGenerator.java diff --git a/src/main/java/lotto/Constant.java b/src/main/java/lotto/Constant.java new file mode 100644 index 00000000..c1971371 --- /dev/null +++ b/src/main/java/lotto/Constant.java @@ -0,0 +1,10 @@ +package lotto; + +public final class Constant { + + private Constant() { + } + + public static final int LOTTO_NUM_COUNT = 6; + public static final int LOTTO_PRICE = 1000; +} diff --git a/src/main/java/lotto/NumberGenerator.java b/src/main/java/lotto/NumberGenerator.java new file mode 100644 index 00000000..104ee497 --- /dev/null +++ b/src/main/java/lotto/NumberGenerator.java @@ -0,0 +1,8 @@ +package lotto; + +import java.util.List; + +public interface NumberGenerator { + + List generateLottoNum(); +} diff --git a/src/main/java/lotto/RandomNumberGenerator.java b/src/main/java/lotto/RandomNumberGenerator.java new file mode 100644 index 00000000..f7fc28ff --- /dev/null +++ b/src/main/java/lotto/RandomNumberGenerator.java @@ -0,0 +1,23 @@ +package lotto; + +import java.util.ArrayList; +import java.util.Collections; +import java.util.List; +import java.util.Random; + +public class RandomNumberGenerator implements NumberGenerator{ + + private final Random random = new Random(); + + @Override + public List generateLottoNum() { + List lotto = new ArrayList<>(); + + for(int i = 0; i < Constant.LOTTO_NUM_COUNT; i++){ + lotto.add(random.nextInt(45)); + } + Collections.sort(lotto); + + return lotto; + } +} diff --git a/src/main/java/lotto/domain/Lotto.java b/src/main/java/lotto/domain/Lotto.java new file mode 100644 index 00000000..bbf29ca9 --- /dev/null +++ b/src/main/java/lotto/domain/Lotto.java @@ -0,0 +1,30 @@ +package lotto.domain; + +import java.util.List; + +import lotto.Constant; +import lotto.NumberGenerator; +import lotto.message.ErrorMessage; + +public class Lotto { + + private final NumberGenerator numberGenerator; + + private List lottoNums; + + public Lotto(NumberGenerator numberGenerator){ + this.numberGenerator = numberGenerator; + lottoNums = numberGenerator.generateLottoNum(); // 생성자에서 어디까지의 역할을 해야하는가? + validateLotto(); + } + + public List getLottoNums(){ + return lottoNums; + } + + private void validateLotto(){ + if(lottoNums.size() != Constant.LOTTO_NUM_COUNT){ + throw new IllegalArgumentException(ErrorMessage.INVALID_LOTTO_NUM.getMessage()); + } + } +} diff --git a/src/main/java/lotto/domain/LottoGame.java b/src/main/java/lotto/domain/LottoGame.java new file mode 100644 index 00000000..15245001 --- /dev/null +++ b/src/main/java/lotto/domain/LottoGame.java @@ -0,0 +1,42 @@ +package lotto.domain; + +import java.util.List; + +import lotto.Constant; +import lotto.NumberGenerator; +import lotto.RandomNumberGenerator; +import lotto.message.ErrorMessage; + +public class LottoGame { + private final int price; + private List lottoList; + private final int trial; + private final NumberGenerator numberGenerator = new RandomNumberGenerator(); + + public LottoGame(int price) { + validatePrice(price); + this.price = price; + this.trial = getTrial(); + makeLottoList(); + } + + public List getLottoList() { + return lottoList; + } + + private void makeLottoList() { + for (int i = 0; i < trial; i++) { + lottoList.add(new Lotto(numberGenerator)); + } + } + + private void validatePrice(int price) { + if ((price % 1000) != 0) { + throw new IllegalArgumentException(ErrorMessage.INVALID_MONEY.getMessage()); + } + } + + private int getTrial() { + return price / Constant.LOTTO_PRICE; + } +} diff --git a/src/main/java/lotto/message/ConsoleMessage.java b/src/main/java/lotto/message/ConsoleMessage.java new file mode 100644 index 00000000..bc8c6fc0 --- /dev/null +++ b/src/main/java/lotto/message/ConsoleMessage.java @@ -0,0 +1,16 @@ +package lotto.message; + +public enum ConsoleMessage { + INPUT_MONEY("구입금액을 입력해 주세요."), + COUNT_LOTTO("%d개를 구매했습니다."); + + private final String message; + + ConsoleMessage(String message) { + this.message = message; + } + + public String getMessage() { + return message; + } +} diff --git a/src/main/java/lotto/message/ErrorMessage.java b/src/main/java/lotto/message/ErrorMessage.java new file mode 100644 index 00000000..ae6f1a27 --- /dev/null +++ b/src/main/java/lotto/message/ErrorMessage.java @@ -0,0 +1,16 @@ +package lotto.message; + +public enum ErrorMessage { + INVALID_MONEY("천원 단위로 입력해주세요!"), + INVALID_LOTTO_NUM("로또의 개수가 이상합니다!"); + + private final String message; + + ErrorMessage(String message) { + this.message = message; + } + + public String getMessage() { + return message; + } +} diff --git a/src/main/java/lotto/view/InputView.java b/src/main/java/lotto/view/InputView.java new file mode 100644 index 00000000..b8885f1d --- /dev/null +++ b/src/main/java/lotto/view/InputView.java @@ -0,0 +1,14 @@ +package lotto.view; + +import java.util.Scanner; + +import lotto.message.ConsoleMessage; + +public class InputView { + private static final Scanner scanner = new Scanner(System.in); + + public static int getMoney(){ + System.out.println(ConsoleMessage.INPUT_MONEY.getMessage()); + return scanner.nextInt(); + } +} diff --git a/src/main/java/lotto/view/OutputView.java b/src/main/java/lotto/view/OutputView.java new file mode 100644 index 00000000..d5c1baf4 --- /dev/null +++ b/src/main/java/lotto/view/OutputView.java @@ -0,0 +1,17 @@ +package lotto.view; + +import java.util.List; + +import lotto.domain.Lotto; +import lotto.message.ConsoleMessage; + +public class OutputView { + + public static void printLottoes(List lottoList) { + System.out.printf(ConsoleMessage.COUNT_LOTTO.getMessage(), lottoList.size()); + + for (Lotto lotto : lottoList) { + System.out.println(lotto.getLottoNums()); + } + } +} diff --git a/src/test/java/lotto/LottoTest.java b/src/test/java/lotto/LottoTest.java new file mode 100644 index 00000000..618aaf9a --- /dev/null +++ b/src/test/java/lotto/LottoTest.java @@ -0,0 +1,32 @@ +package lotto; + +import static org.assertj.core.api.Assertions.assertThat; +import static org.assertj.core.api.Assertions.assertThatThrownBy; + +import org.junit.jupiter.api.DisplayName; +import org.junit.jupiter.api.Test; + +import lotto.domain.Lotto; +import lotto.mock.Lotto7NumberGenerator; + +class LottoTest { + + private final NumberGenerator numberGenerator = new RandomNumberGenerator(); + private final NumberGenerator numberGenerator7 = new Lotto7NumberGenerator(); + + @Test + @DisplayName("로또번호 개수 확인") + void checkLottoCount6() { + Lotto lotto = new Lotto(numberGenerator); + assertThat(lotto.getLottoNums()).hasSize(6); + } + + @Test + @DisplayName("로또번호 개수가 6이 아니면 오류") + void checkLottoCount() { + assertThatThrownBy(() -> { + Lotto lotto = new Lotto(numberGenerator7); + } + ).isInstanceOf(IllegalArgumentException.class); + } +} diff --git a/src/test/java/lotto/mock/Lotto7NumberGenerator.java b/src/test/java/lotto/mock/Lotto7NumberGenerator.java new file mode 100644 index 00000000..dfdc89d4 --- /dev/null +++ b/src/test/java/lotto/mock/Lotto7NumberGenerator.java @@ -0,0 +1,15 @@ +package lotto.mock; + +import java.util.List; + +import org.junit.jupiter.api.Nested; + +import lotto.NumberGenerator; + +public class Lotto7NumberGenerator implements NumberGenerator { + + @Override + public List generateLottoNum() { + return List.of(1, 2, 3, 4, 5, 6, 7); + } +} diff --git a/src/test/java/lotto/mock/TestNumberGenerator.java b/src/test/java/lotto/mock/TestNumberGenerator.java new file mode 100644 index 00000000..d8bda12f --- /dev/null +++ b/src/test/java/lotto/mock/TestNumberGenerator.java @@ -0,0 +1,13 @@ +package lotto.mock; + +import java.util.List; + +import lotto.NumberGenerator; + +public class TestNumberGenerator implements NumberGenerator { + + @Override + public List generateLottoNum() { + return List.of(1, 2, 3, 4, 5, 6); + } +} From a4e03cacfa6222ffa82b9e3b8678049f7721cf80 Mon Sep 17 00:00:00 2001 From: dradnats1012 Date: Fri, 5 Jul 2024 17:41:35 +0900 Subject: [PATCH 02/10] =?UTF-8?q?private=20=EC=83=9D=EC=84=B1=EC=9E=90=20?= =?UTF-8?q?=EC=B6=94=EA=B0=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/main/java/lotto/view/InputView.java | 6 +++++- src/main/java/lotto/view/OutputView.java | 3 +++ 2 files changed, 8 insertions(+), 1 deletion(-) diff --git a/src/main/java/lotto/view/InputView.java b/src/main/java/lotto/view/InputView.java index b8885f1d..b0893f59 100644 --- a/src/main/java/lotto/view/InputView.java +++ b/src/main/java/lotto/view/InputView.java @@ -5,9 +5,13 @@ import lotto.message.ConsoleMessage; public class InputView { + + private InputView() { + } + private static final Scanner scanner = new Scanner(System.in); - public static int getMoney(){ + public static int getMoney() { System.out.println(ConsoleMessage.INPUT_MONEY.getMessage()); return scanner.nextInt(); } diff --git a/src/main/java/lotto/view/OutputView.java b/src/main/java/lotto/view/OutputView.java index d5c1baf4..e74e6fc6 100644 --- a/src/main/java/lotto/view/OutputView.java +++ b/src/main/java/lotto/view/OutputView.java @@ -7,6 +7,9 @@ public class OutputView { + private OutputView() { + } + public static void printLottoes(List lottoList) { System.out.printf(ConsoleMessage.COUNT_LOTTO.getMessage(), lottoList.size()); From da62a3fa0926fae2b196cd61e280b92f3958d83d Mon Sep 17 00:00:00 2001 From: dradnats1012 Date: Sun, 7 Jul 2024 00:41:33 +0900 Subject: [PATCH 03/10] =?UTF-8?q?RandomNumberGenerator=20=EB=B2=88?= =?UTF-8?q?=ED=98=B8=20=EC=83=9D=EC=84=B1=20=EB=B0=A9=EC=8B=9D=20=EC=88=98?= =?UTF-8?q?=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/main/java/lotto/Application.java | 10 ++++ src/main/java/lotto/Constant.java | 13 +++++ src/main/java/lotto/Rank.java | 42 +++++++++++++++ .../java/lotto/controller/Controller.java | 26 ++++++++++ src/main/java/lotto/domain/CheckPlace.java | 51 +++++++++++++++++++ src/main/java/lotto/domain/Lotto.java | 2 +- src/main/java/lotto/domain/LottoGame.java | 11 ++-- src/main/java/lotto/domain/Result.java | 35 +++++++++++++ src/main/java/lotto/domain/Reward.java | 36 +++++++++++++ src/main/java/lotto/domain/WinNums.java | 21 ++++++++ .../{ => generator}/NumberGenerator.java | 2 +- .../RandomNumberGenerator.java | 14 +++-- .../java/lotto/message/ConsoleMessage.java | 7 ++- src/main/java/lotto/view/InputView.java | 26 +++++++++- src/main/java/lotto/view/OutputView.java | 18 ++++++- src/test/java/lotto/LottoTest.java | 2 + .../lotto/mock/Lotto7NumberGenerator.java | 4 +- .../java/lotto/mock/TestNumberGenerator.java | 2 +- 18 files changed, 304 insertions(+), 18 deletions(-) create mode 100644 src/main/java/lotto/Application.java create mode 100644 src/main/java/lotto/Rank.java create mode 100644 src/main/java/lotto/controller/Controller.java create mode 100644 src/main/java/lotto/domain/CheckPlace.java create mode 100644 src/main/java/lotto/domain/Result.java create mode 100644 src/main/java/lotto/domain/Reward.java create mode 100644 src/main/java/lotto/domain/WinNums.java rename src/main/java/lotto/{ => generator}/NumberGenerator.java (80%) rename src/main/java/lotto/{ => generator}/RandomNumberGenerator.java (52%) diff --git a/src/main/java/lotto/Application.java b/src/main/java/lotto/Application.java new file mode 100644 index 00000000..bd006947 --- /dev/null +++ b/src/main/java/lotto/Application.java @@ -0,0 +1,10 @@ +package lotto; + +import lotto.controller.Controller; + +public class Application { + public static void main(String[] args) { + Controller controller = new Controller(); + controller.run(); + } +} diff --git a/src/main/java/lotto/Constant.java b/src/main/java/lotto/Constant.java index c1971371..59fb31d8 100644 --- a/src/main/java/lotto/Constant.java +++ b/src/main/java/lotto/Constant.java @@ -6,5 +6,18 @@ private Constant() { } public static final int LOTTO_NUM_COUNT = 6; + public static final int LOTTO_PRICE = 1000; + + public static final int NO_REWARD = 0; + + public static final int FIFTH_REWARD = 5000; + + public static final int FOURTH_REWARD = 50000; + + public static final int THIRD_REWARD = 1500000; + + public static final int SECOND_REWARD = 30000000; + + public static final int FIRST_REWARD = 2000000000; } diff --git a/src/main/java/lotto/Rank.java b/src/main/java/lotto/Rank.java new file mode 100644 index 00000000..dc9ede16 --- /dev/null +++ b/src/main/java/lotto/Rank.java @@ -0,0 +1,42 @@ +package lotto; + +public enum Rank { + _1ST_PLACE(6, false, Constant.FIRST_REWARD), + _2ND_PLACE(5, true, Constant.SECOND_REWARD), + _3RD_PLACE(5, false, Constant.THIRD_REWARD), + _4TH_PLACE(4, false, Constant.FOURTH_REWARD), + _5TH_PLACE(3, false, Constant.FIFTH_REWARD), + _NO_PLACE(0, false, Constant.NO_REWARD); + + private final int match; + private final boolean bonus; + private final int reward; + + Rank(int match, boolean bonus, int reward) { + this.match = match; + this.bonus = bonus; + this.reward = reward; + } + + public static Rank of(int match, boolean bonus) { + for (Rank rank : Rank.values()) { + if (rank.match == match && rank.bonus == bonus) { + return rank; + } + } + + return _NO_PLACE; + } + + public int getMatch() { + return match; + } + + public boolean getBonus() { + return bonus; + } + + public int getReward() { + return reward; + } +} diff --git a/src/main/java/lotto/controller/Controller.java b/src/main/java/lotto/controller/Controller.java new file mode 100644 index 00000000..a1a672c1 --- /dev/null +++ b/src/main/java/lotto/controller/Controller.java @@ -0,0 +1,26 @@ +package lotto.controller; + +import lotto.domain.CheckPlace; +import lotto.domain.Reward; +import lotto.domain.WinNums; +import lotto.generator.NumberGenerator; +import lotto.generator.RandomNumberGenerator; +import lotto.domain.LottoGame; +import lotto.view.InputView; +import lotto.view.OutputView; + +public class Controller { + + private final NumberGenerator numberGenerator = new RandomNumberGenerator(); + + public void run() { + int inputMoney = InputView.getMoney(); + LottoGame lottoGame = new LottoGame(inputMoney, numberGenerator); + OutputView.printLottoes(lottoGame.getLottoList()); + WinNums winNums = new WinNums(InputView.getWinLotto(), InputView.getBonusBall()); + CheckPlace checkPlace = new CheckPlace(lottoGame, winNums); + OutputView.printStatistics(checkPlace.getResultMap()); + Reward reward = new Reward(checkPlace.getResult(), inputMoney); + OutputView.printReward(reward.getRate()); + } +} diff --git a/src/main/java/lotto/domain/CheckPlace.java b/src/main/java/lotto/domain/CheckPlace.java new file mode 100644 index 00000000..3d02a35a --- /dev/null +++ b/src/main/java/lotto/domain/CheckPlace.java @@ -0,0 +1,51 @@ +package lotto.domain; + +import java.util.List; +import java.util.Map; + +import lotto.Rank; + +public class CheckPlace { + private WinNums winNums; + private Result result; + private List lottoList; + private List winList; + + public CheckPlace(LottoGame lottoGame, WinNums winNums) { + this.winNums = winNums; + this.lottoList = lottoGame.getLottoList(); + this.winList = winNums.getWinNums(); + result = new Result(); + } + + public Map getResultMap() { + checkNum(); + return result.getResult(); + } + + private void checkNum() { + int match; + boolean isBonus; + + for (Lotto lotto : lottoList) { + match = 0; + isBonus = false; + for (int num : winList) { + if (lotto.getLottoNums().contains(num)) { + match++; + } + } + if (lotto.getLottoNums().contains(winNums.getBonusNum())) { + isBonus = true; + } + + if (match >= 3) { + result.addResult(Rank.of(match, isBonus)); + } + } + } + + public Result getResult(){ + return result; + } +} diff --git a/src/main/java/lotto/domain/Lotto.java b/src/main/java/lotto/domain/Lotto.java index bbf29ca9..d964676a 100644 --- a/src/main/java/lotto/domain/Lotto.java +++ b/src/main/java/lotto/domain/Lotto.java @@ -3,7 +3,7 @@ import java.util.List; import lotto.Constant; -import lotto.NumberGenerator; +import lotto.generator.NumberGenerator; import lotto.message.ErrorMessage; public class Lotto { diff --git a/src/main/java/lotto/domain/LottoGame.java b/src/main/java/lotto/domain/LottoGame.java index 15245001..3c76a729 100644 --- a/src/main/java/lotto/domain/LottoGame.java +++ b/src/main/java/lotto/domain/LottoGame.java @@ -1,22 +1,23 @@ package lotto.domain; +import java.util.ArrayList; import java.util.List; import lotto.Constant; -import lotto.NumberGenerator; -import lotto.RandomNumberGenerator; +import lotto.generator.NumberGenerator; import lotto.message.ErrorMessage; public class LottoGame { private final int price; - private List lottoList; + private final List lottoList = new ArrayList<>(); private final int trial; - private final NumberGenerator numberGenerator = new RandomNumberGenerator(); + private final NumberGenerator numberGenerator; - public LottoGame(int price) { + public LottoGame(int price, NumberGenerator numberGenerator) { validatePrice(price); this.price = price; this.trial = getTrial(); + this.numberGenerator = numberGenerator; makeLottoList(); } diff --git a/src/main/java/lotto/domain/Result.java b/src/main/java/lotto/domain/Result.java new file mode 100644 index 00000000..f22fb8d8 --- /dev/null +++ b/src/main/java/lotto/domain/Result.java @@ -0,0 +1,35 @@ +package lotto.domain; + +import java.util.LinkedHashMap; +import java.util.List; +import java.util.Map; + +import lotto.Rank; + +public class Result { + Map result = new LinkedHashMap<>(); + + public Result() { + makeEmptyResult(); + } + + private void makeEmptyResult() { + List ranks = List.of(Rank.values()); + for (int i = ranks.size() - 1; i >= 0; i--) { + Rank rank = ranks.get(i); + if (rank != Rank._NO_PLACE) { + result.put(rank, 0); + } + } + } + + public void addResult(Rank rank) { + System.out.println(rank); + System.out.println(result.get(rank)); + result.put(rank, result.get(rank) + 1); + } + + public Map getResult() { + return result; + } +} diff --git a/src/main/java/lotto/domain/Reward.java b/src/main/java/lotto/domain/Reward.java new file mode 100644 index 00000000..f2bdda59 --- /dev/null +++ b/src/main/java/lotto/domain/Reward.java @@ -0,0 +1,36 @@ +package lotto.domain; + +import java.util.Map; + +import lotto.Rank; + +public class Reward { + private final int inputMoney; + private double rewardRate; + private int totalReward; + private Map resultMap; + + public Reward(Result result, int inputMoney) { + this.inputMoney = inputMoney; + this.resultMap = result.getResult(); + } + + private void caculateTotalReward() { + resultMap.forEach((rank, value) -> + totalReward += rank.getReward() * value); + } + + private String calculate() { + caculateTotalReward(); + + if (totalReward == 0) { + return "0"; + } + rewardRate = (double) totalReward / inputMoney; + return String.format("%.2f", rewardRate); + } + + public String getRate() { + return calculate(); + } +} diff --git a/src/main/java/lotto/domain/WinNums.java b/src/main/java/lotto/domain/WinNums.java new file mode 100644 index 00000000..0efca595 --- /dev/null +++ b/src/main/java/lotto/domain/WinNums.java @@ -0,0 +1,21 @@ +package lotto.domain; + +import java.util.List; + +public class WinNums { + private List winNums; + private int bonusNum; + + public WinNums(List winNums, int bonusNum) { + this.winNums = winNums; + this.bonusNum = bonusNum; + } + + public List getWinNums() { + return winNums; + } + + public int getBonusNum() { + return bonusNum; + } +} diff --git a/src/main/java/lotto/NumberGenerator.java b/src/main/java/lotto/generator/NumberGenerator.java similarity index 80% rename from src/main/java/lotto/NumberGenerator.java rename to src/main/java/lotto/generator/NumberGenerator.java index 104ee497..096d5267 100644 --- a/src/main/java/lotto/NumberGenerator.java +++ b/src/main/java/lotto/generator/NumberGenerator.java @@ -1,4 +1,4 @@ -package lotto; +package lotto.generator; import java.util.List; diff --git a/src/main/java/lotto/RandomNumberGenerator.java b/src/main/java/lotto/generator/RandomNumberGenerator.java similarity index 52% rename from src/main/java/lotto/RandomNumberGenerator.java rename to src/main/java/lotto/generator/RandomNumberGenerator.java index f7fc28ff..832b99b9 100644 --- a/src/main/java/lotto/RandomNumberGenerator.java +++ b/src/main/java/lotto/generator/RandomNumberGenerator.java @@ -1,20 +1,26 @@ -package lotto; +package lotto.generator; import java.util.ArrayList; import java.util.Collections; import java.util.List; import java.util.Random; -public class RandomNumberGenerator implements NumberGenerator{ +import lotto.Constant; + +public class RandomNumberGenerator implements NumberGenerator { private final Random random = new Random(); @Override public List generateLottoNum() { List lotto = new ArrayList<>(); + int num; - for(int i = 0; i < Constant.LOTTO_NUM_COUNT; i++){ - lotto.add(random.nextInt(45)); + while(lotto.size() != Constant.LOTTO_NUM_COUNT){ + num = random.nextInt(45) + 1; + if (!lotto.contains(num)) { + lotto.add(num); + } } Collections.sort(lotto); diff --git a/src/main/java/lotto/message/ConsoleMessage.java b/src/main/java/lotto/message/ConsoleMessage.java index bc8c6fc0..4ce647c9 100644 --- a/src/main/java/lotto/message/ConsoleMessage.java +++ b/src/main/java/lotto/message/ConsoleMessage.java @@ -2,7 +2,12 @@ public enum ConsoleMessage { INPUT_MONEY("구입금액을 입력해 주세요."), - COUNT_LOTTO("%d개를 구매했습니다."); + COUNT_LOTTO("%d개를 구매했습니다."), + LAST_WIN_NUM("지난 주 당첨 번호를 입력해 주세요."), + WINNING_STATISTICS("당첨 통계"), + CHECK_SAME("%d개 일치 (%d원) - %d개"), + REWARD_RATE("총 수익률은 %s입니다."), + INPUT_BONUS("보너스 볼을 입력해 주세요."); private final String message; diff --git a/src/main/java/lotto/view/InputView.java b/src/main/java/lotto/view/InputView.java index b0893f59..4182551d 100644 --- a/src/main/java/lotto/view/InputView.java +++ b/src/main/java/lotto/view/InputView.java @@ -1,6 +1,10 @@ package lotto.view; +import java.io.Console; +import java.util.ArrayList; +import java.util.List; import java.util.Scanner; +import java.util.StringTokenizer; import lotto.message.ConsoleMessage; @@ -13,6 +17,26 @@ private InputView() { public static int getMoney() { System.out.println(ConsoleMessage.INPUT_MONEY.getMessage()); - return scanner.nextInt(); + Integer inputMoney = Integer.parseInt(scanner.nextLine()); + return inputMoney; + } + + public static List getWinLotto() { + System.out.println("\n" + ConsoleMessage.LAST_WIN_NUM.getMessage()); + String winNum = scanner.nextLine(); + List splitString = List.of(winNum.split(",")); + List winNums = new ArrayList<>(); + + for (String num : splitString) { + winNums.add(Integer.parseInt(num)); + } + + return winNums; + } + + public static int getBonusBall() { + System.out.println("\n" + ConsoleMessage.INPUT_BONUS.getMessage()); + + return Integer.parseInt(scanner.nextLine()); } } diff --git a/src/main/java/lotto/view/OutputView.java b/src/main/java/lotto/view/OutputView.java index e74e6fc6..31e95fa2 100644 --- a/src/main/java/lotto/view/OutputView.java +++ b/src/main/java/lotto/view/OutputView.java @@ -1,7 +1,9 @@ package lotto.view; import java.util.List; +import java.util.Map; +import lotto.Rank; import lotto.domain.Lotto; import lotto.message.ConsoleMessage; @@ -11,10 +13,24 @@ private OutputView() { } public static void printLottoes(List lottoList) { - System.out.printf(ConsoleMessage.COUNT_LOTTO.getMessage(), lottoList.size()); + System.out.printf("\n" + ConsoleMessage.COUNT_LOTTO.getMessage() + "\n", lottoList.size()); for (Lotto lotto : lottoList) { System.out.println(lotto.getLottoNums()); } } + + public static void printStatistics(Map resultMap) { + System.out.println("\n" + ConsoleMessage.WINNING_STATISTICS.getMessage()); + System.out.println("--------"); + + resultMap.forEach(((rank, integer) -> { + System.out.printf(ConsoleMessage.CHECK_SAME.getMessage() + "\n" + , rank.getMatch(), rank.getReward(), integer); + })); + } + + public static void printReward(String rewardRate){ + System.out.printf(ConsoleMessage.REWARD_RATE.getMessage(), rewardRate); + } } diff --git a/src/test/java/lotto/LottoTest.java b/src/test/java/lotto/LottoTest.java index 618aaf9a..ffd18676 100644 --- a/src/test/java/lotto/LottoTest.java +++ b/src/test/java/lotto/LottoTest.java @@ -7,6 +7,8 @@ import org.junit.jupiter.api.Test; import lotto.domain.Lotto; +import lotto.generator.NumberGenerator; +import lotto.generator.RandomNumberGenerator; import lotto.mock.Lotto7NumberGenerator; class LottoTest { diff --git a/src/test/java/lotto/mock/Lotto7NumberGenerator.java b/src/test/java/lotto/mock/Lotto7NumberGenerator.java index dfdc89d4..5a9fc1b7 100644 --- a/src/test/java/lotto/mock/Lotto7NumberGenerator.java +++ b/src/test/java/lotto/mock/Lotto7NumberGenerator.java @@ -2,9 +2,7 @@ import java.util.List; -import org.junit.jupiter.api.Nested; - -import lotto.NumberGenerator; +import lotto.generator.NumberGenerator; public class Lotto7NumberGenerator implements NumberGenerator { diff --git a/src/test/java/lotto/mock/TestNumberGenerator.java b/src/test/java/lotto/mock/TestNumberGenerator.java index d8bda12f..e45e2783 100644 --- a/src/test/java/lotto/mock/TestNumberGenerator.java +++ b/src/test/java/lotto/mock/TestNumberGenerator.java @@ -2,7 +2,7 @@ import java.util.List; -import lotto.NumberGenerator; +import lotto.generator.NumberGenerator; public class TestNumberGenerator implements NumberGenerator { From 8931dd2a1c64576d84d5cebb7cbe0088f3d5bdb7 Mon Sep 17 00:00:00 2001 From: dradnats1012 Date: Mon, 8 Jul 2024 17:48:29 +0900 Subject: [PATCH 04/10] =?UTF-8?q?4=EB=8B=A8=EA=B3=84=20=EB=AF=B8=EC=85=98?= =?UTF-8?q?=20=EA=B5=AC=ED=98=84?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../java/lotto/controller/Controller.java | 7 ++-- src/main/java/lotto/domain/CheckPlace.java | 4 +-- src/main/java/lotto/domain/CustomLotto.java | 28 +++++++++++++++ src/main/java/lotto/domain/Lotto.java | 14 +++++--- src/main/java/lotto/domain/LottoGame.java | 10 ++++-- src/main/java/lotto/domain/Result.java | 2 -- src/main/java/lotto/domain/Reward.java | 3 +- .../generator/RandomNumberGenerator.java | 2 +- .../java/lotto/message/ConsoleMessage.java | 8 +++-- src/main/java/lotto/view/InputView.java | 35 +++++++++++++++---- src/main/java/lotto/view/OutputView.java | 16 ++++++--- 11 files changed, 100 insertions(+), 29 deletions(-) create mode 100644 src/main/java/lotto/domain/CustomLotto.java diff --git a/src/main/java/lotto/controller/Controller.java b/src/main/java/lotto/controller/Controller.java index a1a672c1..dbc978da 100644 --- a/src/main/java/lotto/controller/Controller.java +++ b/src/main/java/lotto/controller/Controller.java @@ -1,6 +1,7 @@ package lotto.controller; import lotto.domain.CheckPlace; +import lotto.domain.CustomLotto; import lotto.domain.Reward; import lotto.domain.WinNums; import lotto.generator.NumberGenerator; @@ -15,8 +16,10 @@ public class Controller { public void run() { int inputMoney = InputView.getMoney(); - LottoGame lottoGame = new LottoGame(inputMoney, numberGenerator); - OutputView.printLottoes(lottoGame.getLottoList()); + int customCount = InputView.getCustomLottoCount(); + CustomLotto customLotto = new CustomLotto(InputView.getCustomLotto(customCount)); + LottoGame lottoGame = new LottoGame(inputMoney, numberGenerator, customLotto); + OutputView.printLottoes(customCount, lottoGame.getLottoList()); WinNums winNums = new WinNums(InputView.getWinLotto(), InputView.getBonusBall()); CheckPlace checkPlace = new CheckPlace(lottoGame, winNums); OutputView.printStatistics(checkPlace.getResultMap()); diff --git a/src/main/java/lotto/domain/CheckPlace.java b/src/main/java/lotto/domain/CheckPlace.java index 3d02a35a..fdffce2f 100644 --- a/src/main/java/lotto/domain/CheckPlace.java +++ b/src/main/java/lotto/domain/CheckPlace.java @@ -35,7 +35,7 @@ private void checkNum() { match++; } } - if (lotto.getLottoNums().contains(winNums.getBonusNum())) { + if (match == 5 && lotto.getLottoNums().contains(winNums.getBonusNum())) { isBonus = true; } @@ -45,7 +45,7 @@ private void checkNum() { } } - public Result getResult(){ + public Result getResult() { return result; } } diff --git a/src/main/java/lotto/domain/CustomLotto.java b/src/main/java/lotto/domain/CustomLotto.java new file mode 100644 index 00000000..0f8c6f4e --- /dev/null +++ b/src/main/java/lotto/domain/CustomLotto.java @@ -0,0 +1,28 @@ +package lotto.domain; + +import java.util.ArrayList; +import java.util.List; + +public class CustomLotto { + private final List lottoList = new ArrayList<>(); + private final List> customLottoes; + + public CustomLotto(List> customLottoes) { + this.customLottoes = customLottoes; + makeCustomLottoes(); + } + + private void makeCustomLottoes() { + for (List lotto : customLottoes) { + lottoList.add(new Lotto(lotto)); + } + } + + public List getCustomLottoList() { + return lottoList; + } + + public int getCustomLottoCount() { + return lottoList.size(); + } +} diff --git a/src/main/java/lotto/domain/Lotto.java b/src/main/java/lotto/domain/Lotto.java index d964676a..25d82a70 100644 --- a/src/main/java/lotto/domain/Lotto.java +++ b/src/main/java/lotto/domain/Lotto.java @@ -12,18 +12,24 @@ public class Lotto { private List lottoNums; - public Lotto(NumberGenerator numberGenerator){ + public Lotto(NumberGenerator numberGenerator) { this.numberGenerator = numberGenerator; lottoNums = numberGenerator.generateLottoNum(); // 생성자에서 어디까지의 역할을 해야하는가? validateLotto(); } - public List getLottoNums(){ + public Lotto(List lottoNums) { + this.numberGenerator = null; + this.lottoNums = lottoNums; + validateLotto(); + } + + public List getLottoNums() { return lottoNums; } - private void validateLotto(){ - if(lottoNums.size() != Constant.LOTTO_NUM_COUNT){ + private void validateLotto() { + if (lottoNums.size() != Constant.LOTTO_NUM_COUNT) { throw new IllegalArgumentException(ErrorMessage.INVALID_LOTTO_NUM.getMessage()); } } diff --git a/src/main/java/lotto/domain/LottoGame.java b/src/main/java/lotto/domain/LottoGame.java index 3c76a729..59206c3b 100644 --- a/src/main/java/lotto/domain/LottoGame.java +++ b/src/main/java/lotto/domain/LottoGame.java @@ -12,12 +12,14 @@ public class LottoGame { private final List lottoList = new ArrayList<>(); private final int trial; private final NumberGenerator numberGenerator; + private final CustomLotto customLotto; - public LottoGame(int price, NumberGenerator numberGenerator) { + public LottoGame(int price, NumberGenerator numberGenerator, CustomLotto customLotto) { validatePrice(price); this.price = price; this.trial = getTrial(); this.numberGenerator = numberGenerator; + this.customLotto = customLotto; makeLottoList(); } @@ -26,7 +28,11 @@ public List getLottoList() { } private void makeLottoList() { - for (int i = 0; i < trial; i++) { + for (Lotto customLotto : customLotto.getCustomLottoList()) { + lottoList.add(customLotto); + } + + for (int j = 0; j < trial - customLotto.getCustomLottoCount(); j++) { lottoList.add(new Lotto(numberGenerator)); } } diff --git a/src/main/java/lotto/domain/Result.java b/src/main/java/lotto/domain/Result.java index f22fb8d8..fad28aad 100644 --- a/src/main/java/lotto/domain/Result.java +++ b/src/main/java/lotto/domain/Result.java @@ -24,8 +24,6 @@ private void makeEmptyResult() { } public void addResult(Rank rank) { - System.out.println(rank); - System.out.println(result.get(rank)); result.put(rank, result.get(rank) + 1); } diff --git a/src/main/java/lotto/domain/Reward.java b/src/main/java/lotto/domain/Reward.java index f2bdda59..8e4ad9f1 100644 --- a/src/main/java/lotto/domain/Reward.java +++ b/src/main/java/lotto/domain/Reward.java @@ -6,7 +6,6 @@ public class Reward { private final int inputMoney; - private double rewardRate; private int totalReward; private Map resultMap; @@ -26,7 +25,7 @@ private String calculate() { if (totalReward == 0) { return "0"; } - rewardRate = (double) totalReward / inputMoney; + double rewardRate = (double)totalReward / inputMoney; return String.format("%.2f", rewardRate); } diff --git a/src/main/java/lotto/generator/RandomNumberGenerator.java b/src/main/java/lotto/generator/RandomNumberGenerator.java index 832b99b9..d3274d26 100644 --- a/src/main/java/lotto/generator/RandomNumberGenerator.java +++ b/src/main/java/lotto/generator/RandomNumberGenerator.java @@ -16,7 +16,7 @@ public List generateLottoNum() { List lotto = new ArrayList<>(); int num; - while(lotto.size() != Constant.LOTTO_NUM_COUNT){ + while (lotto.size() != Constant.LOTTO_NUM_COUNT) { num = random.nextInt(45) + 1; if (!lotto.contains(num)) { lotto.add(num); diff --git a/src/main/java/lotto/message/ConsoleMessage.java b/src/main/java/lotto/message/ConsoleMessage.java index 4ce647c9..974c8174 100644 --- a/src/main/java/lotto/message/ConsoleMessage.java +++ b/src/main/java/lotto/message/ConsoleMessage.java @@ -2,12 +2,16 @@ public enum ConsoleMessage { INPUT_MONEY("구입금액을 입력해 주세요."), - COUNT_LOTTO("%d개를 구매했습니다."), + COUNT_LOTTO("수동으로 %d장, 자동으로 %d개를 구매했습니다."), LAST_WIN_NUM("지난 주 당첨 번호를 입력해 주세요."), WINNING_STATISTICS("당첨 통계"), CHECK_SAME("%d개 일치 (%d원) - %d개"), + CHECK_SAME_2ND("%d개 일치, 보너스 볼 일치 (%d원) -%d개"), REWARD_RATE("총 수익률은 %s입니다."), - INPUT_BONUS("보너스 볼을 입력해 주세요."); + INPUT_BONUS("보너스 볼을 입력해 주세요."), + CUSTOM_LOTTO_COUNT("수동으로 구매할 로또 수를 입력해 주세요."), + CUSTOM_LOTTO_INPUT("수동으로 구매할 번호를 입력해 주세요.") + ; private final String message; diff --git a/src/main/java/lotto/view/InputView.java b/src/main/java/lotto/view/InputView.java index 4182551d..8f126e3c 100644 --- a/src/main/java/lotto/view/InputView.java +++ b/src/main/java/lotto/view/InputView.java @@ -2,9 +2,11 @@ import java.io.Console; import java.util.ArrayList; +import java.util.Arrays; import java.util.List; import java.util.Scanner; import java.util.StringTokenizer; +import java.util.stream.Collectors; import lotto.message.ConsoleMessage; @@ -24,14 +26,11 @@ public static int getMoney() { public static List getWinLotto() { System.out.println("\n" + ConsoleMessage.LAST_WIN_NUM.getMessage()); String winNum = scanner.nextLine(); - List splitString = List.of(winNum.split(",")); - List winNums = new ArrayList<>(); - for (String num : splitString) { - winNums.add(Integer.parseInt(num)); - } - - return winNums; + return Arrays.stream(winNum.split(",")) + .map(String::trim) + .map(Integer::parseInt) + .collect(Collectors.toList()); } public static int getBonusBall() { @@ -39,4 +38,26 @@ public static int getBonusBall() { return Integer.parseInt(scanner.nextLine()); } + + public static int getCustomLottoCount() { + System.out.println("\n" + ConsoleMessage.CUSTOM_LOTTO_COUNT.getMessage()); + return Integer.parseInt(scanner.nextLine()); + } + + public static List> getCustomLotto(int customLottoCount) { + System.out.println("\n" + ConsoleMessage.CUSTOM_LOTTO_INPUT.getMessage()); + String winNum; + List> customLottos = new ArrayList<>(new ArrayList<>()); + + for (int i = 0; i < customLottoCount; i++) { + winNum = scanner.nextLine(); + + customLottos.add(Arrays.stream(winNum.split(",")) + .map(String::trim) + .map(Integer::parseInt) + .collect(Collectors.toList())); + } + + return customLottos; + } } diff --git a/src/main/java/lotto/view/OutputView.java b/src/main/java/lotto/view/OutputView.java index 31e95fa2..47739108 100644 --- a/src/main/java/lotto/view/OutputView.java +++ b/src/main/java/lotto/view/OutputView.java @@ -12,8 +12,9 @@ public class OutputView { private OutputView() { } - public static void printLottoes(List lottoList) { - System.out.printf("\n" + ConsoleMessage.COUNT_LOTTO.getMessage() + "\n", lottoList.size()); + public static void printLottoes(int customCount, List lottoList) { + System.out.printf("\n" + ConsoleMessage.COUNT_LOTTO.getMessage() + "\n", customCount, + lottoList.size() - customCount); for (Lotto lotto : lottoList) { System.out.println(lotto.getLottoNums()); @@ -25,12 +26,17 @@ public static void printStatistics(Map resultMap) { System.out.println("--------"); resultMap.forEach(((rank, integer) -> { - System.out.printf(ConsoleMessage.CHECK_SAME.getMessage() + "\n" - , rank.getMatch(), rank.getReward(), integer); + if (rank.equals(Rank._2ND_PLACE)) { + System.out.printf(ConsoleMessage.CHECK_SAME_2ND.getMessage() + "\n" + , rank.getMatch(), rank.getReward(), integer); + } else { + System.out.printf(ConsoleMessage.CHECK_SAME.getMessage() + "\n" + , rank.getMatch(), rank.getReward(), integer); + } })); } - public static void printReward(String rewardRate){ + public static void printReward(String rewardRate) { System.out.printf(ConsoleMessage.REWARD_RATE.getMessage(), rewardRate); } } From 332400e81549b058f214b89435b411f38fa88481 Mon Sep 17 00:00:00 2001 From: dradnats1012 Date: Mon, 8 Jul 2024 17:59:50 +0900 Subject: [PATCH 05/10] =?UTF-8?q?style:=20=EC=95=88=EC=93=B0=EB=8A=94=20im?= =?UTF-8?q?port=EB=AC=B8=20=EC=A0=9C=EA=B1=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/main/java/lotto/view/InputView.java | 5 +---- 1 file changed, 1 insertion(+), 4 deletions(-) diff --git a/src/main/java/lotto/view/InputView.java b/src/main/java/lotto/view/InputView.java index 8f126e3c..ec279ece 100644 --- a/src/main/java/lotto/view/InputView.java +++ b/src/main/java/lotto/view/InputView.java @@ -1,11 +1,9 @@ package lotto.view; -import java.io.Console; import java.util.ArrayList; import java.util.Arrays; import java.util.List; import java.util.Scanner; -import java.util.StringTokenizer; import java.util.stream.Collectors; import lotto.message.ConsoleMessage; @@ -19,8 +17,7 @@ private InputView() { public static int getMoney() { System.out.println(ConsoleMessage.INPUT_MONEY.getMessage()); - Integer inputMoney = Integer.parseInt(scanner.nextLine()); - return inputMoney; + return Integer.parseInt(scanner.nextLine()); } public static List getWinLotto() { From 53b05f833c94644275e6c59e37f0c0970a163e0a Mon Sep 17 00:00:00 2001 From: dradnats1012 Date: Mon, 8 Jul 2024 18:38:57 +0900 Subject: [PATCH 06/10] =?UTF-8?q?feat:=20=EB=8B=B9=EC=B2=A8=EB=B2=88?= =?UTF-8?q?=ED=98=B8=20=EA=B2=80=EC=A6=9D=20=EC=B6=94=EA=B0=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/main/java/lotto/Constant.java | 4 ++++ src/main/java/lotto/domain/WinNums.java | 23 +++++++++++++++++-- src/main/java/lotto/message/ErrorMessage.java | 4 +++- 3 files changed, 28 insertions(+), 3 deletions(-) diff --git a/src/main/java/lotto/Constant.java b/src/main/java/lotto/Constant.java index 59fb31d8..1447d083 100644 --- a/src/main/java/lotto/Constant.java +++ b/src/main/java/lotto/Constant.java @@ -20,4 +20,8 @@ private Constant() { public static final int SECOND_REWARD = 30000000; public static final int FIRST_REWARD = 2000000000; + + public static final int MIN_NUM = 1; + + public static final int MAX_NUM = 45; } diff --git a/src/main/java/lotto/domain/WinNums.java b/src/main/java/lotto/domain/WinNums.java index 0efca595..89722908 100644 --- a/src/main/java/lotto/domain/WinNums.java +++ b/src/main/java/lotto/domain/WinNums.java @@ -2,13 +2,18 @@ import java.util.List; +import lotto.Constant; +import lotto.message.ErrorMessage; + public class WinNums { - private List winNums; - private int bonusNum; + private final List winNums; + private final int bonusNum; public WinNums(List winNums, int bonusNum) { this.winNums = winNums; this.bonusNum = bonusNum; + validateNum(); + validateBonusNum(); } public List getWinNums() { @@ -18,4 +23,18 @@ public List getWinNums() { public int getBonusNum() { return bonusNum; } + + private void validateNum() { + for (int num : winNums) { + if (num >= Constant.MIN_NUM && num <= Constant.MAX_NUM) { + throw new IllegalArgumentException(ErrorMessage.INVALID_NUM.getMessage()); + } + } + } + + private void validateBonusNum() { + if (bonusNum >= Constant.MIN_NUM && bonusNum <= Constant.MAX_NUM) { + throw new IllegalArgumentException(ErrorMessage.INVALID_NUM.getMessage()); + } + } } diff --git a/src/main/java/lotto/message/ErrorMessage.java b/src/main/java/lotto/message/ErrorMessage.java index ae6f1a27..585ba494 100644 --- a/src/main/java/lotto/message/ErrorMessage.java +++ b/src/main/java/lotto/message/ErrorMessage.java @@ -2,7 +2,9 @@ public enum ErrorMessage { INVALID_MONEY("천원 단위로 입력해주세요!"), - INVALID_LOTTO_NUM("로또의 개수가 이상합니다!"); + INVALID_LOTTO_NUM("로또의 개수가 이상합니다!"), + INVALID_NUM("유효한 숫자가 아닙니다!"), + ; private final String message; From 53bad0676a9a32dc81276263c050e56884d85424 Mon Sep 17 00:00:00 2001 From: dradnats1012 Date: Mon, 8 Jul 2024 18:42:45 +0900 Subject: [PATCH 07/10] =?UTF-8?q?feat:=20=EB=A1=9C=EB=98=90=EB=B2=88?= =?UTF-8?q?=ED=98=B8=20=EA=B2=80=EC=A6=9D=20=EC=B6=94=EA=B0=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/main/java/lotto/domain/Lotto.java | 19 ++++++++++++------- 1 file changed, 12 insertions(+), 7 deletions(-) diff --git a/src/main/java/lotto/domain/Lotto.java b/src/main/java/lotto/domain/Lotto.java index 25d82a70..189e9880 100644 --- a/src/main/java/lotto/domain/Lotto.java +++ b/src/main/java/lotto/domain/Lotto.java @@ -8,29 +8,34 @@ public class Lotto { - private final NumberGenerator numberGenerator; - private List lottoNums; public Lotto(NumberGenerator numberGenerator) { - this.numberGenerator = numberGenerator; lottoNums = numberGenerator.generateLottoNum(); // 생성자에서 어디까지의 역할을 해야하는가? - validateLotto(); + validateLottoSize(); } public Lotto(List lottoNums) { - this.numberGenerator = null; this.lottoNums = lottoNums; - validateLotto(); + validateLottoSize(); + validateLottoNum(); } public List getLottoNums() { return lottoNums; } - private void validateLotto() { + private void validateLottoSize() { if (lottoNums.size() != Constant.LOTTO_NUM_COUNT) { throw new IllegalArgumentException(ErrorMessage.INVALID_LOTTO_NUM.getMessage()); } } + + private void validateLottoNum(){ + for(int num : lottoNums){ + if(num >= Constant.MIN_NUM && num <= Constant.MAX_NUM){ + throw new IllegalArgumentException(ErrorMessage.INVALID_NUM.getMessage()); + } + } + } } From 4c0b69ddd28c418e77232d59b92383c185b18a01 Mon Sep 17 00:00:00 2001 From: dradnats1012 Date: Mon, 8 Jul 2024 19:12:09 +0900 Subject: [PATCH 08/10] =?UTF-8?q?feat:=20=EC=88=98=EB=8F=99=EB=A1=9C?= =?UTF-8?q?=EB=98=90=20=EA=B0=9C=EC=88=98=20=EA=B2=80=EC=A6=9D=20=EC=B6=94?= =?UTF-8?q?=EA=B0=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/main/java/lotto/domain/Lotto.java | 2 +- src/main/java/lotto/domain/LottoGame.java | 7 +++++++ src/main/java/lotto/domain/WinNums.java | 4 ++-- src/main/java/lotto/message/ErrorMessage.java | 1 + 4 files changed, 11 insertions(+), 3 deletions(-) diff --git a/src/main/java/lotto/domain/Lotto.java b/src/main/java/lotto/domain/Lotto.java index 189e9880..34a44c44 100644 --- a/src/main/java/lotto/domain/Lotto.java +++ b/src/main/java/lotto/domain/Lotto.java @@ -33,7 +33,7 @@ private void validateLottoSize() { private void validateLottoNum(){ for(int num : lottoNums){ - if(num >= Constant.MIN_NUM && num <= Constant.MAX_NUM){ + if(!(num >= Constant.MIN_NUM && num <= Constant.MAX_NUM)){ throw new IllegalArgumentException(ErrorMessage.INVALID_NUM.getMessage()); } } diff --git a/src/main/java/lotto/domain/LottoGame.java b/src/main/java/lotto/domain/LottoGame.java index 59206c3b..38989ec9 100644 --- a/src/main/java/lotto/domain/LottoGame.java +++ b/src/main/java/lotto/domain/LottoGame.java @@ -20,6 +20,7 @@ public LottoGame(int price, NumberGenerator numberGenerator, CustomLotto customL this.trial = getTrial(); this.numberGenerator = numberGenerator; this.customLotto = customLotto; + validateTrial(); makeLottoList(); } @@ -46,4 +47,10 @@ private void validatePrice(int price) { private int getTrial() { return price / Constant.LOTTO_PRICE; } + + private void validateTrial(){ + if(trial < customLotto.getCustomLottoCount()){ + throw new IllegalArgumentException(ErrorMessage.TOO_MANY_CUSTOM.getMessage()); + } + } } diff --git a/src/main/java/lotto/domain/WinNums.java b/src/main/java/lotto/domain/WinNums.java index 89722908..2e439e88 100644 --- a/src/main/java/lotto/domain/WinNums.java +++ b/src/main/java/lotto/domain/WinNums.java @@ -26,14 +26,14 @@ public int getBonusNum() { private void validateNum() { for (int num : winNums) { - if (num >= Constant.MIN_NUM && num <= Constant.MAX_NUM) { + if (!(num >= Constant.MIN_NUM && num <= Constant.MAX_NUM)) { throw new IllegalArgumentException(ErrorMessage.INVALID_NUM.getMessage()); } } } private void validateBonusNum() { - if (bonusNum >= Constant.MIN_NUM && bonusNum <= Constant.MAX_NUM) { + if (!(bonusNum >= Constant.MIN_NUM && bonusNum <= Constant.MAX_NUM)) { throw new IllegalArgumentException(ErrorMessage.INVALID_NUM.getMessage()); } } diff --git a/src/main/java/lotto/message/ErrorMessage.java b/src/main/java/lotto/message/ErrorMessage.java index 585ba494..52a6a1a6 100644 --- a/src/main/java/lotto/message/ErrorMessage.java +++ b/src/main/java/lotto/message/ErrorMessage.java @@ -4,6 +4,7 @@ public enum ErrorMessage { INVALID_MONEY("천원 단위로 입력해주세요!"), INVALID_LOTTO_NUM("로또의 개수가 이상합니다!"), INVALID_NUM("유효한 숫자가 아닙니다!"), + TOO_MANY_CUSTOM("수동 로또가 너무 많습니다!"), ; private final String message; From 559c85358133a7fc716ee69fa86eb58b8f1e8f3e Mon Sep 17 00:00:00 2001 From: dradnats1012 Date: Mon, 8 Jul 2024 19:15:48 +0900 Subject: [PATCH 09/10] =?UTF-8?q?5=EB=8B=A8=EA=B3=84=20=EB=AF=B8=EC=85=98?= =?UTF-8?q?=20=ED=86=B5=EA=B3=BC?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/main/java/lotto/domain/CheckPlace.java | 8 ++++---- src/main/java/lotto/domain/Lotto.java | 2 +- src/main/java/lotto/domain/LottoGame.java | 4 +--- src/main/java/lotto/domain/Reward.java | 2 +- 4 files changed, 7 insertions(+), 9 deletions(-) diff --git a/src/main/java/lotto/domain/CheckPlace.java b/src/main/java/lotto/domain/CheckPlace.java index fdffce2f..a1830311 100644 --- a/src/main/java/lotto/domain/CheckPlace.java +++ b/src/main/java/lotto/domain/CheckPlace.java @@ -6,10 +6,10 @@ import lotto.Rank; public class CheckPlace { - private WinNums winNums; - private Result result; - private List lottoList; - private List winList; + private final WinNums winNums; + private final Result result; + private final List lottoList; + private final List winList; public CheckPlace(LottoGame lottoGame, WinNums winNums) { this.winNums = winNums; diff --git a/src/main/java/lotto/domain/Lotto.java b/src/main/java/lotto/domain/Lotto.java index 34a44c44..0f527304 100644 --- a/src/main/java/lotto/domain/Lotto.java +++ b/src/main/java/lotto/domain/Lotto.java @@ -8,7 +8,7 @@ public class Lotto { - private List lottoNums; + private final List lottoNums; public Lotto(NumberGenerator numberGenerator) { lottoNums = numberGenerator.generateLottoNum(); // 생성자에서 어디까지의 역할을 해야하는가? diff --git a/src/main/java/lotto/domain/LottoGame.java b/src/main/java/lotto/domain/LottoGame.java index 38989ec9..630a7460 100644 --- a/src/main/java/lotto/domain/LottoGame.java +++ b/src/main/java/lotto/domain/LottoGame.java @@ -29,9 +29,7 @@ public List getLottoList() { } private void makeLottoList() { - for (Lotto customLotto : customLotto.getCustomLottoList()) { - lottoList.add(customLotto); - } + lottoList.addAll(customLotto.getCustomLottoList()); for (int j = 0; j < trial - customLotto.getCustomLottoCount(); j++) { lottoList.add(new Lotto(numberGenerator)); diff --git a/src/main/java/lotto/domain/Reward.java b/src/main/java/lotto/domain/Reward.java index 8e4ad9f1..68e0bfed 100644 --- a/src/main/java/lotto/domain/Reward.java +++ b/src/main/java/lotto/domain/Reward.java @@ -7,7 +7,7 @@ public class Reward { private final int inputMoney; private int totalReward; - private Map resultMap; + private final Map resultMap; public Reward(Result result, int inputMoney) { this.inputMoney = inputMoney; From d7f16dc8d6ec3d3a11bfa69ec1fb39ecea5d0f8a Mon Sep 17 00:00:00 2001 From: dradnats1012 Date: Thu, 11 Jul 2024 17:46:58 +0900 Subject: [PATCH 10/10] =?UTF-8?q?Controller=20=EA=B0=9C=ED=96=89?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/main/java/lotto/controller/Controller.java | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/src/main/java/lotto/controller/Controller.java b/src/main/java/lotto/controller/Controller.java index dbc978da..1156f290 100644 --- a/src/main/java/lotto/controller/Controller.java +++ b/src/main/java/lotto/controller/Controller.java @@ -16,13 +16,17 @@ public class Controller { public void run() { int inputMoney = InputView.getMoney(); + int customCount = InputView.getCustomLottoCount(); CustomLotto customLotto = new CustomLotto(InputView.getCustomLotto(customCount)); + LottoGame lottoGame = new LottoGame(inputMoney, numberGenerator, customLotto); OutputView.printLottoes(customCount, lottoGame.getLottoList()); + WinNums winNums = new WinNums(InputView.getWinLotto(), InputView.getBonusBall()); CheckPlace checkPlace = new CheckPlace(lottoGame, winNums); OutputView.printStatistics(checkPlace.getResultMap()); + Reward reward = new Reward(checkPlace.getResult(), inputMoney); OutputView.printReward(reward.getRate()); }