From 1f3d9eecd26ac4bd475310a66ac4026579034fa3 Mon Sep 17 00:00:00 2001 From: leesewon00 Date: Thu, 6 Jul 2023 19:23:03 +0900 Subject: [PATCH 01/23] =?UTF-8?q?=EB=8B=A8=EC=88=9C=20=EA=B8=B0=EB=8A=A5?= =?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 --- src/main/java/lotto/Application.java | 4 + src/main/java/lotto/game/exception/Check.java | 21 ++++ src/main/java/lotto/game/game/Game.java | 112 ++++++++++++++++++ src/main/java/lotto/game/input/Input.java | 45 +++++++ src/main/java/lotto/game/lotto/Lotto.java | 24 ++++ src/main/java/lotto/game/print/Print.java | 49 ++++++++ src/main/java/lotto/game/result/Awards.java | 23 ++++ src/main/java/lotto/game/result/Count.java | 33 ++++++ src/main/java/lotto/game/result/Result.java | 23 ++++ src/main/java/lotto/game/user/User.java | 19 +++ 10 files changed, 353 insertions(+) create mode 100644 src/main/java/lotto/game/exception/Check.java create mode 100644 src/main/java/lotto/game/game/Game.java create mode 100644 src/main/java/lotto/game/input/Input.java create mode 100644 src/main/java/lotto/game/lotto/Lotto.java create mode 100644 src/main/java/lotto/game/print/Print.java create mode 100644 src/main/java/lotto/game/result/Awards.java create mode 100644 src/main/java/lotto/game/result/Count.java create mode 100644 src/main/java/lotto/game/result/Result.java create mode 100644 src/main/java/lotto/game/user/User.java diff --git a/src/main/java/lotto/Application.java b/src/main/java/lotto/Application.java index 367ee30584..3f5d206c04 100644 --- a/src/main/java/lotto/Application.java +++ b/src/main/java/lotto/Application.java @@ -1,7 +1,11 @@ package lotto; +import lotto.game.game.Game; + public class Application { public static void main(String[] args) { // TODO: 프로그램 구현 + Game game = new Game(); + game.start(); } } \ No newline at end of file diff --git a/src/main/java/lotto/game/exception/Check.java b/src/main/java/lotto/game/exception/Check.java new file mode 100644 index 0000000000..bdea50abb0 --- /dev/null +++ b/src/main/java/lotto/game/exception/Check.java @@ -0,0 +1,21 @@ +package lotto.game.exception; + +import java.util.ArrayList; + +public class Check { + + public static void purchaseCheck(String str) { + + int number; + try { + number = Integer.parseInt(str); + } catch (NumberFormatException e) { + throw new IllegalArgumentException("[ERROR] 숫자 형식이 올바르지 않습니다"); + } + + if (number % 1000 != 0 || number < 1000) { + throw new IllegalArgumentException("[ERROR] 1000으로 나누어 떨어지는 수만 입력하세요"); + } + } + +} diff --git a/src/main/java/lotto/game/game/Game.java b/src/main/java/lotto/game/game/Game.java new file mode 100644 index 0000000000..ffcf3d4678 --- /dev/null +++ b/src/main/java/lotto/game/game/Game.java @@ -0,0 +1,112 @@ +package lotto.game.game; + +import camp.nextstep.edu.missionutils.Randoms; +import lotto.game.input.Input; +import lotto.game.lotto.Lotto; +import lotto.game.print.Print; +import lotto.game.result.Awards; +import lotto.game.result.Count; +import lotto.game.result.Result; +import lotto.game.user.User; +import java.util.ArrayList; +import java.util.List; + +public class Game { + // 로또 배열 + ListlottoList = new ArrayList<>(); + Result result = new Result(); + + // user 내부에 awards 가지면 좋을듯 + User user = new User(); + Awards awards = new Awards(); + Count count = new Count(); + + + private void makeRandomLottoNumbers(int cycle) { + for (int i = 0; i < cycle; i++) { + // 로또 번호 생성 + List numbers = Randoms.pickUniqueNumbersInRange(1, 45, 6); + // 오름차순 정렬 + //Collections.sort(numbers); + + // 로또 객체로 만들어 로또 리스트에 넣어주기 + Lotto lotto = new Lotto(numbers); + lottoList.add(lotto); + } + } + private void countMatchNumber(ArrayList winningNumber, Integer bonusNumber, List lottoNumber) { + for (Integer num : lottoNumber) { + if (winningNumber.contains(num)) { + count.countUp(); + } + } + // 보너스 체크 + if(lottoNumber.contains(bonusNumber)){ + count.countUpBonus(); + } + } + private void countMatchRefund(int cnt, int bonusCnt) { + result.upCountResult(cnt); + user.updateRefund(awards.getAwards()[cnt]); + + if(cnt ==5){ + if(bonusCnt ==1){ + result.upCountBonusResult(); + user.updateRefund(awards.getBonusAwards()); + } + if(bonusCnt !=1){ + result.downCountResult(cnt); + user.updateRefund(-awards.getAwards()[cnt]); + } + } + } + public void start() { + // 1. 수량 입력받기 + Integer purchaseMoney = Input.getPurchaseMoney(); + if(purchaseMoney==-1){ + return; + } + + // 2. 구매수량 check + int cycle = purchaseMoney / 1000; + System.out.println(cycle + "개를 구매했습니다."); + + // 3. 수량만큼 로또 번호 생성 + makeRandomLottoNumbers(cycle); + + // 4. 생성된 로또번호 보여주기 + Print.printNumberList(lottoList); + + // 5. 당첨 번호, 보너스 번호 입력받기 + ArrayList winningNumber = Input.getWinningNumber(); + Integer bonusNumber = Input.getBonusNumber(); + + // 6. 당첨통계 + System.out.println("당첨 통계"); + System.out.println("---"); + for(int i = 0; i lottoNumber = lottoList.get(i).getLottoNumber(); + + // 번호 일치여부 판별 + // count 함수로 써야되나 + countMatchNumber(winningNumber, bonusNumber, lottoNumber); + + // user refund update + int cnt = count.getCnt(); + int bonusCnt = count.getBonusCnt(); + countMatchRefund(cnt, bonusCnt); + } + + // 7. 결과 출력 + Print.printResult(awards,result); + Print.printRateOfReturn(purchaseMoney, user); + } + + + + +} diff --git a/src/main/java/lotto/game/input/Input.java b/src/main/java/lotto/game/input/Input.java new file mode 100644 index 0000000000..c8d4f4af19 --- /dev/null +++ b/src/main/java/lotto/game/input/Input.java @@ -0,0 +1,45 @@ +package lotto.game.input; + +import camp.nextstep.edu.missionutils.Console; +import lotto.game.exception.Check; + +import java.util.ArrayList; + +public class Input { + + public static Integer getPurchaseMoney() { + System.out.println("구입 금액을 입력해 주세요"); + String str = Console.readLine(); + + try { + Check.purchaseCheck(str); + }catch (IllegalArgumentException e){ + System.out.println(e.getMessage()); + return -1; + } + + int purchase = Integer.parseInt(str); + System.out.println(); + return purchase; + } + + public static ArrayList getWinningNumber() { + System.out.println("당첨 번호를 입력해 주세요."); + String str = Console.readLine(); + String[] split = str.split(","); + + ArrayListarrayList = new ArrayList<>(); + for(int i = 0; i numbers; + + public List getLottoNumber(){ + return this.numbers; + } + + public Lotto(List numbers) { + validate(numbers); + this.numbers = numbers; + } + + private void validate(List numbers) { + if (numbers.size() != 6) { + throw new IllegalArgumentException(); + } + } + + // TODO: 추가 기능 구현 +} \ No newline at end of file diff --git a/src/main/java/lotto/game/print/Print.java b/src/main/java/lotto/game/print/Print.java new file mode 100644 index 0000000000..334f571989 --- /dev/null +++ b/src/main/java/lotto/game/print/Print.java @@ -0,0 +1,49 @@ +package lotto.game.print; + +import lotto.game.lotto.Lotto; +import lotto.game.result.Awards; +import lotto.game.result.Result; +import lotto.game.user.User; + +import java.text.DecimalFormat; +import java.util.List; + +public class Print { + + public static void printNumberList(List lottoList) { + for (int i = 0; i < lottoList.size(); i++) { + Lotto lotto = lottoList.get(i); + System.out.println(lotto.getLottoNumber()); + } + System.out.println(); + } + + public static void printRateOfReturn(Integer purchaseMoney, User user) { + double percent = (double) user.getRefund() / purchaseMoney * 100; + double roundedPercent = Math.round(percent * 10.0) / 10.0; + System.out.println("총 수익률은 " + roundedPercent+"%입니다."); + } + + public static void printResult(Awards awards, Result result) { + for(int i = 3; i<=6; i++){ + String printMessage = ""; + printMessage += i+"개 일치 "; + // 5000원 + DecimalFormat decimalFormat = new DecimalFormat("#,###"); + String formattedValue = "(" + decimalFormat.format(awards.getAwards()[i]) + "원) - "; + printMessage += formattedValue; + printMessage += result.getResult()[i]+"개"; + + + if(i==5){ + printMessage += '\n'; + printMessage += i+"개 일치, 보너스 볼 일치 "; + formattedValue = "(" + decimalFormat.format(awards.getBonusAwards()) + "원) - "; + printMessage+=formattedValue; + printMessage += result.getBonusResult()+"개"; + } + + System.out.println(printMessage); + } + } +} diff --git a/src/main/java/lotto/game/result/Awards.java b/src/main/java/lotto/game/result/Awards.java new file mode 100644 index 0000000000..6ed03a52d1 --- /dev/null +++ b/src/main/java/lotto/game/result/Awards.java @@ -0,0 +1,23 @@ +package lotto.game.result; + +public class Awards { + public int[] awards = new int[10]; + public int bonusAwards; + + public Awards(){ + awards[3]=5000; + awards[4]=50000; + awards[5]=1500000; + awards[6]=2000000000; + + bonusAwards = 30000000; + } + + public int[] getAwards() { + return awards; + } + + public int getBonusAwards() { + return bonusAwards; + } +} diff --git a/src/main/java/lotto/game/result/Count.java b/src/main/java/lotto/game/result/Count.java new file mode 100644 index 0000000000..16740c0e1f --- /dev/null +++ b/src/main/java/lotto/game/result/Count.java @@ -0,0 +1,33 @@ +package lotto.game.result; + +public class Count { + private int cnt; + private int bonusCnt; + + + public Count(){ + cnt = 0; + bonusCnt = 0; + } + + public void reset(){ + cnt = 0; + bonusCnt = 0; + } + public void countUp(){ + this.cnt++; + } + public void countUpBonus(){ + this.bonusCnt++; + } + public void loadAwards(){ + this.bonusCnt++; + } + + public int getCnt() { + return cnt; + } + public int getBonusCnt() { + return bonusCnt; + } +} diff --git a/src/main/java/lotto/game/result/Result.java b/src/main/java/lotto/game/result/Result.java new file mode 100644 index 0000000000..ac933548e6 --- /dev/null +++ b/src/main/java/lotto/game/result/Result.java @@ -0,0 +1,23 @@ +package lotto.game.result; + +public class Result { + public int[] result = new int[10]; + public int bonusResult; + + public void upCountResult(int idx){ + result[idx]++; + } + public void downCountResult(int idx){ + result[idx]--; + } + public void upCountBonusResult(){ + bonusResult++; + } + + public int[] getResult() { + return result; + } + public int getBonusResult(){ + return bonusResult; + } +} diff --git a/src/main/java/lotto/game/user/User.java b/src/main/java/lotto/game/user/User.java new file mode 100644 index 0000000000..35ca43ddde --- /dev/null +++ b/src/main/java/lotto/game/user/User.java @@ -0,0 +1,19 @@ +package lotto.game.user; + +import lotto.game.result.Awards; + +public class User { + + public int refund; + + public User(){ + refund = 0; + } + + public void updateRefund(int plus){ + refund += plus; + } + public int getRefund(){ + return refund; + } +} From 207b49ceed7cbc1eb284582c8afebb05fead0182 Mon Sep 17 00:00:00 2001 From: leesewon00 Date: Sat, 8 Jul 2023 21:00:00 +0900 Subject: [PATCH 02/23] =?UTF-8?q?Game=20=EC=83=9D=EC=84=B1=EC=9E=90?= =?UTF-8?q?=EC=97=90=EC=84=9C=20=EC=9D=98=EC=A1=B4=EC=84=B1=20=EC=A3=BC?= =?UTF-8?q?=EC=9E=85?= 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/game/game/Game.java | 20 +++++++++++++------ .../Check.java => input/CheckInput.java} | 8 +++----- src/main/java/lotto/game/input/Input.java | 3 +-- src/main/java/lotto/game/result/Result.java | 1 + 5 files changed, 26 insertions(+), 14 deletions(-) rename src/main/java/lotto/game/{exception/Check.java => input/CheckInput.java} (76%) diff --git a/src/main/java/lotto/Application.java b/src/main/java/lotto/Application.java index 3f5d206c04..c625ee7ced 100644 --- a/src/main/java/lotto/Application.java +++ b/src/main/java/lotto/Application.java @@ -1,11 +1,17 @@ package lotto; +import lotto.game.input.CheckInput; import lotto.game.game.Game; +import lotto.game.input.Input; +import lotto.game.print.Print; public class Application { public static void main(String[] args) { // TODO: 프로그램 구현 - Game game = new Game(); + Input input = new Input(); + Print print = new Print(); + + Game game = new Game(input,print); game.start(); } } \ No newline at end of file diff --git a/src/main/java/lotto/game/game/Game.java b/src/main/java/lotto/game/game/Game.java index ffcf3d4678..838892bda1 100644 --- a/src/main/java/lotto/game/game/Game.java +++ b/src/main/java/lotto/game/game/Game.java @@ -1,6 +1,7 @@ package lotto.game.game; import camp.nextstep.edu.missionutils.Randoms; +import lotto.game.input.CheckInput; import lotto.game.input.Input; import lotto.game.lotto.Lotto; import lotto.game.print.Print; @@ -21,6 +22,13 @@ public class Game { Awards awards = new Awards(); Count count = new Count(); + private Input input; + private Print print; + + public Game(Input input, Print print){ + this.input = input; + this.print = print; + } private void makeRandomLottoNumbers(int cycle) { for (int i = 0; i < cycle; i++) { @@ -62,7 +70,7 @@ private void countMatchRefund(int cnt, int bonusCnt) { } public void start() { // 1. 수량 입력받기 - Integer purchaseMoney = Input.getPurchaseMoney(); + Integer purchaseMoney = input.getPurchaseMoney(); if(purchaseMoney==-1){ return; } @@ -75,11 +83,11 @@ public void start() { makeRandomLottoNumbers(cycle); // 4. 생성된 로또번호 보여주기 - Print.printNumberList(lottoList); + print.printNumberList(lottoList); // 5. 당첨 번호, 보너스 번호 입력받기 - ArrayList winningNumber = Input.getWinningNumber(); - Integer bonusNumber = Input.getBonusNumber(); + ArrayList winningNumber = input.getWinningNumber(); + Integer bonusNumber = input.getBonusNumber(); // 6. 당첨통계 System.out.println("당첨 통계"); @@ -102,8 +110,8 @@ public void start() { } // 7. 결과 출력 - Print.printResult(awards,result); - Print.printRateOfReturn(purchaseMoney, user); + print.printResult(awards,result); + print.printRateOfReturn(purchaseMoney,user); } diff --git a/src/main/java/lotto/game/exception/Check.java b/src/main/java/lotto/game/input/CheckInput.java similarity index 76% rename from src/main/java/lotto/game/exception/Check.java rename to src/main/java/lotto/game/input/CheckInput.java index bdea50abb0..459007b6df 100644 --- a/src/main/java/lotto/game/exception/Check.java +++ b/src/main/java/lotto/game/input/CheckInput.java @@ -1,10 +1,8 @@ -package lotto.game.exception; +package lotto.game.input; -import java.util.ArrayList; +public class CheckInput { -public class Check { - - public static void purchaseCheck(String str) { + static void purchaseCheck(String str) { int number; try { diff --git a/src/main/java/lotto/game/input/Input.java b/src/main/java/lotto/game/input/Input.java index c8d4f4af19..cb6971e567 100644 --- a/src/main/java/lotto/game/input/Input.java +++ b/src/main/java/lotto/game/input/Input.java @@ -1,7 +1,6 @@ package lotto.game.input; import camp.nextstep.edu.missionutils.Console; -import lotto.game.exception.Check; import java.util.ArrayList; @@ -12,7 +11,7 @@ public static Integer getPurchaseMoney() { String str = Console.readLine(); try { - Check.purchaseCheck(str); + CheckInput.purchaseCheck(str); }catch (IllegalArgumentException e){ System.out.println(e.getMessage()); return -1; diff --git a/src/main/java/lotto/game/result/Result.java b/src/main/java/lotto/game/result/Result.java index ac933548e6..81b1134428 100644 --- a/src/main/java/lotto/game/result/Result.java +++ b/src/main/java/lotto/game/result/Result.java @@ -1,5 +1,6 @@ package lotto.game.result; +// strike ball count public class Result { public int[] result = new int[10]; public int bonusResult; From 83967c43df0bfe1c450991a598803ebf44eddede Mon Sep 17 00:00:00 2001 From: leesewon00 Date: Sat, 8 Jul 2023 21:04:19 +0900 Subject: [PATCH 03/23] =?UTF-8?q?=EC=B6=9C=EB=A0=A5=EB=AC=B8=20Print=20?= =?UTF-8?q?=ED=81=B4=EB=9E=98=EC=8A=A4=EC=9D=98=20=EB=A9=94=EC=86=8C?= =?UTF-8?q?=EB=93=9C=EB=A1=9C=20=EC=B6=94=EC=B6=9C?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/main/java/lotto/game/game/Game.java | 4 ++-- src/main/java/lotto/game/print/Print.java | 4 ++++ 2 files changed, 6 insertions(+), 2 deletions(-) diff --git a/src/main/java/lotto/game/game/Game.java b/src/main/java/lotto/game/game/Game.java index 838892bda1..73301fae1c 100644 --- a/src/main/java/lotto/game/game/Game.java +++ b/src/main/java/lotto/game/game/Game.java @@ -90,8 +90,8 @@ public void start() { Integer bonusNumber = input.getBonusNumber(); // 6. 당첨통계 - System.out.println("당첨 통계"); - System.out.println("---"); + print.printResultStart(); + for(int i = 0; i lottoList) { for (int i = 0; i < lottoList.size(); i++) { Lotto lotto = lottoList.get(i); From b5f99c79a5980d45fe1ec427a5cb464bceaa4478 Mon Sep 17 00:00:00 2001 From: leesewon00 Date: Sat, 8 Jul 2023 21:13:27 +0900 Subject: [PATCH 04/23] =?UTF-8?q?=EB=B2=88=ED=98=B8=20=EC=9D=BC=EC=B9=98?= =?UTF-8?q?=EC=97=AC=EB=B6=80=EB=A5=BC=20=ED=8C=90=EB=B3=84=ED=95=98?= =?UTF-8?q?=EA=B3=A0,=20=EA=B2=B0=EA=B3=BC=EB=A5=BC=20=EC=A7=91=EA=B3=84?= =?UTF-8?q?=ED=95=98=EB=8A=94=20for=EB=AC=B8=20=EA=B0=84=EC=86=8C=ED=99=94?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/main/java/lotto/game/game/Game.java | 19 ++++++------------- 1 file changed, 6 insertions(+), 13 deletions(-) diff --git a/src/main/java/lotto/game/game/Game.java b/src/main/java/lotto/game/game/Game.java index 73301fae1c..a3a6477275 100644 --- a/src/main/java/lotto/game/game/Game.java +++ b/src/main/java/lotto/game/game/Game.java @@ -89,27 +89,20 @@ public void start() { ArrayList winningNumber = input.getWinningNumber(); Integer bonusNumber = input.getBonusNumber(); - // 6. 당첨통계 - print.printResultStart(); - - for(int i = 0; i lottoNumber = lottoList.get(i).getLottoNumber(); - + // 저장된 list 하나씩 빼오기 + List lottoNumber = lotto.getLottoNumber(); // 번호 일치여부 판별 - // count 함수로 써야되나 countMatchNumber(winningNumber, bonusNumber, lottoNumber); - // user refund update - int cnt = count.getCnt(); - int bonusCnt = count.getBonusCnt(); - countMatchRefund(cnt, bonusCnt); + countMatchRefund(count.getCnt(), count.getBonusCnt()); } // 7. 결과 출력 + print.printResultStart(); print.printResult(awards,result); print.printRateOfReturn(purchaseMoney,user); } From b4afbb418b86959ab4b240d4e40a9223f1f26e65 Mon Sep 17 00:00:00 2001 From: leesewon00 Date: Sat, 8 Jul 2023 21:18:32 +0900 Subject: [PATCH 05/23] =?UTF-8?q?game=20class=20=EC=BA=A1=EC=8A=90?= =?UTF-8?q?=ED=99=94?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/main/java/lotto/game/game/Game.java | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/main/java/lotto/game/game/Game.java b/src/main/java/lotto/game/game/Game.java index a3a6477275..6458fb95cc 100644 --- a/src/main/java/lotto/game/game/Game.java +++ b/src/main/java/lotto/game/game/Game.java @@ -13,8 +13,6 @@ import java.util.List; public class Game { - // 로또 배열 - ListlottoList = new ArrayList<>(); Result result = new Result(); // user 내부에 awards 가지면 좋을듯 @@ -24,10 +22,12 @@ public class Game { private Input input; private Print print; + private ListlottoList; public Game(Input input, Print print){ this.input = input; this.print = print; + this.lottoList = new ArrayList<>(); } private void makeRandomLottoNumbers(int cycle) { From 0127fe9efc06bb4b7ad0170bd3e9b0ea53a93bd2 Mon Sep 17 00:00:00 2001 From: leesewon00 Date: Sat, 8 Jul 2023 21:20:10 +0900 Subject: [PATCH 06/23] =?UTF-8?q?=EB=B6=88=ED=95=84=EC=9A=94=ED=95=9C=20st?= =?UTF-8?q?atic=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/game/game/Game.java | 1 - src/main/java/lotto/game/input/Input.java | 6 +++--- src/main/java/lotto/game/print/Print.java | 8 ++++---- 3 files changed, 7 insertions(+), 8 deletions(-) diff --git a/src/main/java/lotto/game/game/Game.java b/src/main/java/lotto/game/game/Game.java index 6458fb95cc..cfc877c24e 100644 --- a/src/main/java/lotto/game/game/Game.java +++ b/src/main/java/lotto/game/game/Game.java @@ -1,7 +1,6 @@ package lotto.game.game; import camp.nextstep.edu.missionutils.Randoms; -import lotto.game.input.CheckInput; import lotto.game.input.Input; import lotto.game.lotto.Lotto; import lotto.game.print.Print; diff --git a/src/main/java/lotto/game/input/Input.java b/src/main/java/lotto/game/input/Input.java index cb6971e567..8bf7f23a4a 100644 --- a/src/main/java/lotto/game/input/Input.java +++ b/src/main/java/lotto/game/input/Input.java @@ -6,7 +6,7 @@ public class Input { - public static Integer getPurchaseMoney() { + public Integer getPurchaseMoney() { System.out.println("구입 금액을 입력해 주세요"); String str = Console.readLine(); @@ -22,7 +22,7 @@ public static Integer getPurchaseMoney() { return purchase; } - public static ArrayList getWinningNumber() { + public ArrayList getWinningNumber() { System.out.println("당첨 번호를 입력해 주세요."); String str = Console.readLine(); String[] split = str.split(","); @@ -35,7 +35,7 @@ public static ArrayList getWinningNumber() { return arrayList; } - public static Integer getBonusNumber() { + public Integer getBonusNumber() { System.out.println("보너스 번호를 입력해 주세요."); Integer bonusNumber = Integer.valueOf(Console.readLine()); System.out.println(); diff --git a/src/main/java/lotto/game/print/Print.java b/src/main/java/lotto/game/print/Print.java index ac2503542a..6811070ecb 100644 --- a/src/main/java/lotto/game/print/Print.java +++ b/src/main/java/lotto/game/print/Print.java @@ -10,11 +10,11 @@ public class Print { - public static void printResultStart(){ + public void printResultStart(){ System.out.println("당첨 통계"); System.out.println("---"); } - public static void printNumberList(List lottoList) { + public void printNumberList(List lottoList) { for (int i = 0; i < lottoList.size(); i++) { Lotto lotto = lottoList.get(i); System.out.println(lotto.getLottoNumber()); @@ -22,13 +22,13 @@ public static void printNumberList(List lottoList) { System.out.println(); } - public static void printRateOfReturn(Integer purchaseMoney, User user) { + public void printRateOfReturn(Integer purchaseMoney, User user) { double percent = (double) user.getRefund() / purchaseMoney * 100; double roundedPercent = Math.round(percent * 10.0) / 10.0; System.out.println("총 수익률은 " + roundedPercent+"%입니다."); } - public static void printResult(Awards awards, Result result) { + public void printResult(Awards awards, Result result) { for(int i = 3; i<=6; i++){ String printMessage = ""; printMessage += i+"개 일치 "; From 04bc2b7deac426890bea76a435c0d45f2f12d939 Mon Sep 17 00:00:00 2001 From: leesewon00 Date: Sat, 8 Jul 2023 21:35:17 +0900 Subject: [PATCH 07/23] =?UTF-8?q?makeNumber=20=ED=81=B4=EB=9E=98=EC=8A=A4?= =?UTF-8?q?=20=EB=B6=84=EB=A6=AC?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/main/java/lotto/game/game/Game.java | 18 +++------------ src/main/java/lotto/game/game/MakeNumber.java | 23 +++++++++++++++++++ 2 files changed, 26 insertions(+), 15 deletions(-) create mode 100644 src/main/java/lotto/game/game/MakeNumber.java diff --git a/src/main/java/lotto/game/game/Game.java b/src/main/java/lotto/game/game/Game.java index cfc877c24e..7f030f6fe9 100644 --- a/src/main/java/lotto/game/game/Game.java +++ b/src/main/java/lotto/game/game/Game.java @@ -11,10 +11,10 @@ import java.util.ArrayList; import java.util.List; +import static lotto.game.game.MakeNumber.makeRandomLottoNumbers; + public class Game { Result result = new Result(); - - // user 내부에 awards 가지면 좋을듯 User user = new User(); Awards awards = new Awards(); Count count = new Count(); @@ -29,18 +29,6 @@ public Game(Input input, Print print){ this.lottoList = new ArrayList<>(); } - private void makeRandomLottoNumbers(int cycle) { - for (int i = 0; i < cycle; i++) { - // 로또 번호 생성 - List numbers = Randoms.pickUniqueNumbersInRange(1, 45, 6); - // 오름차순 정렬 - //Collections.sort(numbers); - - // 로또 객체로 만들어 로또 리스트에 넣어주기 - Lotto lotto = new Lotto(numbers); - lottoList.add(lotto); - } - } private void countMatchNumber(ArrayList winningNumber, Integer bonusNumber, List lottoNumber) { for (Integer num : lottoNumber) { if (winningNumber.contains(num)) { @@ -79,7 +67,7 @@ public void start() { System.out.println(cycle + "개를 구매했습니다."); // 3. 수량만큼 로또 번호 생성 - makeRandomLottoNumbers(cycle); + makeRandomLottoNumbers(cycle,lottoList); // 4. 생성된 로또번호 보여주기 print.printNumberList(lottoList); diff --git a/src/main/java/lotto/game/game/MakeNumber.java b/src/main/java/lotto/game/game/MakeNumber.java new file mode 100644 index 0000000000..35068e2410 --- /dev/null +++ b/src/main/java/lotto/game/game/MakeNumber.java @@ -0,0 +1,23 @@ +package lotto.game.game; + +import camp.nextstep.edu.missionutils.Randoms; +import lotto.game.lotto.Lotto; + +import java.util.ArrayList; +import java.util.List; + +public class MakeNumber { + public static List makeRandomLottoNumbers(int cycle, ListlottoList) { + for (int i = 0; i < cycle; i++) { + // 로또 번호 생성 + List numbers = Randoms.pickUniqueNumbersInRange(1, 45, 6); + // 오름차순 정렬 + //Collections.sort(numbers); + + // 로또 객체로 만들어 로또 리스트에 넣어주기 + Lotto lotto = new Lotto(numbers); + lottoList.add(lotto); + } + return lottoList; + } +} From 45502655ee6c1cba0e2abc4f2ab6ff8491ae8e7b Mon Sep 17 00:00:00 2001 From: leesewon00 Date: Sat, 8 Jul 2023 22:24:25 +0900 Subject: [PATCH 08/23] =?UTF-8?q?=EC=9D=BC=EC=B9=98=20=EC=88=AB=EC=9E=90?= =?UTF-8?q?=20=ED=8C=90=EB=B3=84=20=EB=B0=8F=20=EA=B2=B0=EA=B3=BC=20?= =?UTF-8?q?=EA=B3=84=EC=82=B0=ED=95=B4=EC=A3=BC=EB=8A=94=20=EB=A9=94?= =?UTF-8?q?=EC=86=8C=EB=93=9C=20=ED=81=B4=EB=9E=98=EC=8A=A4=20=EB=B6=84?= =?UTF-8?q?=EB=A6=AC?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/main/java/lotto/game/game/CountMatch.java | 45 +++++++++++++++++++ 1 file changed, 45 insertions(+) create mode 100644 src/main/java/lotto/game/game/CountMatch.java diff --git a/src/main/java/lotto/game/game/CountMatch.java b/src/main/java/lotto/game/game/CountMatch.java new file mode 100644 index 0000000000..29c7591389 --- /dev/null +++ b/src/main/java/lotto/game/game/CountMatch.java @@ -0,0 +1,45 @@ +package lotto.game.game; + +import lotto.game.result.Awards; +import lotto.game.result.Count; +import lotto.game.result.Result; +import lotto.game.user.User; + +import javax.print.DocFlavor; +import java.util.ArrayList; +import java.util.List; + +public class CountMatch { + // 싱글톤으로 해결해보자 + Count count = Count.getInstance(); + Result result = Result.getInstance(); + Awards awards = Awards.getInstance(); + User user = User.getInstance(); + + public void countMatchNumber(ArrayList winningNumber, Integer bonusNumber, List lottoNumber) { + for (Integer num : lottoNumber) { + if (winningNumber.contains(num)) { + count.countUp(); + } + } + // 보너스 체크 + if(lottoNumber.contains(bonusNumber)){ + count.countUpBonus(); + } + } + public void countMatchRefund(int cnt, int bonusCnt) { + result.upCountResult(cnt); + user.updateRefund(awards.getAwards()[cnt]); + + if(cnt ==5){ + if(bonusCnt ==1){ + result.upCountBonusResult(); + user.updateRefund(awards.getBonusAwards()); + } + if(bonusCnt !=1){ + result.downCountResult(cnt); + user.updateRefund(-awards.getAwards()[cnt]); + } + } + } +} From b29a7fccf174503ba877effbf7a95ed6349ab483 Mon Sep 17 00:00:00 2001 From: leesewon00 Date: Sat, 8 Jul 2023 22:29:32 +0900 Subject: [PATCH 09/23] =?UTF-8?q?=EC=8B=B1=EA=B8=80=ED=86=A4=20=EC=A0=81?= =?UTF-8?q?=EC=9A=A9?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/main/java/lotto/Application.java | 5 ++- src/main/java/lotto/game/game/Game.java | 49 +++++---------------- src/main/java/lotto/game/result/Awards.java | 16 +++++-- src/main/java/lotto/game/result/Count.java | 20 +++++---- src/main/java/lotto/game/result/Result.java | 11 +++++ src/main/java/lotto/game/user/User.java | 16 ++++--- 6 files changed, 62 insertions(+), 55 deletions(-) diff --git a/src/main/java/lotto/Application.java b/src/main/java/lotto/Application.java index c625ee7ced..5e2eb8deec 100644 --- a/src/main/java/lotto/Application.java +++ b/src/main/java/lotto/Application.java @@ -1,6 +1,6 @@ package lotto; -import lotto.game.input.CheckInput; +import lotto.game.game.CountMatch; import lotto.game.game.Game; import lotto.game.input.Input; import lotto.game.print.Print; @@ -10,8 +10,9 @@ public static void main(String[] args) { // TODO: 프로그램 구현 Input input = new Input(); Print print = new Print(); + CountMatch countMatch = new CountMatch(); - Game game = new Game(input,print); + Game game = new Game(input,print,countMatch); game.start(); } } \ No newline at end of file diff --git a/src/main/java/lotto/game/game/Game.java b/src/main/java/lotto/game/game/Game.java index 7f030f6fe9..d2d068bbe2 100644 --- a/src/main/java/lotto/game/game/Game.java +++ b/src/main/java/lotto/game/game/Game.java @@ -1,6 +1,5 @@ package lotto.game.game; -import camp.nextstep.edu.missionutils.Randoms; import lotto.game.input.Input; import lotto.game.lotto.Lotto; import lotto.game.print.Print; @@ -14,47 +13,23 @@ import static lotto.game.game.MakeNumber.makeRandomLottoNumbers; public class Game { - Result result = new Result(); - User user = new User(); - Awards awards = new Awards(); - Count count = new Count(); - - private Input input; - private Print print; + Result result = Result.getInstance(); + User user = User.getInstance(); + Awards awards = Awards.getInstance(); + Count count = Count.getInstance(); + + private final Input input; + private final Print print; + private final CountMatch countMatch; private ListlottoList; - public Game(Input input, Print print){ + public Game(Input input, Print print, CountMatch countMatch){ this.input = input; this.print = print; + this.countMatch = countMatch; this.lottoList = new ArrayList<>(); } - private void countMatchNumber(ArrayList winningNumber, Integer bonusNumber, List lottoNumber) { - for (Integer num : lottoNumber) { - if (winningNumber.contains(num)) { - count.countUp(); - } - } - // 보너스 체크 - if(lottoNumber.contains(bonusNumber)){ - count.countUpBonus(); - } - } - private void countMatchRefund(int cnt, int bonusCnt) { - result.upCountResult(cnt); - user.updateRefund(awards.getAwards()[cnt]); - - if(cnt ==5){ - if(bonusCnt ==1){ - result.upCountBonusResult(); - user.updateRefund(awards.getBonusAwards()); - } - if(bonusCnt !=1){ - result.downCountResult(cnt); - user.updateRefund(-awards.getAwards()[cnt]); - } - } - } public void start() { // 1. 수량 입력받기 Integer purchaseMoney = input.getPurchaseMoney(); @@ -83,9 +58,9 @@ public void start() { // 저장된 list 하나씩 빼오기 List lottoNumber = lotto.getLottoNumber(); // 번호 일치여부 판별 - countMatchNumber(winningNumber, bonusNumber, lottoNumber); + countMatch.countMatchNumber(winningNumber, bonusNumber, lottoNumber); // user refund update - countMatchRefund(count.getCnt(), count.getBonusCnt()); + countMatch.countMatchRefund(count.getCnt(), count.getBonusCnt()); } // 7. 결과 출력 diff --git a/src/main/java/lotto/game/result/Awards.java b/src/main/java/lotto/game/result/Awards.java index 6ed03a52d1..7976010433 100644 --- a/src/main/java/lotto/game/result/Awards.java +++ b/src/main/java/lotto/game/result/Awards.java @@ -1,10 +1,10 @@ package lotto.game.result; public class Awards { - public int[] awards = new int[10]; - public int bonusAwards; + private static Awards instance; - public Awards(){ + // private 생성자로 외부에서의 인스턴스 생성을 막음 + private Awards() { awards[3]=5000; awards[4]=50000; awards[5]=1500000; @@ -13,6 +13,16 @@ public Awards(){ bonusAwards = 30000000; } + // 유일한 인스턴스를 반환하는 정적 메서드 + public static Awards getInstance() { + if (instance == null) { + instance = new Awards(); + } + return instance; + } + public int[] awards = new int[10]; + public int bonusAwards; + public int[] getAwards() { return awards; } diff --git a/src/main/java/lotto/game/result/Count.java b/src/main/java/lotto/game/result/Count.java index 16740c0e1f..87bb0cf4bd 100644 --- a/src/main/java/lotto/game/result/Count.java +++ b/src/main/java/lotto/game/result/Count.java @@ -1,14 +1,21 @@ package lotto.game.result; public class Count { - private int cnt; - private int bonusCnt; + private static Count instance; + private Count() { + this.cnt = 0; + this.bonusCnt = 0; + } - public Count(){ - cnt = 0; - bonusCnt = 0; + public static Count getInstance() { + if (instance == null) { + instance = new Count(); + } + return instance; } + private int cnt; + private int bonusCnt; public void reset(){ cnt = 0; @@ -20,9 +27,6 @@ public void countUp(){ public void countUpBonus(){ this.bonusCnt++; } - public void loadAwards(){ - this.bonusCnt++; - } public int getCnt() { return cnt; diff --git a/src/main/java/lotto/game/result/Result.java b/src/main/java/lotto/game/result/Result.java index 81b1134428..8bcadc6b0c 100644 --- a/src/main/java/lotto/game/result/Result.java +++ b/src/main/java/lotto/game/result/Result.java @@ -2,6 +2,17 @@ // strike ball count public class Result { + private static Result instance; + + private Result() { + } + + public static Result getInstance() { + if (instance == null) { + instance = new Result(); + } + return instance; + } public int[] result = new int[10]; public int bonusResult; diff --git a/src/main/java/lotto/game/user/User.java b/src/main/java/lotto/game/user/User.java index 35ca43ddde..a29b64a315 100644 --- a/src/main/java/lotto/game/user/User.java +++ b/src/main/java/lotto/game/user/User.java @@ -1,15 +1,21 @@ package lotto.game.user; -import lotto.game.result.Awards; - public class User { + private static User instance; - public int refund; - - public User(){ + private User(){ refund = 0; } + public static User getInstance(){ + if (instance == null) { + instance = new User(); + } + return instance; + } + + public int refund; + public void updateRefund(int plus){ refund += plus; } From e0e4875553c780dc40e2676331d31f4d99c5499b Mon Sep 17 00:00:00 2001 From: leesewon00 <107756067+leesewon00@users.noreply.github.com> Date: Sat, 8 Jul 2023 22:47:04 +0900 Subject: [PATCH 10/23] Update README.md --- README.md | 234 +++++++----------------------------------------------- 1 file changed, 27 insertions(+), 207 deletions(-) diff --git a/README.md b/README.md index 81b03cdba2..183869c538 100644 --- a/README.md +++ b/README.md @@ -1,207 +1,27 @@ -# 과제 - 로또 - -## 🔍 진행 방식 - -- 과제는 **기능 요구 사항, 프로그래밍 요구 사항, 과제 진행 요구 사항** 세 가지로 구성되어 있다. -- 세 개의 요구 사항을 만족하기 위해 노력한다. 특히 기능을 구현하기 전에 기능 목록을 만들고, 기능 단위로 커밋 하는 방식으로 진행한다. -- 기능 요구 사항에 기재되지 않은 내용은 스스로 판단하여 구현한다. - ---- - -## 📈 과제 진행 및 제출 방법 - -- 과제는 [java-lotto](https://github.com/LandvibeDev/java-lotto) 저장소를 Fork/Clone해 시작한다. -- **기능을 구현하기 전에 java-baseball-precourse/README.md 파일에 구현할 기능 목록을 정리**해 추가한다. -- **Git의 커밋 단위는 앞 단계에서 README.md 파일에 정리한 기능 목록 단위**로 추가한다. - - [AngularJS Commit Message Conventions](https://gist.github.com/stephenparish/9941e89d80e2bc58a153) 참고해 commit log를 남긴다. -- 과제 진행 및 제출 방법은 [우아한코스 과제 제출 문서](https://github.com/woowacourse/woowacourse-docs/tree/master/precourse) 를 참고한다. - - base repository를 `LandvibeDev/java-lotto`로 지정해서 PR 생성하면됨 - -
- -### 테스트 실행 가이드 - -- 터미널에서 `java -version`을 실행하여 Java 버전이 14인지 확인한다. 또는 Eclipse 또는 IntelliJ IDEA와 같은 IDE에서 Java 14로 실행되는지 확인한다. -- 터미널에서 Mac 또는 Linux 사용자의 경우 `./gradlew clean test` 명령을 실행 하고, - Windows 사용자의 경우 `gradlew.bat clean test` 명령을 실행할 때 동작 하는지 만 확인(테스트는 실패). - ---- - -## 🚀 기능 요구 사항 - -로또 게임 기능을 구현해야 한다. 로또 게임은 아래와 같은 규칙으로 진행된다. - -``` -- 로또 번호의 숫자 범위는 1~45까지이다. -- 1개의 로또를 발행할 때 중복되지 않는 6개의 숫자를 뽑는다. -- 당첨 번호 추첨 시 중복되지 않는 숫자 6개와 보너스 번호 1개를 뽑는다. -- 당첨은 1등부터 5등까지 있다. 당첨 기준과 금액은 아래와 같다. - - 1등: 6개 번호 일치 / 2,000,000,000원 - - 2등: 5개 번호 + 보너스 번호 일치 / 30,000,000원 - - 3등: 5개 번호 일치 / 1,500,000원 - - 4등: 4개 번호 일치 / 50,000원 - - 5등: 3개 번호 일치 / 5,000원 -``` - -- 로또 구입 금액을 입력하면 구입 금액에 해당하는 만큼 로또를 발행해야 한다. -- 로또 1장의 가격은 1,000원이다. -- 당첨 번호와 보너스 번호를 입력받는다. -- 사용자가 구매한 로또 번호와 당첨 번호를 비교하여 당첨 내역 및 수익률을 출력하고 로또 게임을 종료한다. -- 사용자가 잘못된 값을 입력할 경우 `IllegalArgumentException`를 발생시키고, "[ERROR]"로 시작하는 에러 메시지를 출력 후 종료한다. - -## ✍🏻 입출력 요구사항 - -### ⌨️ 입력 - -- 로또 구입 금액을 입력 받는다. 구입 금액은 1,000원 단위로 입력 받으며 1,000원으로 나누어 떨어지지 않는 경우 예외 처리한다. - -``` -14000 -``` - -- 당첨 번호를 입력 받는다. 번호는 쉼표(,)를 기준으로 구분한다. - -``` -1,2,3,4,5,6 -``` - -- 보너스 번호를 입력 받는다. - -``` -7 -``` - -### 🖥 출력 - -- 발행한 로또 수량 및 번호를 출력한다. 로또 번호는 오름차순으로 정렬하여 보여준다. - -``` -8개를 구매했습니다. -[8, 21, 23, 41, 42, 43] -[3, 5, 11, 16, 32, 38] -[7, 11, 16, 35, 36, 44] -[1, 8, 11, 31, 41, 42] -[13, 14, 16, 38, 42, 45] -[7, 11, 30, 40, 42, 43] -[2, 13, 22, 32, 38, 45] -[1, 3, 5, 14, 22, 45] -``` - -- 당첨 내역을 출력한다. - -``` -3개 일치 (5,000원) - 1개 -4개 일치 (50,000원) - 0개 -5개 일치 (1,500,000원) - 0개 -5개 일치, 보너스 볼 일치 (30,000,000원) - 0개 -6개 일치 (2,000,000,000원) - 0개 -``` - -- 수익률은 소수점 둘째 자리에서 반올림한다. (ex. 100.0%, 51.5%, 1,000,000.0%) - -``` -총 수익률은 62.5%입니다. -``` - -- 예외 상황 시 에러 문구를 출력해야 한다. 단, 에러 문구는 "[ERROR]"로 시작해야 한다. - -``` -[ERROR] 로또 번호는 1부터 45 사이의 숫자여야 합니다. -``` - -### 💻 실행 결과 예시 - -``` -구입금액을 입력해 주세요. -8000 - -8개를 구매했습니다. -[8, 21, 23, 41, 42, 43] -[3, 5, 11, 16, 32, 38] -[7, 11, 16, 35, 36, 44] -[1, 8, 11, 31, 41, 42] -[13, 14, 16, 38, 42, 45] -[7, 11, 30, 40, 42, 43] -[2, 13, 22, 32, 38, 45] -[1, 3, 5, 14, 22, 45] - -당첨 번호를 입력해 주세요. -1,2,3,4,5,6 - -보너스 번호를 입력해 주세요. -7 - -당첨 통계 ---- -3개 일치 (5,000원) - 1개 -4개 일치 (50,000원) - 0개 -5개 일치 (1,500,000원) - 0개 -5개 일치, 보너스 볼 일치 (30,000,000원) - 0개 -6개 일치 (2,000,000,000원) - 0개 -총 수익률은 62.5%입니다. -``` - ---- - -## 🎯 프로그래밍 요구 사항 - -- JDK 14 버전에서 실행 가능해야 한다. -- 프로그램 실행의 시작점은 `Application`의 `main()`이다. -- `build.gradle` 파일을 변경할 수 없고, 외부 라이브러리를 사용하지 않는다. -- [Java 코드 컨벤션](https://naver.github.io/hackday-conventions-java/) 가이드를 준수하며 프로그래밍한다. -- 프로그램 종료 시 `System.exit()`를 호출하지 않는다. -- 프로그램 구현이 완료되면 `ApplicationTest`의 모든 테스트가 성공해야 한다. -- 프로그래밍 요구 사항에서 달리 명시하지 않는 한 파일, 패키지 이름을 수정하거나 이동하지 않는다. -- indent(인덴트, 들여쓰기) depth를 3이 넘지 않도록 구현한다. 2까지만 허용한다. - - 예를 들어 while문 안에 if문이 있으면 들여쓰기는 2이다. - - 힌트: indent(인덴트, 들여쓰기) depth를 줄이는 좋은 방법은 함수(또는 메서드)를 분리하면 된다. -- 3항 연산자를 쓰지 않는다. -- 함수(또는 메서드)가 한 가지 일만 하도록 최대한 작게 만들어라. -- JUnit 5와 AssertJ를 이용하여 본인이 정리한 기능 목록이 정상 동작함을 테스트 코드로 확인한다. -- 함수(또는 메서드)의 길이가 15라인을 넘어가지 않도록 구현한다. - - 함수(또는 메서드)가 한 가지 일만 잘 하도록 구현한다. -- else 예약어를 쓰지 않는다. - - 힌트: if 조건절에서 값을 return하는 방식으로 구현하면 else를 사용하지 않아도 된다. - - else를 쓰지 말라고 하니 switch/case로 구현하는 경우가 있는데 switch/case도 허용하지 않는다. -- Java Enum을 적용한다. -- 도메인 로직에 단위 테스트를 구현해야 한다. 단, UI(System.out, System.in, Scanner) 로직은 제외한다. - - 핵심 로직을 구현하는 코드와 UI를 담당하는 로직을 분리해 구현한다. - -### 라이브러리 - -- [`camp.nextstep.edu.missionutils`](https://github.com/woowacourse-projects/mission-utils)에서 제공하는 `Randoms` 및 `Console` API를 사용하여 구현해야 한다. - - Random 값 추출은 `camp.nextstep.edu.missionutils.Randoms`의 `pickUniqueNumbersInRange()`를 활용한다. - - 사용자가 입력하는 값은 `camp.nextstep.edu.missionutils.Console`의 `readLine()`을 활용한다. - -#### 사용 예시 - -```java -List numbers = Randoms.pickUniqueNumbersInRange(1, 45, 6); -``` - -### Lotto 클래스 - -- 제공된 `Lotto` 클래스를 활용해 구현해야 한다. -- `Lotto`에 매개 변수가 없는 생성자를 추가할 수 없다. -- `numbers`의 접근 제어자인 private을 변경할 수 없다. -- `Lotto`에 필드(인스턴스 변수)를 추가할 수 없다. -- `Lotto`의 패키지 변경은 가능하다. - -```java -public class Lotto { - private final List numbers; - - public Lotto(List numbers) { - validate(numbers); - this.numbers = numbers; - } - - private void validate(List numbers) { - if (numbers.size() != 6) { - throw new IllegalArgumentException(); - } - } - - // TODO: 추가 기능 구현 -} -``` +-game +--CountMatch (숫자 일치여부 판별, 당첨액 판별) +--Game (게임 시작) +--MakeNumber (랜덤 번호 추출) +-input +--CheckInput (input 예외 판별) +--Input (구입 금액, 당첨 번호, 보너스 번호 입력) +-lotto +--Lotto (로또) +-print +--Print (담청 통계, 랜덤 번호, 수익률 출력) +-result +--Awards (보상금 책정) +--Count (로또 당첨 수량 결과 통계) +--Result (로또 일치여부 계산기) +-user +--User (유저별 환급액) + + +#기능구현 +1. 구매 금액 입력받기 +2. 구매 수량 확인 +3. 수량에 따른 로또 번호 생성 +4. 생성된 로또 번호 보여주기 +5. 당첨 번호, 보너스 번호 입력 +6. 결과 집계 +7. 결과 출력 From 375bc30a5d153958d63269c13c219ada61b56853 Mon Sep 17 00:00:00 2001 From: leesewon00 <107756067+leesewon00@users.noreply.github.com> Date: Sat, 8 Jul 2023 22:51:42 +0900 Subject: [PATCH 11/23] Update README.md MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit readme 추가 --- README.md | 37 +++++++++++++++++++------------------ 1 file changed, 19 insertions(+), 18 deletions(-) diff --git a/README.md b/README.md index 183869c538..923aa6c5e4 100644 --- a/README.md +++ b/README.md @@ -1,22 +1,23 @@ --game ---CountMatch (숫자 일치여부 판별, 당첨액 판별) ---Game (게임 시작) ---MakeNumber (랜덤 번호 추출) --input ---CheckInput (input 예외 판별) ---Input (구입 금액, 당첨 번호, 보너스 번호 입력) --lotto ---Lotto (로또) --print ---Print (담청 통계, 랜덤 번호, 수익률 출력) --result ---Awards (보상금 책정) ---Count (로또 당첨 수량 결과 통계) ---Result (로또 일치여부 계산기) --user ---User (유저별 환급액) - +|-- game +| |--CountMatch (숫자 일치여부 판별, 당첨액 판별) +| |--Game (게임 시작) +| |--MakeNumber (랜덤 번호 추출) +|-- input +| |--CheckInput (input 예외 판별) +| |--Input (구입 금액, 당첨 번호, 보너스 번호 입력) +|-- lotto +| |--Lotto (로또) +|-- print +| |--Print (담청 통계, 랜덤 번호, 수익률 출력) +|-- result +| |--Awards (보상금 책정) +| |--Count (로또 당첨 수량 결과 통계) +| |--Result (로또 일치여부 계산기) +|-- user +| |--User (유저별 환급액) + + #기능구현 1. 구매 금액 입력받기 2. 구매 수량 확인 From 27d2b0f303873f47bc6a19eb711da4f2352e852d Mon Sep 17 00:00:00 2001 From: leesewon00 Date: Sat, 8 Jul 2023 22:58:33 +0900 Subject: [PATCH 12/23] =?UTF-8?q?=EC=A0=91=EA=B7=BC=20=EC=A0=9C=ED=95=9C?= =?UTF-8?q?=EC=9E=90=20=EC=88=98=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/main/java/lotto/game/result/Result.java | 4 ++-- src/main/java/lotto/game/user/User.java | 2 +- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/src/main/java/lotto/game/result/Result.java b/src/main/java/lotto/game/result/Result.java index 8bcadc6b0c..7660ad78bd 100644 --- a/src/main/java/lotto/game/result/Result.java +++ b/src/main/java/lotto/game/result/Result.java @@ -13,8 +13,8 @@ public static Result getInstance() { } return instance; } - public int[] result = new int[10]; - public int bonusResult; + private int[] result = new int[10]; + private int bonusResult; public void upCountResult(int idx){ result[idx]++; diff --git a/src/main/java/lotto/game/user/User.java b/src/main/java/lotto/game/user/User.java index a29b64a315..b0b7869e4e 100644 --- a/src/main/java/lotto/game/user/User.java +++ b/src/main/java/lotto/game/user/User.java @@ -14,7 +14,7 @@ public static User getInstance(){ return instance; } - public int refund; + private int refund; public void updateRefund(int plus){ refund += plus; From a42ea70b90deb52e538b4ccc064bddd4db729e5e Mon Sep 17 00:00:00 2001 From: leesewon00 Date: Mon, 10 Jul 2023 13:55:38 +0900 Subject: [PATCH 13/23] =?UTF-8?q?=EC=9D=B8=ED=84=B0=ED=8E=98=EC=9D=B4?= =?UTF-8?q?=EC=8A=A4=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/Application.java | 5 +++-- src/main/java/lotto/game/game/{Game.java => LottoGame.java} | 6 ++++-- 2 files changed, 7 insertions(+), 4 deletions(-) rename src/main/java/lotto/game/game/{Game.java => LottoGame.java} (93%) diff --git a/src/main/java/lotto/Application.java b/src/main/java/lotto/Application.java index 5e2eb8deec..deb2df1d2a 100644 --- a/src/main/java/lotto/Application.java +++ b/src/main/java/lotto/Application.java @@ -2,6 +2,7 @@ import lotto.game.game.CountMatch; import lotto.game.game.Game; +import lotto.game.game.LottoGame; import lotto.game.input.Input; import lotto.game.print.Print; @@ -12,7 +13,7 @@ public static void main(String[] args) { Print print = new Print(); CountMatch countMatch = new CountMatch(); - Game game = new Game(input,print,countMatch); - game.start(); + Game lottoGame = new LottoGame(input,print,countMatch); + lottoGame.start(); } } \ No newline at end of file diff --git a/src/main/java/lotto/game/game/Game.java b/src/main/java/lotto/game/game/LottoGame.java similarity index 93% rename from src/main/java/lotto/game/game/Game.java rename to src/main/java/lotto/game/game/LottoGame.java index d2d068bbe2..fe95259399 100644 --- a/src/main/java/lotto/game/game/Game.java +++ b/src/main/java/lotto/game/game/LottoGame.java @@ -12,7 +12,7 @@ import static lotto.game.game.MakeNumber.makeRandomLottoNumbers; -public class Game { +public class LottoGame implements Game{ Result result = Result.getInstance(); User user = User.getInstance(); Awards awards = Awards.getInstance(); @@ -23,17 +23,19 @@ public class Game { private final CountMatch countMatch; private ListlottoList; - public Game(Input input, Print print, CountMatch countMatch){ + public LottoGame(Input input, Print print, CountMatch countMatch){ this.input = input; this.print = print; this.countMatch = countMatch; this.lottoList = new ArrayList<>(); } + @Override public void start() { // 1. 수량 입력받기 Integer purchaseMoney = input.getPurchaseMoney(); if(purchaseMoney==-1){ + // error 발생 return; } From 8d4bbedc61588c53727a766795734ccaaf829613 Mon Sep 17 00:00:00 2001 From: leesewon00 Date: Mon, 10 Jul 2023 13:56:02 +0900 Subject: [PATCH 14/23] =?UTF-8?q?=EC=9D=B8=ED=84=B0=ED=8E=98=EC=9D=B4?= =?UTF-8?q?=EC=8A=A4=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/game/game/Game.java | 5 +++++ 1 file changed, 5 insertions(+) create mode 100644 src/main/java/lotto/game/game/Game.java diff --git a/src/main/java/lotto/game/game/Game.java b/src/main/java/lotto/game/game/Game.java new file mode 100644 index 0000000000..f08ae05b57 --- /dev/null +++ b/src/main/java/lotto/game/game/Game.java @@ -0,0 +1,5 @@ +package lotto.game.game; + +public interface Game { + void start(); +} From 045f3092aac11b364cdf52b38fa82d23a509f8f0 Mon Sep 17 00:00:00 2001 From: leesewon00 Date: Mon, 10 Jul 2023 14:27:13 +0900 Subject: [PATCH 15/23] =?UTF-8?q?enum=20=ED=81=B4=EB=9E=98=EC=8A=A4=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/game/input/Input.java | 6 +++--- .../java/lotto/game/input/InputMessage.java | 18 ++++++++++++++++++ 2 files changed, 21 insertions(+), 3 deletions(-) create mode 100644 src/main/java/lotto/game/input/InputMessage.java diff --git a/src/main/java/lotto/game/input/Input.java b/src/main/java/lotto/game/input/Input.java index 8bf7f23a4a..75355f48cf 100644 --- a/src/main/java/lotto/game/input/Input.java +++ b/src/main/java/lotto/game/input/Input.java @@ -7,7 +7,7 @@ public class Input { public Integer getPurchaseMoney() { - System.out.println("구입 금액을 입력해 주세요"); + System.out.println(InputMessage.INPUT_PURCHASE_PRICE.getString()); String str = Console.readLine(); try { @@ -23,7 +23,7 @@ public Integer getPurchaseMoney() { } public ArrayList getWinningNumber() { - System.out.println("당첨 번호를 입력해 주세요."); + System.out.println(InputMessage.INPUT_NUMBERS.getString()); String str = Console.readLine(); String[] split = str.split(","); @@ -36,7 +36,7 @@ public ArrayList getWinningNumber() { } public Integer getBonusNumber() { - System.out.println("보너스 번호를 입력해 주세요."); + System.out.println(InputMessage.INPUT_BONUS_NUMBER.getString()); Integer bonusNumber = Integer.valueOf(Console.readLine()); System.out.println(); return bonusNumber; diff --git a/src/main/java/lotto/game/input/InputMessage.java b/src/main/java/lotto/game/input/InputMessage.java new file mode 100644 index 0000000000..d0828d3fa1 --- /dev/null +++ b/src/main/java/lotto/game/input/InputMessage.java @@ -0,0 +1,18 @@ +package lotto.game.input; + +public enum InputMessage { + + INPUT_PURCHASE_PRICE("구입 금액을 입력해 주세요."), + INPUT_NUMBERS("당첨 번호를 입력해 주세요"), + INPUT_BONUS_NUMBER("보너스 번호를 입력해 주세요"); + + private final String string; + + InputMessage(String string){ + this.string = string; + } + + String getString(){ + return string; + } +} From 0f20bd83542f037c61450aafda319451f68d4cea Mon Sep 17 00:00:00 2001 From: leesewon00 Date: Mon, 10 Jul 2023 17:12:15 +0900 Subject: [PATCH 16/23] =?UTF-8?q?Input,=20Print,=20CountMatch=20=EC=9D=B8?= =?UTF-8?q?=ED=84=B0=ED=8E=98=EC=9D=B4=EC=8A=A4=20=EA=B5=AC=ED=98=84?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/main/java/lotto/Application.java | 11 +++-- src/main/java/lotto/game/game/CountMatch.java | 40 ++--------------- src/main/java/lotto/game/input/Input.java | 40 ++--------------- src/main/java/lotto/game/print/Print.java | 45 +++---------------- 4 files changed, 19 insertions(+), 117 deletions(-) diff --git a/src/main/java/lotto/Application.java b/src/main/java/lotto/Application.java index deb2df1d2a..17afb27e84 100644 --- a/src/main/java/lotto/Application.java +++ b/src/main/java/lotto/Application.java @@ -1,19 +1,22 @@ package lotto; import lotto.game.game.CountMatch; +import lotto.game.game.LottoCountMatch; import lotto.game.game.Game; import lotto.game.game.LottoGame; import lotto.game.input.Input; +import lotto.game.input.LottoInput; +import lotto.game.print.LottoPrint; import lotto.game.print.Print; public class Application { public static void main(String[] args) { // TODO: 프로그램 구현 - Input input = new Input(); - Print print = new Print(); - CountMatch countMatch = new CountMatch(); + Input input = new LottoInput(); + Print print = new LottoPrint(); + CountMatch countMatch = new LottoCountMatch(); - Game lottoGame = new LottoGame(input,print,countMatch); + Game lottoGame = new LottoGame(input, print, countMatch); lottoGame.start(); } } \ No newline at end of file diff --git a/src/main/java/lotto/game/game/CountMatch.java b/src/main/java/lotto/game/game/CountMatch.java index 29c7591389..4c47a67d2a 100644 --- a/src/main/java/lotto/game/game/CountMatch.java +++ b/src/main/java/lotto/game/game/CountMatch.java @@ -1,45 +1,11 @@ package lotto.game.game; -import lotto.game.result.Awards; -import lotto.game.result.Count; -import lotto.game.result.Result; -import lotto.game.user.User; - -import javax.print.DocFlavor; import java.util.ArrayList; import java.util.List; -public class CountMatch { - // 싱글톤으로 해결해보자 - Count count = Count.getInstance(); - Result result = Result.getInstance(); - Awards awards = Awards.getInstance(); - User user = User.getInstance(); +public interface CountMatch { + void countMatchNumber(ArrayList winningNumber, Integer bonusNumber, List lottoNumber); - public void countMatchNumber(ArrayList winningNumber, Integer bonusNumber, List lottoNumber) { - for (Integer num : lottoNumber) { - if (winningNumber.contains(num)) { - count.countUp(); - } - } - // 보너스 체크 - if(lottoNumber.contains(bonusNumber)){ - count.countUpBonus(); - } - } - public void countMatchRefund(int cnt, int bonusCnt) { - result.upCountResult(cnt); - user.updateRefund(awards.getAwards()[cnt]); + void countMatchRefund(int cnt, int bonusCnt); - if(cnt ==5){ - if(bonusCnt ==1){ - result.upCountBonusResult(); - user.updateRefund(awards.getBonusAwards()); - } - if(bonusCnt !=1){ - result.downCountResult(cnt); - user.updateRefund(-awards.getAwards()[cnt]); - } - } - } } diff --git a/src/main/java/lotto/game/input/Input.java b/src/main/java/lotto/game/input/Input.java index 75355f48cf..b841e2df10 100644 --- a/src/main/java/lotto/game/input/Input.java +++ b/src/main/java/lotto/game/input/Input.java @@ -1,44 +1,12 @@ package lotto.game.input; -import camp.nextstep.edu.missionutils.Console; - import java.util.ArrayList; -public class Input { - - public Integer getPurchaseMoney() { - System.out.println(InputMessage.INPUT_PURCHASE_PRICE.getString()); - String str = Console.readLine(); - - try { - CheckInput.purchaseCheck(str); - }catch (IllegalArgumentException e){ - System.out.println(e.getMessage()); - return -1; - } - - int purchase = Integer.parseInt(str); - System.out.println(); - return purchase; - } +public interface Input { - public ArrayList getWinningNumber() { - System.out.println(InputMessage.INPUT_NUMBERS.getString()); - String str = Console.readLine(); - String[] split = str.split(","); + ArrayList getWinningNumbers(); - ArrayListarrayList = new ArrayList<>(); - for(int i = 0; i lottoList); - public void printResultStart(){ - System.out.println("당첨 통계"); - System.out.println("---"); - } - public void printNumberList(List lottoList) { - for (int i = 0; i < lottoList.size(); i++) { - Lotto lotto = lottoList.get(i); - System.out.println(lotto.getLottoNumber()); - } - System.out.println(); - } + void printResultStart(); - public void printRateOfReturn(Integer purchaseMoney, User user) { - double percent = (double) user.getRefund() / purchaseMoney * 100; - double roundedPercent = Math.round(percent * 10.0) / 10.0; - System.out.println("총 수익률은 " + roundedPercent+"%입니다."); - } + void printResult(Awards awards, Result result); - public void printResult(Awards awards, Result result) { - for(int i = 3; i<=6; i++){ - String printMessage = ""; - printMessage += i+"개 일치 "; - // 5000원 - DecimalFormat decimalFormat = new DecimalFormat("#,###"); - String formattedValue = "(" + decimalFormat.format(awards.getAwards()[i]) + "원) - "; - printMessage += formattedValue; - printMessage += result.getResult()[i]+"개"; - - - if(i==5){ - printMessage += '\n'; - printMessage += i+"개 일치, 보너스 볼 일치 "; - formattedValue = "(" + decimalFormat.format(awards.getBonusAwards()) + "원) - "; - printMessage+=formattedValue; - printMessage += result.getBonusResult()+"개"; - } - - System.out.println(printMessage); - } - } + void printRateOfReturn(Integer purchaseMoney, User user); } From cb7a84e47ae3f8f60dec2673a31511e7357a6aff Mon Sep 17 00:00:00 2001 From: leesewon00 Date: Mon, 10 Jul 2023 17:34:14 +0900 Subject: [PATCH 17/23] =?UTF-8?q?=EB=A9=94=EC=86=8C=EB=93=9C=20=EC=B6=94?= =?UTF-8?q?=EC=B6=9C?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/main/java/lotto/game/game/CountMatch.java | 3 + .../java/lotto/game/game/LottoCountMatch.java | 61 +++++++++++++++++++ src/main/java/lotto/game/game/LottoGame.java | 16 +---- .../java/lotto/game/print/LottoPrint.java | 61 +++++++++++++++++++ src/main/java/lotto/game/print/Print.java | 2 + 5 files changed, 130 insertions(+), 13 deletions(-) create mode 100644 src/main/java/lotto/game/game/LottoCountMatch.java create mode 100644 src/main/java/lotto/game/print/LottoPrint.java diff --git a/src/main/java/lotto/game/game/CountMatch.java b/src/main/java/lotto/game/game/CountMatch.java index 4c47a67d2a..d6cae55b10 100644 --- a/src/main/java/lotto/game/game/CountMatch.java +++ b/src/main/java/lotto/game/game/CountMatch.java @@ -1,5 +1,7 @@ package lotto.game.game; +import lotto.game.lotto.Lotto; + import java.util.ArrayList; import java.util.List; @@ -8,4 +10,5 @@ public interface CountMatch { void countMatchRefund(int cnt, int bonusCnt); + void countLottoResult(ArrayList winningNumber, Integer bonusNumber, ListlottoList); } diff --git a/src/main/java/lotto/game/game/LottoCountMatch.java b/src/main/java/lotto/game/game/LottoCountMatch.java new file mode 100644 index 0000000000..89daa33f91 --- /dev/null +++ b/src/main/java/lotto/game/game/LottoCountMatch.java @@ -0,0 +1,61 @@ +package lotto.game.game; + +import lotto.game.lotto.Lotto; +import lotto.game.result.Awards; +import lotto.game.result.Count; +import lotto.game.result.Result; +import lotto.game.user.User; + +import java.util.ArrayList; +import java.util.List; + +public class LottoCountMatch implements CountMatch { + // 싱글톤으로 해결해보자 + Count count = Count.getInstance(); + Result result = Result.getInstance(); + Awards awards = Awards.getInstance(); + User user = User.getInstance(); + + @Override + public void countMatchNumber(ArrayList winningNumber, Integer bonusNumber, List lottoNumber) { + for (Integer num : lottoNumber) { + if (winningNumber.contains(num)) { + count.countUp(); + } + } + // 보너스 체크 + if(lottoNumber.contains(bonusNumber)){ + count.countUpBonus(); + } + } + @Override + public void countMatchRefund(int cnt, int bonusCnt) { + result.upCountResult(cnt); + user.updateRefund(awards.getAwards()[cnt]); + + if(cnt ==5){ + if(bonusCnt ==1){ + result.upCountBonusResult(); + user.updateRefund(awards.getBonusAwards()); + } + if(bonusCnt !=1){ + result.downCountResult(cnt); + user.updateRefund(-awards.getAwards()[cnt]); + } + } + } + + @Override + public void countLottoResult(ArrayList winningNumber, Integer bonusNumber, ListlottoList) { + for(Lotto lotto : lottoList){ + // 카운팅은 매번 초기화 되어야한다. + count.reset(); + // 저장된 list 하나씩 빼오기 + List lottoNumber = lotto.getLottoNumber(); + // 번호 일치여부 판별 + countMatchNumber(winningNumber, bonusNumber, lottoNumber); + // user refund update + countMatchRefund(count.getCnt(), count.getBonusCnt()); + } + } +} diff --git a/src/main/java/lotto/game/game/LottoGame.java b/src/main/java/lotto/game/game/LottoGame.java index fe95259399..6fd443bca4 100644 --- a/src/main/java/lotto/game/game/LottoGame.java +++ b/src/main/java/lotto/game/game/LottoGame.java @@ -16,7 +16,6 @@ public class LottoGame implements Game{ Result result = Result.getInstance(); User user = User.getInstance(); Awards awards = Awards.getInstance(); - Count count = Count.getInstance(); private final Input input; private final Print print; @@ -41,7 +40,7 @@ public void start() { // 2. 구매수량 check int cycle = purchaseMoney / 1000; - System.out.println(cycle + "개를 구매했습니다."); + print.printPurchaseCount(cycle); // 3. 수량만큼 로또 번호 생성 makeRandomLottoNumbers(cycle,lottoList); @@ -50,20 +49,11 @@ public void start() { print.printNumberList(lottoList); // 5. 당첨 번호, 보너스 번호 입력받기 - ArrayList winningNumber = input.getWinningNumber(); + ArrayList winningNumber = input.getWinningNumbers(); Integer bonusNumber = input.getBonusNumber(); // 6. 결과 집계 - for(Lotto lotto : lottoList){ - // 카운팅은 매번 초기화 되어야한다. - count.reset(); - // 저장된 list 하나씩 빼오기 - List lottoNumber = lotto.getLottoNumber(); - // 번호 일치여부 판별 - countMatch.countMatchNumber(winningNumber, bonusNumber, lottoNumber); - // user refund update - countMatch.countMatchRefund(count.getCnt(), count.getBonusCnt()); - } + countMatch.countLottoResult(winningNumber, bonusNumber, lottoList); // 7. 결과 출력 print.printResultStart(); diff --git a/src/main/java/lotto/game/print/LottoPrint.java b/src/main/java/lotto/game/print/LottoPrint.java new file mode 100644 index 0000000000..987ceae992 --- /dev/null +++ b/src/main/java/lotto/game/print/LottoPrint.java @@ -0,0 +1,61 @@ +package lotto.game.print; + +import lotto.game.lotto.Lotto; +import lotto.game.result.Awards; +import lotto.game.result.Result; +import lotto.game.user.User; + +import java.text.DecimalFormat; +import java.util.List; + +public class LottoPrint implements Print{ + + @Override + public void printResultStart(){ + System.out.println("당첨 통계"); + System.out.println("---"); + } + @Override + public void printNumberList(List lottoList) { + for (int i = 0; i < lottoList.size(); i++) { + Lotto lotto = lottoList.get(i); + System.out.println(lotto.getLottoNumber()); + } + System.out.println(); + } + @Override + public void printRateOfReturn(Integer purchaseMoney, User user) { + double percent = (double) user.getRefund() / purchaseMoney * 100; + double roundedPercent = Math.round(percent * 10.0) / 10.0; + System.out.println("총 수익률은 " + roundedPercent+"%입니다."); + } + + @Override + public void printResult(Awards awards, Result result) { + for(int i = 3; i<=6; i++){ + String printMessage = ""; + printMessage += i+"개 일치 "; + // 5000원 + DecimalFormat decimalFormat = new DecimalFormat("#,###"); + String formattedValue = "(" + decimalFormat.format(awards.getAwards()[i]) + "원) - "; + printMessage += formattedValue; + printMessage += result.getResult()[i]+"개"; + + + if(i==5){ + printMessage += '\n'; + printMessage += i+"개 일치, 보너스 볼 일치 "; + formattedValue = "(" + decimalFormat.format(awards.getBonusAwards()) + "원) - "; + printMessage+=formattedValue; + printMessage += result.getBonusResult()+"개"; + } + + System.out.println(printMessage); + } + } + + @Override + public void printPurchaseCount(int cnt){ + System.out.println(cnt + "개를 구매했습니다."); + } +} diff --git a/src/main/java/lotto/game/print/Print.java b/src/main/java/lotto/game/print/Print.java index 012b76daf6..e4cdd40e0e 100644 --- a/src/main/java/lotto/game/print/Print.java +++ b/src/main/java/lotto/game/print/Print.java @@ -15,4 +15,6 @@ public interface Print { void printResult(Awards awards, Result result); void printRateOfReturn(Integer purchaseMoney, User user); + + void printPurchaseCount(int cnt); } From edfbeff0d8b26fc0b774d657be3ce5613207edb5 Mon Sep 17 00:00:00 2001 From: leesewon00 Date: Mon, 10 Jul 2023 17:35:45 +0900 Subject: [PATCH 18/23] =?UTF-8?q?Input=20=EC=9D=B8=ED=84=B0=ED=8E=98?= =?UTF-8?q?=EC=9D=B4=EC=8A=A4=20=EA=B5=AC=ED=98=84=EC=B2=B4?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../java/lotto/game/input/LottoInput.java | 47 +++++++++++++++++++ 1 file changed, 47 insertions(+) create mode 100644 src/main/java/lotto/game/input/LottoInput.java diff --git a/src/main/java/lotto/game/input/LottoInput.java b/src/main/java/lotto/game/input/LottoInput.java new file mode 100644 index 0000000000..4f9050291e --- /dev/null +++ b/src/main/java/lotto/game/input/LottoInput.java @@ -0,0 +1,47 @@ +package lotto.game.input; + +import camp.nextstep.edu.missionutils.Console; + +import java.util.ArrayList; + +public class LottoInput implements Input { + + @Override + public Integer getPurchaseMoney() { + System.out.println(InputMessage.INPUT_PURCHASE_PRICE.getString()); + String str = Console.readLine(); + + try { + CheckInput.purchaseCheck(str); + }catch (IllegalArgumentException e){ + System.out.println(e.getMessage()); + return -1; + } + + int purchase = Integer.parseInt(str); + System.out.println(); + return purchase; + } + + @Override + public ArrayList getWinningNumbers() { + System.out.println(InputMessage.INPUT_NUMBERS.getString()); + String str = Console.readLine(); + String[] split = str.split(","); + + ArrayListarrayList = new ArrayList<>(); + for(int i = 0; i Date: Mon, 10 Jul 2023 18:07:32 +0900 Subject: [PATCH 19/23] add NumberRange enum update InputMessage enum --- .../{input => constant}/InputMessage.java | 4 ++-- .../java/lotto/game/constant/NumberRange.java | 24 +++++++++++++++++++ src/main/java/lotto/game/game/MakeNumber.java | 7 +++--- .../java/lotto/game/input/LottoInput.java | 13 +++++----- .../java/lotto/game/print/LottoPrint.java | 3 ++- 5 files changed, 39 insertions(+), 12 deletions(-) rename src/main/java/lotto/game/{input => constant}/InputMessage.java (85%) create mode 100644 src/main/java/lotto/game/constant/NumberRange.java diff --git a/src/main/java/lotto/game/input/InputMessage.java b/src/main/java/lotto/game/constant/InputMessage.java similarity index 85% rename from src/main/java/lotto/game/input/InputMessage.java rename to src/main/java/lotto/game/constant/InputMessage.java index d0828d3fa1..363c3f04a8 100644 --- a/src/main/java/lotto/game/input/InputMessage.java +++ b/src/main/java/lotto/game/constant/InputMessage.java @@ -1,4 +1,4 @@ -package lotto.game.input; +package lotto.game.constant; public enum InputMessage { @@ -12,7 +12,7 @@ public enum InputMessage { this.string = string; } - String getString(){ + public String getString(){ return string; } } diff --git a/src/main/java/lotto/game/constant/NumberRange.java b/src/main/java/lotto/game/constant/NumberRange.java new file mode 100644 index 0000000000..cfe09ef30a --- /dev/null +++ b/src/main/java/lotto/game/constant/NumberRange.java @@ -0,0 +1,24 @@ +package lotto.game.constant; + +public enum NumberRange { + RESULT_START(3), + RESULT_END(6), + RANDOM_START(1), + RANDOM_END(45), + RANDOM_COUNT(6); + + public int value() { + return value; + } + + private final int value; + + NumberRange(int value) { + this.value = value; + } + + @Override + public String toString() { + return String.valueOf(value); + } +} diff --git a/src/main/java/lotto/game/game/MakeNumber.java b/src/main/java/lotto/game/game/MakeNumber.java index 35068e2410..ed8aa74ed6 100644 --- a/src/main/java/lotto/game/game/MakeNumber.java +++ b/src/main/java/lotto/game/game/MakeNumber.java @@ -2,15 +2,16 @@ import camp.nextstep.edu.missionutils.Randoms; import lotto.game.lotto.Lotto; - -import java.util.ArrayList; import java.util.List; +import static lotto.game.constant.NumberRange.*; + public class MakeNumber { + public static List makeRandomLottoNumbers(int cycle, ListlottoList) { for (int i = 0; i < cycle; i++) { // 로또 번호 생성 - List numbers = Randoms.pickUniqueNumbersInRange(1, 45, 6); + List numbers = Randoms.pickUniqueNumbersInRange(RANDOM_START.value(), RANDOM_END.value(), RANDOM_COUNT.value()); // 오름차순 정렬 //Collections.sort(numbers); diff --git a/src/main/java/lotto/game/input/LottoInput.java b/src/main/java/lotto/game/input/LottoInput.java index 4f9050291e..0f3b51e437 100644 --- a/src/main/java/lotto/game/input/LottoInput.java +++ b/src/main/java/lotto/game/input/LottoInput.java @@ -1,14 +1,15 @@ package lotto.game.input; import camp.nextstep.edu.missionutils.Console; - import java.util.ArrayList; +import static lotto.game.constant.InputMessage.*; + public class LottoInput implements Input { @Override public Integer getPurchaseMoney() { - System.out.println(InputMessage.INPUT_PURCHASE_PRICE.getString()); + System.out.println(INPUT_PURCHASE_PRICE.getString()); String str = Console.readLine(); try { @@ -25,13 +26,13 @@ public Integer getPurchaseMoney() { @Override public ArrayList getWinningNumbers() { - System.out.println(InputMessage.INPUT_NUMBERS.getString()); + System.out.println(INPUT_NUMBERS.getString()); String str = Console.readLine(); String[] split = str.split(","); ArrayListarrayList = new ArrayList<>(); - for(int i = 0; i getWinningNumbers() { @Override public Integer getBonusNumber() { - System.out.println(InputMessage.INPUT_BONUS_NUMBER.getString()); + System.out.println(INPUT_BONUS_NUMBER.getString()); Integer bonusNumber = Integer.valueOf(Console.readLine()); System.out.println(); return bonusNumber; diff --git a/src/main/java/lotto/game/print/LottoPrint.java b/src/main/java/lotto/game/print/LottoPrint.java index 987ceae992..841f0ceb80 100644 --- a/src/main/java/lotto/game/print/LottoPrint.java +++ b/src/main/java/lotto/game/print/LottoPrint.java @@ -7,6 +7,7 @@ import java.text.DecimalFormat; import java.util.List; +import static lotto.game.constant.NumberRange.*; public class LottoPrint implements Print{ @@ -32,7 +33,7 @@ public void printRateOfReturn(Integer purchaseMoney, User user) { @Override public void printResult(Awards awards, Result result) { - for(int i = 3; i<=6; i++){ + for(int i = RESULT_START.value(); i<= RESULT_END.value(); i++){ String printMessage = ""; printMessage += i+"개 일치 "; // 5000원 From 9aa0166d19913c070c2351dffd36b7b8afb56dd8 Mon Sep 17 00:00:00 2001 From: leesewon00 Date: Mon, 10 Jul 2023 21:23:42 +0900 Subject: [PATCH 20/23] =?UTF-8?q?=EB=8C=80=EA=B3=B5=EC=82=AC(1)=20?= =?UTF-8?q?=EC=88=9C=EC=88=98=ED=95=A8=EC=88=98=ED=99=94?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/main/java/lotto/game/game/CountMatch.java | 8 +- .../java/lotto/game/game/LottoCountMatch.java | 85 ++++++++++--------- src/main/java/lotto/game/game/LottoGame.java | 18 ++-- .../java/lotto/game/print/LottoPrint.java | 42 ++++++--- src/main/java/lotto/game/print/Print.java | 8 +- src/main/java/lotto/game/result/Awards.java | 33 ------- src/main/java/lotto/game/result/Count.java | 37 -------- src/main/java/lotto/game/result/Result.java | 35 -------- src/main/java/lotto/game/user/User.java | 25 ------ 9 files changed, 86 insertions(+), 205 deletions(-) delete mode 100644 src/main/java/lotto/game/result/Awards.java delete mode 100644 src/main/java/lotto/game/result/Count.java delete mode 100644 src/main/java/lotto/game/result/Result.java delete mode 100644 src/main/java/lotto/game/user/User.java diff --git a/src/main/java/lotto/game/game/CountMatch.java b/src/main/java/lotto/game/game/CountMatch.java index d6cae55b10..54055013a6 100644 --- a/src/main/java/lotto/game/game/CountMatch.java +++ b/src/main/java/lotto/game/game/CountMatch.java @@ -1,14 +1,12 @@ package lotto.game.game; import lotto.game.lotto.Lotto; +import lotto.game.result.LottoCount; import java.util.ArrayList; import java.util.List; public interface CountMatch { - void countMatchNumber(ArrayList winningNumber, Integer bonusNumber, List lottoNumber); - - void countMatchRefund(int cnt, int bonusCnt); - - void countLottoResult(ArrayList winningNumber, Integer bonusNumber, ListlottoList); + List countMatchNumber(ArrayList winningNumber, Integer bonusNumber, ListLottoList); + int countMatchReward(ListlottoCountList); } diff --git a/src/main/java/lotto/game/game/LottoCountMatch.java b/src/main/java/lotto/game/game/LottoCountMatch.java index 89daa33f91..be03bfbe5e 100644 --- a/src/main/java/lotto/game/game/LottoCountMatch.java +++ b/src/main/java/lotto/game/game/LottoCountMatch.java @@ -1,61 +1,62 @@ package lotto.game.game; import lotto.game.lotto.Lotto; -import lotto.game.result.Awards; -import lotto.game.result.Count; -import lotto.game.result.Result; -import lotto.game.user.User; +import lotto.game.result.LottoCount; import java.util.ArrayList; import java.util.List; +import static lotto.game.constant.WinningReward.*; + public class LottoCountMatch implements CountMatch { - // 싱글톤으로 해결해보자 - Count count = Count.getInstance(); - Result result = Result.getInstance(); - Awards awards = Awards.getInstance(); - User user = User.getInstance(); @Override - public void countMatchNumber(ArrayList winningNumber, Integer bonusNumber, List lottoNumber) { - for (Integer num : lottoNumber) { - if (winningNumber.contains(num)) { - count.countUp(); - } - } - // 보너스 체크 - if(lottoNumber.contains(bonusNumber)){ - count.countUpBonus(); - } - } - @Override - public void countMatchRefund(int cnt, int bonusCnt) { - result.upCountResult(cnt); - user.updateRefund(awards.getAwards()[cnt]); - - if(cnt ==5){ - if(bonusCnt ==1){ - result.upCountBonusResult(); - user.updateRefund(awards.getBonusAwards()); + public List countMatchNumber(ArrayList winningNumber, Integer bonusNumber, ListlottoList) { + ListlottoCountList = new ArrayList<>(); + for(Lotto lotto : lottoList){ + int cnt = 0; + int bonusCnt = 0; + ListlottoNumber = lotto.getLottoNumber(); + for (Integer num : lottoNumber) { + if (winningNumber.contains(num)) { + cnt++; + } } - if(bonusCnt !=1){ - result.downCountResult(cnt); - user.updateRefund(-awards.getAwards()[cnt]); + if(lottoNumber.contains(bonusNumber)){ + bonusCnt++; } + LottoCount lottoCount = new LottoCount(cnt,bonusCnt); + lottoCountList.add(lottoCount); } + + return lottoCountList; } @Override - public void countLottoResult(ArrayList winningNumber, Integer bonusNumber, ListlottoList) { - for(Lotto lotto : lottoList){ - // 카운팅은 매번 초기화 되어야한다. - count.reset(); - // 저장된 list 하나씩 빼오기 - List lottoNumber = lotto.getLottoNumber(); - // 번호 일치여부 판별 - countMatchNumber(winningNumber, bonusNumber, lottoNumber); - // user refund update - countMatchRefund(count.getCnt(), count.getBonusCnt()); + public int countMatchReward(ListlottoCountList){ + int reward = 0; + for(LottoCount lottoCount : lottoCountList){ + int cnt = lottoCount.getCnt(); + int bonusCnt = lottoCount.getBonusCnt(); + + if(cnt==3){ + reward += THREE_RIGHT.value(); + } + if(cnt==4){ + reward += FOUR_RIGHT.value(); + } + if(cnt==5){ + if(bonusCnt==1){ + reward += FIVE_AND_BONUS_RIGHT.value(); + } + if(bonusCnt==0){ + reward += FIVE_RIGHT.value(); + } + } + if(cnt==6){ + reward += SIX_RIGHT.value(); + } } + return reward; } } diff --git a/src/main/java/lotto/game/game/LottoGame.java b/src/main/java/lotto/game/game/LottoGame.java index 6fd443bca4..dd9f0a5ecc 100644 --- a/src/main/java/lotto/game/game/LottoGame.java +++ b/src/main/java/lotto/game/game/LottoGame.java @@ -3,24 +3,19 @@ import lotto.game.input.Input; import lotto.game.lotto.Lotto; import lotto.game.print.Print; -import lotto.game.result.Awards; -import lotto.game.result.Count; -import lotto.game.result.Result; -import lotto.game.user.User; +import lotto.game.result.LottoCount; + import java.util.ArrayList; import java.util.List; import static lotto.game.game.MakeNumber.makeRandomLottoNumbers; public class LottoGame implements Game{ - Result result = Result.getInstance(); - User user = User.getInstance(); - Awards awards = Awards.getInstance(); private final Input input; private final Print print; private final CountMatch countMatch; - private ListlottoList; + private final ListlottoList; public LottoGame(Input input, Print print, CountMatch countMatch){ this.input = input; @@ -53,12 +48,13 @@ public void start() { Integer bonusNumber = input.getBonusNumber(); // 6. 결과 집계 - countMatch.countLottoResult(winningNumber, bonusNumber, lottoList); + List lottoCountList = countMatch.countMatchNumber(winningNumber, bonusNumber, lottoList); + int reward = countMatch.countMatchReward(lottoCountList); // 7. 결과 출력 print.printResultStart(); - print.printResult(awards,result); - print.printRateOfReturn(purchaseMoney,user); + print.printResult(lottoCountList); + print.printRateOfReturn(purchaseMoney,reward); } diff --git a/src/main/java/lotto/game/print/LottoPrint.java b/src/main/java/lotto/game/print/LottoPrint.java index 841f0ceb80..2d97e13d23 100644 --- a/src/main/java/lotto/game/print/LottoPrint.java +++ b/src/main/java/lotto/game/print/LottoPrint.java @@ -1,9 +1,7 @@ package lotto.game.print; import lotto.game.lotto.Lotto; -import lotto.game.result.Awards; -import lotto.game.result.Result; -import lotto.game.user.User; +import lotto.game.result.LottoCount; import java.text.DecimalFormat; import java.util.List; @@ -11,6 +9,8 @@ public class LottoPrint implements Print{ + private final int[] awards = new int[10]; + @Override public void printResultStart(){ System.out.println("당첨 통계"); @@ -18,43 +18,61 @@ public void printResultStart(){ } @Override public void printNumberList(List lottoList) { - for (int i = 0; i < lottoList.size(); i++) { - Lotto lotto = lottoList.get(i); + for (Lotto lotto : lottoList) { System.out.println(lotto.getLottoNumber()); } System.out.println(); } @Override - public void printRateOfReturn(Integer purchaseMoney, User user) { - double percent = (double) user.getRefund() / purchaseMoney * 100; + public void printRateOfReturn(Integer purchaseMoney, Integer rewards) { + double percent = (double) rewards / purchaseMoney * 100; double roundedPercent = Math.round(percent * 10.0) / 10.0; System.out.println("총 수익률은 " + roundedPercent+"%입니다."); } @Override - public void printResult(Awards awards, Result result) { + public void printResult(ListlottoCountList){ + awards[3]=5000; + awards[4]=50000; + awards[5]=1500000; + awards[6]=2000000000; + int bonusAwards = 30000000; + + int[] result = new int[10]; + int[] bonusResult = new int[10]; + + for(LottoCount lottoCount : lottoCountList){ + int cnt = lottoCount.getCnt(); + int bonusCnt = lottoCount.getBonusCnt(); + + result[cnt]++; + if(bonusCnt==1){ + bonusResult[cnt]++; + } + } for(int i = RESULT_START.value(); i<= RESULT_END.value(); i++){ String printMessage = ""; printMessage += i+"개 일치 "; // 5000원 DecimalFormat decimalFormat = new DecimalFormat("#,###"); - String formattedValue = "(" + decimalFormat.format(awards.getAwards()[i]) + "원) - "; + String formattedValue = "(" + decimalFormat.format(awards[i]) + "원) - "; printMessage += formattedValue; - printMessage += result.getResult()[i]+"개"; + printMessage += result[i]+"개"; if(i==5){ printMessage += '\n'; printMessage += i+"개 일치, 보너스 볼 일치 "; - formattedValue = "(" + decimalFormat.format(awards.getBonusAwards()) + "원) - "; + formattedValue = "(" + decimalFormat.format(bonusAwards) + "원) - "; printMessage+=formattedValue; - printMessage += result.getBonusResult()+"개"; + printMessage += bonusResult[i]+"개"; } System.out.println(printMessage); } } + @Override public void printPurchaseCount(int cnt){ System.out.println(cnt + "개를 구매했습니다."); diff --git a/src/main/java/lotto/game/print/Print.java b/src/main/java/lotto/game/print/Print.java index e4cdd40e0e..1c3966ce62 100644 --- a/src/main/java/lotto/game/print/Print.java +++ b/src/main/java/lotto/game/print/Print.java @@ -1,9 +1,7 @@ package lotto.game.print; import lotto.game.lotto.Lotto; -import lotto.game.result.Awards; -import lotto.game.result.Result; -import lotto.game.user.User; +import lotto.game.result.LottoCount; import java.util.List; @@ -12,9 +10,9 @@ public interface Print { void printResultStart(); - void printResult(Awards awards, Result result); + void printResult(ListlottoCountList); - void printRateOfReturn(Integer purchaseMoney, User user); + void printRateOfReturn(Integer purchaseMoney, Integer rewards); void printPurchaseCount(int cnt); } diff --git a/src/main/java/lotto/game/result/Awards.java b/src/main/java/lotto/game/result/Awards.java deleted file mode 100644 index 7976010433..0000000000 --- a/src/main/java/lotto/game/result/Awards.java +++ /dev/null @@ -1,33 +0,0 @@ -package lotto.game.result; - -public class Awards { - private static Awards instance; - - // private 생성자로 외부에서의 인스턴스 생성을 막음 - private Awards() { - awards[3]=5000; - awards[4]=50000; - awards[5]=1500000; - awards[6]=2000000000; - - bonusAwards = 30000000; - } - - // 유일한 인스턴스를 반환하는 정적 메서드 - public static Awards getInstance() { - if (instance == null) { - instance = new Awards(); - } - return instance; - } - public int[] awards = new int[10]; - public int bonusAwards; - - public int[] getAwards() { - return awards; - } - - public int getBonusAwards() { - return bonusAwards; - } -} diff --git a/src/main/java/lotto/game/result/Count.java b/src/main/java/lotto/game/result/Count.java deleted file mode 100644 index 87bb0cf4bd..0000000000 --- a/src/main/java/lotto/game/result/Count.java +++ /dev/null @@ -1,37 +0,0 @@ -package lotto.game.result; - -public class Count { - private static Count instance; - - private Count() { - this.cnt = 0; - this.bonusCnt = 0; - } - - public static Count getInstance() { - if (instance == null) { - instance = new Count(); - } - return instance; - } - private int cnt; - private int bonusCnt; - - public void reset(){ - cnt = 0; - bonusCnt = 0; - } - public void countUp(){ - this.cnt++; - } - public void countUpBonus(){ - this.bonusCnt++; - } - - public int getCnt() { - return cnt; - } - public int getBonusCnt() { - return bonusCnt; - } -} diff --git a/src/main/java/lotto/game/result/Result.java b/src/main/java/lotto/game/result/Result.java deleted file mode 100644 index 7660ad78bd..0000000000 --- a/src/main/java/lotto/game/result/Result.java +++ /dev/null @@ -1,35 +0,0 @@ -package lotto.game.result; - -// strike ball count -public class Result { - private static Result instance; - - private Result() { - } - - public static Result getInstance() { - if (instance == null) { - instance = new Result(); - } - return instance; - } - private int[] result = new int[10]; - private int bonusResult; - - public void upCountResult(int idx){ - result[idx]++; - } - public void downCountResult(int idx){ - result[idx]--; - } - public void upCountBonusResult(){ - bonusResult++; - } - - public int[] getResult() { - return result; - } - public int getBonusResult(){ - return bonusResult; - } -} diff --git a/src/main/java/lotto/game/user/User.java b/src/main/java/lotto/game/user/User.java deleted file mode 100644 index b0b7869e4e..0000000000 --- a/src/main/java/lotto/game/user/User.java +++ /dev/null @@ -1,25 +0,0 @@ -package lotto.game.user; - -public class User { - private static User instance; - - private User(){ - refund = 0; - } - - public static User getInstance(){ - if (instance == null) { - instance = new User(); - } - return instance; - } - - private int refund; - - public void updateRefund(int plus){ - refund += plus; - } - public int getRefund(){ - return refund; - } -} From f7f32cd35ff6f5b33cb48d443cbbab3086be789f Mon Sep 17 00:00:00 2001 From: leesewon00 Date: Mon, 10 Jul 2023 21:24:04 +0900 Subject: [PATCH 21/23] =?UTF-8?q?=EB=8C=80=EA=B3=B5=EC=82=AC(1)=20?= =?UTF-8?q?=EC=88=9C=EC=88=98=ED=95=A8=EC=88=98=ED=99=94?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../lotto/game/constant/WinningReward.java | 24 +++++++++++++++++++ .../java/lotto/game/result/LottoCount.java | 20 ++++++++++++++++ 2 files changed, 44 insertions(+) create mode 100644 src/main/java/lotto/game/constant/WinningReward.java create mode 100644 src/main/java/lotto/game/result/LottoCount.java diff --git a/src/main/java/lotto/game/constant/WinningReward.java b/src/main/java/lotto/game/constant/WinningReward.java new file mode 100644 index 0000000000..1378ea4266 --- /dev/null +++ b/src/main/java/lotto/game/constant/WinningReward.java @@ -0,0 +1,24 @@ +package lotto.game.constant; + +public enum WinningReward { + SIX_RIGHT(2000000000), + FIVE_AND_BONUS_RIGHT(30000000), + FIVE_RIGHT(1500000), + FOUR_RIGHT(50000), + THREE_RIGHT(5000); + + public int value() { + return value; + } + + private final int value; + + WinningReward(int value) { + this.value = value; + } + + @Override + public String toString() { + return String.valueOf(value); + } +} diff --git a/src/main/java/lotto/game/result/LottoCount.java b/src/main/java/lotto/game/result/LottoCount.java new file mode 100644 index 0000000000..eff08c4c02 --- /dev/null +++ b/src/main/java/lotto/game/result/LottoCount.java @@ -0,0 +1,20 @@ +package lotto.game.result; + +public class LottoCount { + + private final int cnt; // 몇개 당첨인지 + private final int bonusCnt; + + public LottoCount(int cnt, int bonusCnt){ + this.cnt=cnt; + this.bonusCnt = bonusCnt; + } + + public int getCnt() { + return cnt; + } + + public int getBonusCnt() { + return bonusCnt; + } +} From 1ea0171a575eba1fb540fa80c1e4f0aa2fb2be09 Mon Sep 17 00:00:00 2001 From: leesewon00 Date: Thu, 13 Jul 2023 15:13:40 +0900 Subject: [PATCH 22/23] =?UTF-8?q?=EB=A9=94=EC=86=8C=EB=93=9C=20=EC=97=AD?= =?UTF-8?q?=ED=95=A0=20=EA=B0=84=EC=86=8C=ED=99=94?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/main/java/lotto/game/game/CountMatch.java | 7 +- .../java/lotto/game/game/LottoCountMatch.java | 72 ++++++++----------- src/main/java/lotto/game/game/LottoGame.java | 25 ++++--- 3 files changed, 51 insertions(+), 53 deletions(-) diff --git a/src/main/java/lotto/game/game/CountMatch.java b/src/main/java/lotto/game/game/CountMatch.java index 54055013a6..9d034b3d78 100644 --- a/src/main/java/lotto/game/game/CountMatch.java +++ b/src/main/java/lotto/game/game/CountMatch.java @@ -1,12 +1,11 @@ package lotto.game.game; import lotto.game.lotto.Lotto; -import lotto.game.result.LottoCount; +import lotto.game.lotto.LottoCount; -import java.util.ArrayList; import java.util.List; public interface CountMatch { - List countMatchNumber(ArrayList winningNumber, Integer bonusNumber, ListLottoList); - int countMatchReward(ListlottoCountList); + LottoCount countMatchNumber(List winningNumber, Integer bonusNumber, Lotto lotto); + int countMatchReward(LottoCount lottoCount); } diff --git a/src/main/java/lotto/game/game/LottoCountMatch.java b/src/main/java/lotto/game/game/LottoCountMatch.java index be03bfbe5e..d8bf1b3843 100644 --- a/src/main/java/lotto/game/game/LottoCountMatch.java +++ b/src/main/java/lotto/game/game/LottoCountMatch.java @@ -1,62 +1,52 @@ package lotto.game.game; import lotto.game.lotto.Lotto; -import lotto.game.result.LottoCount; - -import java.util.ArrayList; +import lotto.game.lotto.LottoCount; import java.util.List; import static lotto.game.constant.WinningReward.*; public class LottoCountMatch implements CountMatch { - @Override - public List countMatchNumber(ArrayList winningNumber, Integer bonusNumber, ListlottoList) { - ListlottoCountList = new ArrayList<>(); - for(Lotto lotto : lottoList){ - int cnt = 0; - int bonusCnt = 0; - ListlottoNumber = lotto.getLottoNumber(); - for (Integer num : lottoNumber) { - if (winningNumber.contains(num)) { - cnt++; - } - } - if(lottoNumber.contains(bonusNumber)){ - bonusCnt++; + public LottoCount countMatchNumber(List winningNumber, Integer bonusNumber, Lotto lotto) { + int cnt = 0; + int bonusCnt = 0; + ListlottoNumber = lotto.getLottoNumber(); + for (Integer num : lottoNumber) { + if (winningNumber.contains(num)) { + cnt++; } - LottoCount lottoCount = new LottoCount(cnt,bonusCnt); - lottoCountList.add(lottoCount); } + if(lottoNumber.contains(bonusNumber)){ + bonusCnt++; + } + LottoCount lottoCount = new LottoCount(cnt,bonusCnt); - return lottoCountList; + return lottoCount; // lottoCount 객체로 반환 } - @Override - public int countMatchReward(ListlottoCountList){ + public int countMatchReward(LottoCount lottoCount){ int reward = 0; - for(LottoCount lottoCount : lottoCountList){ - int cnt = lottoCount.getCnt(); - int bonusCnt = lottoCount.getBonusCnt(); + int cnt = lottoCount.getCnt(); + int bonusCnt = lottoCount.getBonusCnt(); - if(cnt==3){ - reward += THREE_RIGHT.value(); - } - if(cnt==4){ - reward += FOUR_RIGHT.value(); - } - if(cnt==5){ - if(bonusCnt==1){ - reward += FIVE_AND_BONUS_RIGHT.value(); - } - if(bonusCnt==0){ - reward += FIVE_RIGHT.value(); - } + if(cnt==3){ + reward += THREE_RIGHT.value(); + } + if(cnt==4){ + reward += FOUR_RIGHT.value(); + } + if(cnt==5){ + if(bonusCnt==1){ + reward += FIVE_AND_BONUS_RIGHT.value(); } - if(cnt==6){ - reward += SIX_RIGHT.value(); + if(bonusCnt==0){ + reward += FIVE_RIGHT.value(); } } - return reward; + if(cnt==6){ + reward += SIX_RIGHT.value(); + } + return reward; // lottoCount 객체 reward 계산 후 return } } diff --git a/src/main/java/lotto/game/game/LottoGame.java b/src/main/java/lotto/game/game/LottoGame.java index dd9f0a5ecc..b35399a9ce 100644 --- a/src/main/java/lotto/game/game/LottoGame.java +++ b/src/main/java/lotto/game/game/LottoGame.java @@ -3,7 +3,7 @@ import lotto.game.input.Input; import lotto.game.lotto.Lotto; import lotto.game.print.Print; -import lotto.game.result.LottoCount; +import lotto.game.lotto.LottoCount; import java.util.ArrayList; import java.util.List; @@ -15,13 +15,11 @@ public class LottoGame implements Game{ private final Input input; private final Print print; private final CountMatch countMatch; - private final ListlottoList; public LottoGame(Input input, Print print, CountMatch countMatch){ this.input = input; this.print = print; this.countMatch = countMatch; - this.lottoList = new ArrayList<>(); } @Override @@ -38,7 +36,7 @@ public void start() { print.printPurchaseCount(cycle); // 3. 수량만큼 로또 번호 생성 - makeRandomLottoNumbers(cycle,lottoList); + List lottoList = makeRandomLottoNumbers(cycle); // 4. 생성된 로또번호 보여주기 print.printNumberList(lottoList); @@ -47,14 +45,25 @@ public void start() { ArrayList winningNumber = input.getWinningNumbers(); Integer bonusNumber = input.getBonusNumber(); - // 6. 결과 집계 - List lottoCountList = countMatch.countMatchNumber(winningNumber, bonusNumber, lottoList); - int reward = countMatch.countMatchReward(lottoCountList); + + // 6. 결과 집계 !!! + ListlottoCountList = new ArrayList<>(); + for(Lotto lotto : lottoList){ + LottoCount lottoCount = countMatch.countMatchNumber(winningNumber, bonusNumber, lotto); + lottoCountList.add(lottoCount); + } + + int totalReward = 0; + for(LottoCount lottoCount : lottoCountList){ + int reward = countMatch.countMatchReward(lottoCount); + totalReward += reward; + } + // 7. 결과 출력 print.printResultStart(); print.printResult(lottoCountList); - print.printRateOfReturn(purchaseMoney,reward); + print.printRateOfReturn(purchaseMoney,totalReward); } From 037344775c8f4b6c0b78be67da827acc13c76358 Mon Sep 17 00:00:00 2001 From: leesewon00 Date: Thu, 13 Jul 2023 15:14:18 +0900 Subject: [PATCH 23/23] =?UTF-8?q?LottoCountMatch=20=ED=85=8C=EC=8A=A4?= =?UTF-8?q?=ED=8A=B8=20=EC=BD=94=EB=93=9C=20=EC=B6=94=EA=B0=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../lotto/game/game/LottoCountMatchTest.java | 66 +++++++++++++++++++ 1 file changed, 66 insertions(+) create mode 100644 src/test/java/lotto/game/game/LottoCountMatchTest.java diff --git a/src/test/java/lotto/game/game/LottoCountMatchTest.java b/src/test/java/lotto/game/game/LottoCountMatchTest.java new file mode 100644 index 0000000000..b6a855cabe --- /dev/null +++ b/src/test/java/lotto/game/game/LottoCountMatchTest.java @@ -0,0 +1,66 @@ +package lotto.game.game; + +import lotto.game.lotto.Lotto; +import lotto.game.lotto.LottoCount; +import org.junit.jupiter.params.ParameterizedTest; +import org.junit.jupiter.params.provider.Arguments; +import org.junit.jupiter.params.provider.MethodSource; + +import java.util.Arrays; +import java.util.List; +import java.util.stream.Stream; + +import static lotto.game.constant.WinningReward.*; +import static org.junit.jupiter.api.Assertions.assertEquals; + +class LottoCountMatchTest { + + LottoCountMatch lottoCountMatch = new LottoCountMatch(); + + @ParameterizedTest(name = "[{index}] winning : {0} bonus : {1} myNum : {2} 테스트") + @MethodSource() + void countMatchNumber(ListwinningNumber, int bonusNumber, Listnumbers, + int expectedCnt, int expectedBonusCnt) { + // + Lotto lotto = new Lotto(numbers); + + // + LottoCount lottoCount = lottoCountMatch.countMatchNumber(winningNumber, bonusNumber, lotto); + + // + assertEquals(expectedCnt,lottoCount.getCnt(),"cnt 값이 틀립니다."); + assertEquals(expectedBonusCnt,lottoCount.getBonusCnt(),"bonusCnt 값이 틀립니다."); + } + static Stream countMatchNumber() { + return Stream.of( + Arguments.of(Arrays.asList(1, 2, 3, 4, 5, 6),7,Arrays.asList(1, 2, 3, 4, 5, 7),5,1), + Arguments.of(Arrays.asList(1, 2, 3, 4, 5, 6),7,Arrays.asList(1, 2, 3, 4, 5, 6),6,0), + Arguments.of(Arrays.asList(1, 2, 3, 4, 5, 6),7,Arrays.asList(4, 5, 6, 7, 8, 9),3,1) + ); + } + + @ParameterizedTest(name = "[{index}] cnt : {0} bonusCnt : {1} expectedResult : {2} 테스트") + @MethodSource() + void countMatchReward(int cnt, int bonusCnt, int expectedResult) { + // + LottoCount lottoCount = new LottoCount(cnt,bonusCnt); + + // + int reward = lottoCountMatch.countMatchReward(lottoCount); + + // + assertEquals(expectedResult,reward); + } + static Stream countMatchReward() { + return Stream.of( + Arguments.of(6,0,SIX_RIGHT.value()), + Arguments.of(5,1,FIVE_AND_BONUS_RIGHT.value()), + Arguments.of(5,0,FIVE_RIGHT.value()), + Arguments.of(4,0,FOUR_RIGHT.value()), + Arguments.of(3,0,THREE_RIGHT.value()), + Arguments.of(2,0,0), + Arguments.of(1,0,0), + Arguments.of(0,0,0) + ); + } +} \ No newline at end of file