From 805fa94736541f889c69230c34fd18728a88b6bb Mon Sep 17 00:00:00 2001 From: So-JunHyeok Date: Tue, 16 May 2023 02:08:38 +0900 Subject: [PATCH 1/3] =?UTF-8?q?step2=20=EB=A1=9C=EB=98=90=EA=B5=AC?= =?UTF-8?q?=EB=A7=A4=EA=B8=88=EC=95=A1?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- README.md | 9 +++++++-- src/main/java/lotto/Main.java | 11 +++++++++++ src/main/java/lotto/domain/Lotto.java | 11 +++++++++++ src/main/java/lotto/view/InputView.java | 13 +++++++++++++ src/test/java/lotto/LottoTest.java | 17 +++++++++++++++++ .../stringCalculator/domain/CalculatorTest.java | 1 + 6 files changed, 60 insertions(+), 2 deletions(-) create mode 100644 src/main/java/lotto/Main.java create mode 100644 src/main/java/lotto/domain/Lotto.java create mode 100644 src/main/java/lotto/view/InputView.java create mode 100644 src/test/java/lotto/LottoTest.java diff --git a/README.md b/README.md index 886f9511b11..584e612ca6f 100644 --- a/README.md +++ b/README.md @@ -22,9 +22,14 @@ * method가 한 가지 일만 하도록 최대한 작게 만들어라. * else를 사용하지 마라. -## 기능정의 +## 기능정의(문자열 계산기) * 문자열 입력 기능 * 공백으로 연산 대상 구분 * * 사칙연산 실행 -* 계산식/결과 출력 \ No newline at end of file +* 계산식/결과 출력 + +## 기능정의(로또) +* 구매 금액 + - 금액 입력 + - 숫자 유효성 체크 \ No newline at end of file diff --git a/src/main/java/lotto/Main.java b/src/main/java/lotto/Main.java new file mode 100644 index 00000000000..e69b0ca8bac --- /dev/null +++ b/src/main/java/lotto/Main.java @@ -0,0 +1,11 @@ +package lotto; + +import lotto.view.InputView; + +public class Main { + static InputView inputView = new InputView(); + public static void main(String[] args) { + inputView.inputCost(); + } + +} diff --git a/src/main/java/lotto/domain/Lotto.java b/src/main/java/lotto/domain/Lotto.java new file mode 100644 index 00000000000..fa86b42baf1 --- /dev/null +++ b/src/main/java/lotto/domain/Lotto.java @@ -0,0 +1,11 @@ +package lotto.domain; + +public class Lotto { + + static final String regularExpression = "^[0-9]+$"; + + public Boolean integerValidation(String amount){ + return amount.matches(regularExpression); + } + +} diff --git a/src/main/java/lotto/view/InputView.java b/src/main/java/lotto/view/InputView.java new file mode 100644 index 00000000000..0d74af20fd0 --- /dev/null +++ b/src/main/java/lotto/view/InputView.java @@ -0,0 +1,13 @@ +package lotto.view; + +import java.util.Scanner; + +public class InputView { + + public String inputCost(){ + System.out.println("구입금액을 입력해주세요"); + Scanner scanner = new Scanner(System.in); + return scanner.nextLine(); + } + +} diff --git a/src/test/java/lotto/LottoTest.java b/src/test/java/lotto/LottoTest.java new file mode 100644 index 00000000000..167fb8341e1 --- /dev/null +++ b/src/test/java/lotto/LottoTest.java @@ -0,0 +1,17 @@ +package lotto; + +import lotto.domain.Lotto; +import org.junit.jupiter.api.DisplayName; +import org.junit.jupiter.api.Test; +import static org.assertj.core.api.AssertionsForClassTypes.assertThat; +public class LottoTest { + + @Test + @DisplayName("정수입력 테스트") + public void test1(){ + Lotto lotto = new Lotto(); + assertThat(lotto.integerValidation("140000")).isTrue(); + assertThat(lotto.integerValidation("14,0000")).isFalse(); + } + +} diff --git a/src/test/java/stringCalculator/domain/CalculatorTest.java b/src/test/java/stringCalculator/domain/CalculatorTest.java index 2bebc794a6a..09ebd75ac4a 100644 --- a/src/test/java/stringCalculator/domain/CalculatorTest.java +++ b/src/test/java/stringCalculator/domain/CalculatorTest.java @@ -10,6 +10,7 @@ import java.util.stream.Stream; import static org.assertj.core.api.AssertionsForClassTypes.assertThat; + public class CalculatorTest { static Stream arithmetic(){ From c86be21113f8ece2528d39c9fea9b15764c0a167 Mon Sep 17 00:00:00 2001 From: So-JunHyeok Date: Tue, 16 May 2023 02:34:28 +0900 Subject: [PATCH 2/3] =?UTF-8?q?=EB=A1=9C=EB=98=90=20=EA=B5=AC=EB=A7=A4=20?= =?UTF-8?q?=EA=B0=9C=EC=88=98=20=EA=B5=AC=ED=95=98=EA=B8=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- README.md | 4 +++- src/main/java/lotto/Main.java | 5 ++++- src/main/java/lotto/domain/Lotto.java | 9 +++++++-- src/test/java/lotto/{ => domain}/LottoTest.java | 9 ++++++++- 4 files changed, 22 insertions(+), 5 deletions(-) rename src/test/java/lotto/{ => domain}/LottoTest.java (68%) diff --git a/README.md b/README.md index 584e612ca6f..9c7732661e9 100644 --- a/README.md +++ b/README.md @@ -32,4 +32,6 @@ ## 기능정의(로또) * 구매 금액 - 금액 입력 - - 숫자 유효성 체크 \ No newline at end of file + - 숫자 유효성 체크 +* 로또 구매 개수 구하기 +* 로또번호 만들기 \ No newline at end of file diff --git a/src/main/java/lotto/Main.java b/src/main/java/lotto/Main.java index e69b0ca8bac..d069eca4f9a 100644 --- a/src/main/java/lotto/Main.java +++ b/src/main/java/lotto/Main.java @@ -1,11 +1,14 @@ package lotto; +import lotto.domain.Lotto; import lotto.view.InputView; public class Main { static InputView inputView = new InputView(); + static Lotto lotto = new Lotto(); public static void main(String[] args) { - inputView.inputCost(); + int lottoQuantity = lotto.lottoQuantity(inputView.inputCost()); + } } diff --git a/src/main/java/lotto/domain/Lotto.java b/src/main/java/lotto/domain/Lotto.java index fa86b42baf1..d3f823595a5 100644 --- a/src/main/java/lotto/domain/Lotto.java +++ b/src/main/java/lotto/domain/Lotto.java @@ -3,9 +3,14 @@ public class Lotto { static final String regularExpression = "^[0-9]+$"; - - public Boolean integerValidation(String amount){ + Boolean integerValidation(String amount){ return amount.matches(regularExpression); } + public int lottoQuantity(String amount) { + if (integerValidation(amount)) { + return Integer.valueOf(amount) / 1000; + } + return 0; + } } diff --git a/src/test/java/lotto/LottoTest.java b/src/test/java/lotto/domain/LottoTest.java similarity index 68% rename from src/test/java/lotto/LottoTest.java rename to src/test/java/lotto/domain/LottoTest.java index 167fb8341e1..ff9a42f4271 100644 --- a/src/test/java/lotto/LottoTest.java +++ b/src/test/java/lotto/domain/LottoTest.java @@ -1,4 +1,4 @@ -package lotto; +package lotto.domain; import lotto.domain.Lotto; import org.junit.jupiter.api.DisplayName; @@ -14,4 +14,11 @@ public void test1(){ assertThat(lotto.integerValidation("14,0000")).isFalse(); } + @Test + @DisplayName("로또 구매 수량") + public void test2(){ + Lotto lotto = new Lotto(); + assertThat(lotto.lottoQuantity("14000")).isEqualTo(14); + + } } From 4a0b061bfa99b974a84bdea13032d190dee39168 Mon Sep 17 00:00:00 2001 From: So-JunHyeok Date: Sat, 20 May 2023 22:00:13 +0900 Subject: [PATCH 3/3] =?UTF-8?q?=EB=A1=9C=EB=98=90=20=EB=8B=B9=EC=B2=A8?= =?UTF-8?q?=ED=86=B5=EA=B3=84?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- README.md | 4 +- src/main/java/lotto/Main.java | 12 ++- src/main/java/lotto/domain/Lotto.java | 39 +++++++++ .../java/lotto/domain/LottoStatistics.java | 82 +++++++++++++++++++ src/main/java/lotto/domain/Rank.java | 38 +++++++++ src/main/java/lotto/view/InputView.java | 6 ++ src/main/java/lotto/view/ResultView.java | 45 ++++++++++ .../lotto/domain/LottoStatisticsTest.java | 63 ++++++++++++++ src/test/java/lotto/domain/LottoTest.java | 15 ++++ 9 files changed, 302 insertions(+), 2 deletions(-) create mode 100644 src/main/java/lotto/domain/LottoStatistics.java create mode 100644 src/main/java/lotto/domain/Rank.java create mode 100644 src/main/java/lotto/view/ResultView.java create mode 100644 src/test/java/lotto/domain/LottoStatisticsTest.java diff --git a/README.md b/README.md index 9c7732661e9..29c744fbf06 100644 --- a/README.md +++ b/README.md @@ -34,4 +34,6 @@ - 금액 입력 - 숫자 유효성 체크 * 로또 구매 개수 구하기 -* 로또번호 만들기 \ No newline at end of file +* 로또번호 만들기 +* 당첨번호 입력 +* 당첨통계 \ No newline at end of file diff --git a/src/main/java/lotto/Main.java b/src/main/java/lotto/Main.java index d069eca4f9a..6a95d1b4429 100644 --- a/src/main/java/lotto/Main.java +++ b/src/main/java/lotto/Main.java @@ -1,14 +1,24 @@ package lotto; import lotto.domain.Lotto; +import lotto.domain.LottoStatistics; import lotto.view.InputView; +import lotto.view.ResultView; + +import java.util.List; public class Main { static InputView inputView = new InputView(); + static ResultView resultView = new ResultView(); static Lotto lotto = new Lotto(); + public static void main(String[] args) { int lottoQuantity = lotto.lottoQuantity(inputView.inputCost()); + resultView.lottoCountPrint(lottoQuantity); + List> purchasedLottery = lotto.getPurchasedLottery(lottoQuantity); + resultView.printLotto(purchasedLottery); + LottoStatistics lottoStatistics = new LottoStatistics(inputView.inputWinningNumber()); + resultView.winningResult(lottoStatistics.winningRank(purchasedLottery)); } - } diff --git a/src/main/java/lotto/domain/Lotto.java b/src/main/java/lotto/domain/Lotto.java index d3f823595a5..bc5cc15e475 100644 --- a/src/main/java/lotto/domain/Lotto.java +++ b/src/main/java/lotto/domain/Lotto.java @@ -1,8 +1,23 @@ package lotto.domain; +import java.util.ArrayList; +import java.util.Collection; +import java.util.Collections; +import java.util.List; + public class Lotto { static final String regularExpression = "^[0-9]+$"; + static final List lottoNumber = new ArrayList<>(); + + static { + for (int i = 0; i < 45; i++) { + lottoNumber.add(i+1); + } + } + + List> purchasedLottery = new ArrayList>(); + Boolean integerValidation(String amount){ return amount.matches(regularExpression); } @@ -13,4 +28,28 @@ public int lottoQuantity(String amount) { } return 0; } + + List outputLottoNumber(){ + List result = new ArrayList<>(); + Collections.shuffle(lottoNumber); + + for (int i = 0; i < 6; i++) { + result.add(lottoNumber.get(i)); + } + return result; + } + + void buyLotto(int lottoQuantity){ + for (int i = 0; i < lottoQuantity; i++) { + List lotto = outputLottoNumber(); + Collections.sort(lotto); + purchasedLottery.add(lotto); + } + } + public List> getPurchasedLottery(int lottoQuantity){ + buyLotto(lottoQuantity); + return purchasedLottery; + } + + } diff --git a/src/main/java/lotto/domain/LottoStatistics.java b/src/main/java/lotto/domain/LottoStatistics.java new file mode 100644 index 00000000000..ec514dfde04 --- /dev/null +++ b/src/main/java/lotto/domain/LottoStatistics.java @@ -0,0 +1,82 @@ +package lotto.domain; + +import stringCalculator.domain.Arithmetic; + +import java.util.ArrayList; +import java.util.HashMap; +import java.util.List; +import java.util.Map; + +public class LottoStatistics { + + List winningNumber = new ArrayList<>(); + + static Map rankCount = new HashMap<>(); + + static { + rankCount.put(6, Rank.FIRST); + rankCount.put(5, Rank.SECOND); + rankCount.put(4, Rank.THIRD); + rankCount.put(3, Rank.FOURTH); + } + + public LottoStatistics(){} + + public LottoStatistics(String winningNumber){ + saveWinningNumber(winningNumber); + } + private void saveWinningNumber(String winningNumber){ + for (String number : winningNumberArray(winningNumber)){ + this.winningNumber.add(Integer.valueOf(number)); + } + } + private String[] winningNumberArray(String winningNumber){ + if(!validationWinningNumber(winningNumber)){ + new Exception("입력값이 유효하지 않습니다."); + }; + return winningNumber.split(","); + } + private Boolean validationWinningNumber(String winningNumber){ + return winningNumber.split(",").length == 6; + } + + public int sameNumberQuantity(List lottoNumber){ + int count = 0; + for (int number : lottoNumber){ + count = count + sameNumberIncrease(number); + } + return count; + } + + private int sameNumberIncrease(int number){ + if(this.winningNumber.contains(number)){ + return 1; + }; + return 0; + } + + public Float winningRank(List>lottoNumber){ + addRankQuantity(lottoNumber); + return Float.valueOf(winningAmount()/(lottoNumber.size()*1000)); + } + + void addRankQuantity(List> lottoNumber) { + for (int i = 0; i < lottoNumber.size(); i++) { + checkWinningRank(lottoNumber, i); + } + } + int winningAmount(){ + int amount = 0; + for (Rank rank : Rank.values()) { + amount = amount + rank.getTotelMoney(); + } + return amount; + } + private void checkWinningRank(List> lottoNumber, int i) { + if(sameNumberQuantity(lottoNumber.get(i)) >= 3){ + rankCount.get(sameNumberQuantity(lottoNumber.get(i))).addCount(); + } + } + + +} diff --git a/src/main/java/lotto/domain/Rank.java b/src/main/java/lotto/domain/Rank.java new file mode 100644 index 00000000000..77c6aac49a8 --- /dev/null +++ b/src/main/java/lotto/domain/Rank.java @@ -0,0 +1,38 @@ +package lotto.domain; + +public enum Rank { + + FIRST(6, 2000000000, 0), + SECOND(5, 1500000, 0), + THIRD(4, 5000, 0), + FOURTH(3, 5000, 0), + MISS(0, 0, 0); + + private int match; + private int money; + private int count; + + private Rank(int match, int money, int count){ + this.match = match; + this.money = money; + this.count = count; + } + + public void addCount(){ + count++; + } + + public int getCount(){ + return count; + } + + public int getMoney(){ + return money; + } + + public int getTotelMoney(){ + return money * count; + } + + +} diff --git a/src/main/java/lotto/view/InputView.java b/src/main/java/lotto/view/InputView.java index 0d74af20fd0..5fbf2b64e68 100644 --- a/src/main/java/lotto/view/InputView.java +++ b/src/main/java/lotto/view/InputView.java @@ -10,4 +10,10 @@ public String inputCost(){ return scanner.nextLine(); } + public String inputWinningNumber(){ + System.out.println("지난 주 당첨 번호를 입력해 주세요."); + Scanner scanner = new Scanner(System.in); + return scanner.nextLine(); + } + } diff --git a/src/main/java/lotto/view/ResultView.java b/src/main/java/lotto/view/ResultView.java new file mode 100644 index 00000000000..814fe67e440 --- /dev/null +++ b/src/main/java/lotto/view/ResultView.java @@ -0,0 +1,45 @@ +package lotto.view; + +import lotto.domain.Rank; + +import java.util.List; + +public class ResultView { + public void lottoCountPrint(int lottoQuantity){ + System.out.println(lottoQuantity+"개를 구매했습니다."); + } + + public void printLotto(List> lotto){ + + for (List lottoNumber : lotto){ + System.out.print("["); + printLottoNumber(lottoNumber); + System.out.println("]"); + } + } + + public void printLottoNumber(List lottoNumber){ + for (int i = 0; i < lottoNumber.size(); i++) { + System.out.print(addComma(i)+lottoNumber.get(i)); + } + } + + String addComma(int index){ + if(index != 0){ + return ","; + } + return ""; + } + + public void winningResult(Float revenue){ + System.out.println("6개일치"+"("+Rank.FIRST.getMoney()+")- "+Rank.FIRST.getCount()); + System.out.println("5개일치"+"("+Rank.SECOND.getMoney()+")- "+Rank.SECOND.getCount()); + System.out.println("4개일치"+"("+Rank.THIRD.getMoney()+")- "+Rank.THIRD.getCount()); + System.out.println("3개일치"+"("+Rank.FOURTH.getMoney()+")- "+Rank.FOURTH.getCount()); + System.out.println(""); + String result = String.format("%.2f", revenue); + + System.out.println("총 수익률은 "+result+"입니다"); + + } +} diff --git a/src/test/java/lotto/domain/LottoStatisticsTest.java b/src/test/java/lotto/domain/LottoStatisticsTest.java new file mode 100644 index 00000000000..596e87142cd --- /dev/null +++ b/src/test/java/lotto/domain/LottoStatisticsTest.java @@ -0,0 +1,63 @@ +package lotto.domain; + +import org.junit.jupiter.api.BeforeAll; +import org.junit.jupiter.api.BeforeEach; +import org.junit.jupiter.api.DisplayName; +import org.junit.jupiter.api.Test; + +import java.beans.Transient; +import java.util.ArrayList; +import java.util.List; + +import static org.assertj.core.api.AssertionsForClassTypes.assertThat; +public class LottoStatisticsTest { + + List> lottoNumber = new ArrayList<>(); + @BeforeEach + private void lotto(){ + List number = new ArrayList<>(); + for (int i = 1; i < 7; i++) { + number.add(i); + } + lottoNumber.add(number); + } + + + @Test + @DisplayName("로또 당첨번호 포함 여부") + public void test1(){ + + List lottoNumber = new ArrayList<>(); + lottoNumber.add(1); + lottoNumber.add(2); + + LottoStatistics lottoStatistics = new LottoStatistics("1,2,3,4,5,6"); + assertThat(lottoStatistics.sameNumberQuantity(lottoNumber)).isEqualTo(2); + } + + @Test + @DisplayName("일치한 로또 COUNT") + public void test2(){ + Rank.FIRST.addCount(); + assertThat(Rank.FIRST.getCount()).isEqualTo(1); + Rank.FIRST.addCount(); + assertThat(Rank.FIRST.getCount()).isEqualTo(2); + } + + @Test + @DisplayName("당첨 금액") + public void test3(){ + LottoStatistics lottoStatistics = new LottoStatistics("1,2,3,4,5,7"); + lottoStatistics.winningRank(lottoNumber); + assertThat(lottoStatistics.winningAmount()).isEqualTo(1500000); + + } + + @Test + @DisplayName("로또 수익률") + public void test4(){ + LottoStatistics lottoStatistics = new LottoStatistics("1,2,3,7,8,9"); + assertThat(lottoStatistics.winningRank(lottoNumber)).isEqualTo(5); + } + +} diff --git a/src/test/java/lotto/domain/LottoTest.java b/src/test/java/lotto/domain/LottoTest.java index ff9a42f4271..7d15c185ba4 100644 --- a/src/test/java/lotto/domain/LottoTest.java +++ b/src/test/java/lotto/domain/LottoTest.java @@ -19,6 +19,21 @@ public void test1(){ public void test2(){ Lotto lotto = new Lotto(); assertThat(lotto.lottoQuantity("14000")).isEqualTo(14); + } + @Test + @DisplayName("로또 번호 뽑기") + public void test3(){ + Lotto lotto = new Lotto(); + assertThat(lotto.outputLottoNumber().size()).isEqualTo(6); } + + @Test + @DisplayName("총 구매 로또 수") + public void test4(){ + Lotto lotto = new Lotto(); + assertThat(lotto.getPurchasedLottery(2).size()).isEqualTo(2); + + } + }