diff --git a/src/main/java/com/poolc/javapractice/lotto/Input.java b/src/main/java/com/poolc/javapractice/lotto/Input.java index 47524ad..44f5c54 100644 --- a/src/main/java/com/poolc/javapractice/lotto/Input.java +++ b/src/main/java/com/poolc/javapractice/lotto/Input.java @@ -20,7 +20,15 @@ public int getBuyAmount() { public ArrayList getWinNumbers() { System.out.println("지난 주 당첨 번호를 입력해 주세요."); String win = sc.nextLine(); - return Step1.winNumbers(win); + return Lotto.winNumbers(win); + } + + public int getBonusNumber(){ + System.out.println("보너스 볼을 입력해 주세요."); + int bonusNumber = sc.nextInt(); + sc.nextLine(); + System.out.println(); + return bonusNumber; } } diff --git a/src/main/java/com/poolc/javapractice/lotto/Step1.java b/src/main/java/com/poolc/javapractice/lotto/Lotto.java similarity index 55% rename from src/main/java/com/poolc/javapractice/lotto/Step1.java rename to src/main/java/com/poolc/javapractice/lotto/Lotto.java index 1b14fff..c861f63 100644 --- a/src/main/java/com/poolc/javapractice/lotto/Step1.java +++ b/src/main/java/com/poolc/javapractice/lotto/Lotto.java @@ -4,23 +4,26 @@ import java.text.DecimalFormat; import java.util.*; -public class Step1 { +public class Lotto { public static void main(String[] args) { Input input = new Input(); + Output output = new Output(); int buyAmount = input.getBuyAmount(); int lottoCount = buyAmount / 1000; + output.printLottoCount(lottoCount); ArrayList> lotto = makeLotto(lottoCount); ArrayList winList = input.getWinNumbers(); - ArrayList lottoResults = result(countResults(winList, lotto, lottoCount)); + int bonusNumber = input.getBonusNumber(); + ArrayList countedList = countResults(winList, lotto, lottoCount); + ArrayList lottoResults = result(countedList); - Output output = new Output(); - output.printLottoCount(lottoCount); - output.printWinStatistics(lottoResults); - output.printEarningRate(earningRate(lottoResults, buyAmount)); - } + int count2ndLotto = find2ndLotto(lotto, countedList, lottoResults, bonusNumber); + output.printWinStatistics(lottoResults, count2ndLotto); + output.printEarningRate(earningRate(lottoResults, buyAmount, count2ndLotto)); + } public static ArrayList> makeLotto(int lottoCount) { ArrayList> lotto = new ArrayList<>(lottoCount); @@ -37,6 +40,7 @@ public static ArrayList> makeLotto(int lottoCount) { System.out.println(lotto.get(i).toString()); } + System.out.println(); return lotto; } @@ -52,6 +56,20 @@ public static ArrayList winNumbers(String winNumbers) { return winArrayList; } + public static int find2ndLotto(ArrayList> lotto, ArrayList countedList, ArrayList lottoResults, int bonusNumber) { + int indexFiveMatchedLotto = countedList.indexOf(5); + int count2ndLotto = 0; + + while(indexFiveMatchedLotto != -1){ + BonusMatch bonusMatch = BonusMatch.isMatched(lotto.get(indexFiveMatchedLotto), bonusNumber); + count2ndLotto += bonusMatch.run(lottoResults); + ArrayList tempList = new ArrayList<>(countedList.subList(indexFiveMatchedLotto + 1, countedList.size())); + indexFiveMatchedLotto = tempList.indexOf(5); + } + + return count2ndLotto; + } + public static ArrayList countResults(ArrayList winList, ArrayList> lotto, int lottoCount) { ArrayList countedList = new ArrayList<>(lottoCount); @@ -65,8 +83,8 @@ public static ArrayList countResults(ArrayList winList, ArrayL public static int countMatchedNumbers(ArrayList winList, ArrayList lotto) { return (int) lotto.stream() - .filter(winList::contains) - .count(); + .filter(winList::contains) + .count(); } public static ArrayList result(ArrayList countedList){ @@ -79,12 +97,47 @@ public static ArrayList result(ArrayList countedList){ return lottoResults; } - public static double earningRate(ArrayList lottoResults, int buyAmount) { + public static double earningRate(ArrayList lottoResults, int buyAmount, int count2ndLotto) { double totalMoney = 5000 * lottoResults.get(0) + 50000 * lottoResults.get(1) - + 1500000 * lottoResults.get(2) + 2000000000 * lottoResults.get(3); + + 1500000 * lottoResults.get(2) + 30000000 * count2ndLotto+ 2000000000 * lottoResults.get(3); DecimalFormat df = new DecimalFormat("#.##"); df.setRoundingMode(RoundingMode.DOWN); return Double.parseDouble(df.format(((totalMoney - buyAmount) / buyAmount * 100))); } + + enum BonusMatch { + NOTMATCH(false){ + @Override + int run(ArrayList lottoResults) { + return 0; + } + }, + MATCH(true){ + @Override + int run(ArrayList lottoResults) { + lottoResults.set(2, lottoResults.get(2) - 1); + return 1; + } + }; + + private boolean matchedBonus; + + BonusMatch(boolean matchedBonus){ + this.matchedBonus = matchedBonus; + } + + public static BonusMatch isMatched(ArrayList lotto, int bonusNumber) { + if(lotto.contains(bonusNumber)){ + return BonusMatch.MATCH; + } + return BonusMatch.NOTMATCH; + } + + abstract int run(ArrayList countedList); + + + + } + } diff --git a/src/main/java/com/poolc/javapractice/lotto/Output.java b/src/main/java/com/poolc/javapractice/lotto/Output.java index e38eb52..8fcff78 100644 --- a/src/main/java/com/poolc/javapractice/lotto/Output.java +++ b/src/main/java/com/poolc/javapractice/lotto/Output.java @@ -7,17 +7,18 @@ public void printLottoCount(int lottoCount) { System.out.println(lottoCount + "개를 구매했습니다."); } - public void printWinStatistics(ArrayList resultList) { + public void printWinStatistics(ArrayList lottoResults, int count2ndLotto) { System.out.println("당첨 통계"); System.out.println("---------"); - System.out.println("3개 일치 (5000원) - " + resultList.get(0) + "개"); - System.out.println("4개 일치 (50000원) - " + resultList.get(1) + "개"); - System.out.println("5개 일치 (1500000원) - " + resultList.get(2) + "개"); - System.out.println("6개 일치 (2000000000원) - " + resultList.get(3) + "개"); + System.out.println("3개 일치 (5000원) - " + lottoResults.get(0) + "개"); + System.out.println("4개 일치 (50000원) - " + lottoResults.get(1) + "개"); + System.out.println("5개 일치 (1500000원) - " + lottoResults.get(2) + "개"); + System.out.println("5개 일치, 보너스 볼 일치(30000000원) - " + count2ndLotto +"개"); + System.out.println("6개 일치 (2000000000원) - " + lottoResults.get(3) + "개"); } public void printEarningRate(double earningRate) { - System.out.printf("총 수익률은 %f%%입니다.", earningRate); + System.out.printf("총 수익률은 %.2f%%입니다.", earningRate); } } diff --git a/src/test/java/com/poolc/javapractice/lotto/Step1Test.java b/src/test/java/com/poolc/javapractice/lotto/LottoTest.java similarity index 86% rename from src/test/java/com/poolc/javapractice/lotto/Step1Test.java rename to src/test/java/com/poolc/javapractice/lotto/LottoTest.java index 42e7218..d5c781a 100644 --- a/src/test/java/com/poolc/javapractice/lotto/Step1Test.java +++ b/src/test/java/com/poolc/javapractice/lotto/LottoTest.java @@ -3,17 +3,15 @@ import org.junit.jupiter.api.Assertions; import org.junit.jupiter.api.Test; -import java.lang.reflect.Array; import java.util.*; -import java.text.DecimalFormat; import static org.junit.jupiter.api.Assertions.assertArrayEquals; -public class Step1Test { +public class LottoTest { @Test public void makeLottoTest(){ - Step1 step1 = new Step1(); + Lotto step1 = new Lotto(); ArrayList> lotto = step1.makeLotto(100); for (int i = 0; i < 10; i++){ for (int j = 0; j < lotto.get(i).size(); j++){ @@ -24,7 +22,7 @@ public void makeLottoTest(){ @Test public void winNumbersTest(){ - Step1 step1 = new Step1(); + Lotto step1 = new Lotto(); ArrayList actualList = step1.winNumbers("1, 2,3, 4, 5,6"); ArrayList expectedList = new ArrayList<>(); for (int i = 1; i < 7; i++){ @@ -35,7 +33,7 @@ public void winNumbersTest(){ @Test public void countResultsTest(){ - Step1 step1 = new Step1(); + Lotto step1 = new Lotto(); ArrayList winListTest = new ArrayList<>(Arrays.asList(1, 2, 3, 4, 5, 6)); ArrayList> lottoTest = new ArrayList<>(2); lottoTest.add(new ArrayList<>(Arrays.asList(3, 4, 5, 6, 7, 8))); @@ -50,7 +48,7 @@ public void countResultsTest(){ @Test public void resultTest(){ - Step1 step1 = new Step1(); + Lotto step1 = new Lotto(); ArrayList lottoResultsTest = new ArrayList<>(Arrays.asList(1, 2, 3, 3, 3, 4, 4)); ArrayList actual = step1.result(lottoResultsTest); @@ -65,10 +63,10 @@ public void resultTest(){ @Test public void earningRateTest(){ - Step1 step1 = new Step1(); + Lotto step1 = new Lotto(); ArrayList lottoResultsTest = new ArrayList<>(); lottoResultsTest.add(3); - double actual = step1.earningRate(lottoResultsTest,14000); + double actual = step1.earningRate(lottoResultsTest, 2,14000); double expected = -64.28;