Skip to content

Commit 26a1233

Browse files
committed
feat: 4단계 로또 수동
1 parent cb97e23 commit 26a1233

18 files changed

+393
-67
lines changed
+2-2
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,8 @@
1-
import ui.AutoResultView;
1+
import ui.ManualResultView;
22
import ui.common.ResultView;
33

44
public class JavaLottoApplication {
55
public static void main(String... args) {
6-
ResultView.lottoResult(new AutoResultView());
6+
ResultView.lottoResult(new ManualResultView());
77
}
88
}

src/main/java/constant/Rank.java

+17
Original file line numberDiff line numberDiff line change
@@ -14,6 +14,23 @@ public enum Rank {
1414
this.reward = reward;
1515
}
1616

17+
public static Rank findRank(int countOfMatchedNumber) {
18+
switch (countOfMatchedNumber) {
19+
case 6:
20+
return Rank.FIRST;
21+
case 5:
22+
return Rank.SECOND;
23+
case 7:
24+
return Rank.SECOND_WITH_BONUS;
25+
case 4:
26+
return Rank.THIRD;
27+
case 3:
28+
return Rank.FOURTH;
29+
default:
30+
return Rank.UNKNOWN;
31+
}
32+
}
33+
1734
public long findReward() {
1835
return reward;
1936
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,34 @@
1+
package domain.lottery;
2+
3+
import java.util.Objects;
4+
5+
public class LotteryNumber {
6+
private final int MIN_NUMBER = 1;
7+
private final int MAX_NUMBER = 45;
8+
private final int number;
9+
10+
private LotteryNumber(int number) {
11+
this.number = number;
12+
13+
if (number < MIN_NUMBER || number > MAX_NUMBER) {
14+
throw new IllegalArgumentException("유효하지 않은 번호입니다.");
15+
}
16+
}
17+
18+
public static LotteryNumber of(int number) {
19+
return new LotteryNumber(number);
20+
}
21+
22+
@Override
23+
public boolean equals(Object o) {
24+
if (this == o) return true;
25+
if (o == null || getClass() != o.getClass()) return false;
26+
LotteryNumber that = (LotteryNumber) o;
27+
return number == that.number;
28+
}
29+
30+
@Override
31+
public int hashCode() {
32+
return Objects.hash(number);
33+
}
34+
}
Original file line numberDiff line numberDiff line change
@@ -1,15 +1,31 @@
11
package domain.lottery;
22

3+
import java.util.HashSet;
34
import java.util.List;
5+
import java.util.Optional;
6+
import java.util.Set;
47

58
public class LotteryTicket {
6-
private final List<Integer> ticketNumbers;
9+
private final List<LotteryNumber> ticketNumbers;
10+
private final Set<LotteryNumber> SIEVE = new HashSet<>();
711

8-
public LotteryTicket(List<Integer> ticketNumbers) {
12+
private LotteryTicket(List<LotteryNumber> ticketNumbers) {
913
this.ticketNumbers = ticketNumbers;
14+
15+
SIEVE.addAll(ticketNumbers);
16+
17+
if (SIEVE.size() != ticketNumbers.size()) throw new IllegalArgumentException("복권번호가 중복됩니다.");
18+
}
19+
20+
public static LotteryTicket of(List<LotteryNumber> ticketNumbers) {
21+
return new LotteryTicket(Optional.ofNullable(ticketNumbers).get());
1022
}
1123

12-
public List<Integer> getTicketNumbers() {
24+
public List<LotteryNumber> getTicketNumbers() {
1325
return ticketNumbers;
1426
}
27+
28+
public void add(LotteryNumber lotteryNumber) {
29+
ticketNumbers.add(lotteryNumber);
30+
}
1531
}

src/main/java/domain/lottery/LotteryTickets.java

+12-1
Original file line numberDiff line numberDiff line change
@@ -15,14 +15,25 @@ public LotteryTickets(long amount) {
1515
int countOfLotteryTickets = (int) Calculator.divide(amount, DEFAULT_LOTTERY_TICKET_PRICE);
1616
lotteryTickets = new ArrayList<>(countOfLotteryTickets);
1717
for (long count = 1; count <= countOfLotteryTickets; count++) {
18-
lotteryTickets.add(new LotteryTicket(RandomNumberGenerator.generateNumbers()));
18+
lotteryTickets.add(LotteryTicket.of(RandomNumberGenerator.generateNumbers()));
19+
}
20+
}
21+
22+
public LotteryTickets(int numberOfLotteryTickets) {
23+
lotteryTickets = new ArrayList<>(numberOfLotteryTickets);
24+
for (long count = 1; count <= numberOfLotteryTickets; count++) {
25+
lotteryTickets.add(LotteryTicket.of(RandomNumberGenerator.generateNumbers()));
1926
}
2027
}
2128

2229
public LotteryTickets(List<LotteryTicket> lotteryTickets) {
2330
this.lotteryTickets = lotteryTickets;
2431
}
2532

33+
public void add(LotteryTicket lotteryTicket) {
34+
lotteryTickets.add(lotteryTicket);
35+
}
36+
2637
public List<LotteryTicket> getLotteryTickets() {
2738
return lotteryTickets;
2839
}

src/main/java/domain/lottery/RewardLotteryTickets.java

+1-15
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,6 @@
55
import java.util.ArrayList;
66
import java.util.List;
77

8-
import static constant.LotteryRules.*;
98

109
public class RewardLotteryTickets {
1110
private final List<Rank> ranks;
@@ -22,20 +21,7 @@ public RewardLotteryTickets(LotteryTickets lotteryTickets, WinnerLotteryTicket w
2221
}
2322

2423
public long countOfRank(int countOfMatchedNumber) {
25-
switch (countOfMatchedNumber) {
26-
case NUMBER_OF_MATCHED_TICKET_NUMBER_FOR_FOURTH_PLACE:
27-
return ranks.stream().filter(rank -> rank == Rank.FOURTH).count();
28-
case NUMBER_OF_MATCHED_TICKET_NUMBER_FOR_THIRD_PLACE:
29-
return ranks.stream().filter(rank -> rank == Rank.THIRD).count();
30-
case NUMBER_OF_MATCHED_TICKET_NUMBER_FOR_SECOND_PLACE:
31-
return ranks.stream().filter(rank -> rank == Rank.SECOND).count();
32-
case NUMBER_OF_MATCHED_TICKET_NUMBER_FOR_SECOND_WITH_BONUS_PLACE:
33-
return ranks.stream().filter(rank -> rank == Rank.SECOND_WITH_BONUS).count();
34-
case NUMBER_OF_MATCHED_TICKET_NUMBER_FOR_FIRST_PLACE:
35-
return ranks.stream().filter(rank -> rank == Rank.FIRST).count();
36-
default:
37-
return ranks.stream().filter(rank -> rank == Rank.UNKNOWN).count();
38-
}
24+
return ranks.stream().filter(rank -> rank == Rank.findRank(countOfMatchedNumber)).count();
3925
}
4026

4127
public long sumAllRewards() {

src/main/java/domain/lottery/WinnerLotteryTicket.java

+9-4
Original file line numberDiff line numberDiff line change
@@ -6,20 +6,25 @@
66

77
public class WinnerLotteryTicket {
88
private final LotteryTicket winnerLotteryTicket;
9-
private final int bonusTicketNumber;
9+
private final LotteryNumber bonusTicketNumber;
1010

11-
public WinnerLotteryTicket(LotteryTicket winnerTicket, int bonusTicketNumber) {
11+
public WinnerLotteryTicket(LotteryTicket winnerTicket, LotteryNumber bonusTicketNumber) {
1212
this.winnerLotteryTicket = winnerTicket;
1313
this.bonusTicketNumber = bonusTicketNumber;
14+
15+
if (winnerLotteryTicket.getTicketNumbers().contains(bonusTicketNumber)) {
16+
throw new IllegalArgumentException("당첨번호와 보너스 번호가 중복됩니다.");
17+
}
1418
}
1519

1620
public boolean hasBonusTicketNumber(LotteryTicket lotteryTicket) {
17-
return lotteryTicket.getTicketNumbers().stream().anyMatch(number -> number == bonusTicketNumber);
21+
return lotteryTicket.getTicketNumbers().stream().anyMatch(lotteryNumber -> lotteryNumber.equals(bonusTicketNumber));
1822
}
1923

2024
public Rank findRank(LotteryTicket lotteryTicket) {
2125
int countOfMatchedNumber = (int) lotteryTicket.getTicketNumbers().stream().filter(winnerLotteryTicket.getTicketNumbers()::contains).count();
22-
if (lotteryTicket.getTicketNumbers().contains(bonusTicketNumber) && countOfMatchedNumber < NUMBER_OF_MATCHED_TICKET_NUMBER_FOR_FIRST_PLACE) countOfMatchedNumber += 2;
26+
if (lotteryTicket.getTicketNumbers().contains(bonusTicketNumber) && countOfMatchedNumber == NUMBER_OF_MATCHED_TICKET_NUMBER_FOR_SECOND_PLACE)
27+
countOfMatchedNumber += 2;
2328
switch (countOfMatchedNumber) {
2429
case NUMBER_OF_MATCHED_TICKET_NUMBER_FOR_FOURTH_PLACE:
2530
return Rank.FOURTH;

src/main/java/ui/AutoResultView.java

+2-5
Original file line numberDiff line numberDiff line change
@@ -1,12 +1,9 @@
11
package ui;
22

3-
import domain.lottery.RewardLotteryTickets;
3+
import domain.lottery.*;
44
import service.LotteryService;
55
import ui.common.InputView;
66
import ui.common.Result;
7-
import domain.lottery.LotteryTicket;
8-
import domain.lottery.LotteryTickets;
9-
import domain.lottery.WinnerLotteryTicket;
107
import util.Calculator;
118
import util.Converter;
129

@@ -45,7 +42,7 @@ public void printTicketNumbers() {
4542

4643
System.out.println("보너스 볼을 입력해 주세요.");
4744
int bonusTicketNumber = InputView.inputInteger();
48-
winnerLotteryTicket = new WinnerLotteryTicket(winnerTicket, bonusTicketNumber);
45+
winnerLotteryTicket = new WinnerLotteryTicket(winnerTicket, LotteryNumber.of(bonusTicketNumber));
4946
rewardLotteryTickets = new RewardLotteryTickets(lotteryTickets, winnerLotteryTicket);
5047
}
5148

+74
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,74 @@
1+
package ui;
2+
3+
import domain.lottery.*;
4+
import service.LotteryService;
5+
import ui.common.InputView;
6+
import ui.common.Result;
7+
import util.Calculator;
8+
import util.Converter;
9+
10+
import static constant.LotteryRules.DEFAULT_LOTTERY_TICKET_PRICE;
11+
12+
public class ManualResultView implements Result {
13+
private final String DELIMITER = ", ";
14+
private LotteryTickets lotteryTickets;
15+
private WinnerLotteryTicket winnerLotteryTicket;
16+
private RewardLotteryTickets rewardLotteryTickets;
17+
18+
@Override
19+
public void printAll() {
20+
LotteryService lotteryService = new LotteryService();
21+
22+
printTicketNumbers();
23+
printLotteryResult(lotteryService);
24+
}
25+
26+
@Override
27+
public void printTicketNumbers() {
28+
System.out.println("구입금액을 입력해 주세요.");
29+
30+
long amount = InputView.inputInteger();
31+
int totalNumberOfLotteryTickets = (int) Calculator.divide(amount, DEFAULT_LOTTERY_TICKET_PRICE);
32+
33+
System.out.println();
34+
System.out.println("수동으로 구매할 로또 수를 입력해 주세요.");
35+
int numberOfManualLotteryTickets = InputView.inputInteger();
36+
37+
lotteryTickets = new LotteryTickets(totalNumberOfLotteryTickets - numberOfManualLotteryTickets);
38+
39+
System.out.println();
40+
System.out.println("수동으로 구매할 번호를 입력해 주세요.");
41+
for (int count = 1; count <= numberOfManualLotteryTickets; count++) {
42+
lotteryTickets.add(Converter.convertStringToLotteryTicket(InputView.inputString().split(DELIMITER)));
43+
}
44+
45+
System.out.println();
46+
System.out.println("수동으로 " + numberOfManualLotteryTickets + "장, 자동으로 " + (totalNumberOfLotteryTickets - numberOfManualLotteryTickets) + "개를 구매했습니다.");
47+
for (LotteryTicket lotteryTicket : lotteryTickets.getLotteryTickets()) {
48+
System.out.println(lotteryTicket.getTicketNumbers());
49+
}
50+
51+
System.out.println();
52+
System.out.println("지난 주 당첨 번호를 입력해 주세요.");
53+
LotteryTicket winnerTicket = Converter.convertStringToLotteryTicket(InputView.inputString().split(DELIMITER));
54+
55+
System.out.println("보너스 볼을 입력해 주세요.");
56+
int bonusTicketNumber = InputView.inputInteger();
57+
winnerLotteryTicket = new WinnerLotteryTicket(winnerTicket, LotteryNumber.of(bonusTicketNumber));
58+
rewardLotteryTickets = new RewardLotteryTickets(lotteryTickets, winnerLotteryTicket);
59+
}
60+
61+
@Override
62+
public void printLotteryResult(LotteryService lotteryService) {
63+
System.out.println();
64+
System.out.println("당첨 통계");
65+
System.out.println("---------");
66+
67+
System.out.println("3개 일치 (5000원)- " + lotteryService.countOfLotteryWinners(3, rewardLotteryTickets) + "개");
68+
System.out.println("4개 일치 (50000원)- " + lotteryService.countOfLotteryWinners(4, rewardLotteryTickets) + "개");
69+
System.out.println("5개 일치 (1500000원)- " + lotteryService.countOfLotteryWinners(5, rewardLotteryTickets) + "개");
70+
System.out.println("5개 일치, 보너스 볼 일치(30000000원)- " + lotteryService.countOfLotteryWinners(7, rewardLotteryTickets) + "개");
71+
System.out.println("6개 일치 (2000000000원)- " + lotteryService.countOfLotteryWinners(6, rewardLotteryTickets) + "개");
72+
System.out.println("총 수익률은 " + Calculator.rateOfProfit((long) lotteryTickets.getLotteryTickets().size() * DEFAULT_LOTTERY_TICKET_PRICE, lotteryService.findTotalRewards(new RewardLotteryTickets(lotteryTickets, winnerLotteryTicket))) + "입니다.(기준이 1이기 때문에 결과적으로 손해라는 의미임)");
73+
}
74+
}

src/main/java/util/Converter.java

+5-4
Original file line numberDiff line numberDiff line change
@@ -1,17 +1,18 @@
11
package util;
22

3+
import domain.lottery.LotteryNumber;
34
import domain.lottery.LotteryTicket;
45

56
import java.util.ArrayList;
6-
import java.util.List;
77

88
public class Converter {
99
public static LotteryTicket convertStringToLotteryTicket(String[] numbers) {
10-
List<Integer> lotteryTicketNumbers = new ArrayList<>();
10+
11+
LotteryTicket lotteryTicket = LotteryTicket.of(new ArrayList<>());
1112
for (String number : numbers) {
12-
lotteryTicketNumbers.add(Integer.parseInt(number));
13+
lotteryTicket.add(LotteryNumber.of(Integer.parseInt(number)));
1314
}
1415

15-
return new LotteryTicket(lotteryTicketNumbers);
16+
return lotteryTicket;
1617
}
1718
}

src/main/java/util/RandomNumberGenerator.java

+6-4
Original file line numberDiff line numberDiff line change
@@ -1,20 +1,22 @@
11
package util;
22

3+
import domain.lottery.LotteryNumber;
4+
35
import java.util.ArrayList;
46
import java.util.Collections;
57
import java.util.List;
68

79
public class RandomNumberGenerator {
8-
public static List<Integer> generateNumbers() {
9-
List<Integer> numberCandidates = new ArrayList<>();
10+
public static List<LotteryNumber> generateNumbers() {
11+
List<LotteryNumber> numberCandidates = new ArrayList<>();
1012

1113
for (int number = 1; number <= 45; number++) {
12-
numberCandidates.add(number);
14+
numberCandidates.add(LotteryNumber.of(number));
1315
}
1416

1517
Collections.shuffle(numberCandidates);
1618

17-
List<Integer> ticketNumbers = new ArrayList<>();
19+
List<LotteryNumber> ticketNumbers = new ArrayList<>();
1820
for (int index = 0; index < 6; index++) {
1921
ticketNumbers.add(numberCandidates.get(index));
2022
}

src/test/java/ConverterTest.java

+4-1
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,4 @@
1+
import domain.lottery.LotteryNumber;
12
import org.junit.jupiter.api.Order;
23
import org.junit.jupiter.api.Test;
34
import util.Converter;
@@ -14,7 +15,9 @@ public class ConverterTest {
1415
@Order(1)
1516
public void 복권변환_성공() {
1617
String[] numbers = {"1", "2", "3", "4", "5", "6"};
17-
List<Integer> expected = Arrays.asList(1, 2, 3, 4, 5, 6);
18+
List<LotteryNumber> expected = Arrays.asList(
19+
LotteryNumber.of(1), LotteryNumber.of(2), LotteryNumber.of(3),
20+
LotteryNumber.of(4), LotteryNumber.of(5), LotteryNumber.of(6));
1821
assertThat(Converter.convertStringToLotteryTicket(numbers).getTicketNumbers()).isEqualTo(expected);
1922
}
2023

src/test/java/LotteryServiceTest.java

+18-11
Original file line numberDiff line numberDiff line change
@@ -1,11 +1,8 @@
1-
import domain.lottery.RewardLotteryTickets;
2-
import service.LotteryService;
3-
import domain.lottery.LotteryTicket;
4-
import domain.lottery.LotteryTickets;
5-
import domain.lottery.WinnerLotteryTicket;
1+
import domain.lottery.*;
62
import org.junit.jupiter.api.BeforeEach;
73
import org.junit.jupiter.api.Order;
84
import org.junit.jupiter.api.Test;
5+
import service.LotteryService;
96

107
import java.util.Arrays;
118
import java.util.List;
@@ -25,12 +22,22 @@ public class LotteryServiceTest {
2522
public void init() {
2623
lotteryService = new LotteryService();
2724

28-
firstPrizeLotteryTickets = new LotteryTickets(List.of(new LotteryTicket(Arrays.asList(1, 2, 3, 4, 5, 6))));
29-
secondPrizeLotteryTickets = new LotteryTickets(List.of(new LotteryTicket(Arrays.asList(2, 3, 4, 6, 1, 10))));
30-
secondPrizeWithBonusNumberLotteryTickets = new LotteryTickets(List.of(new LotteryTicket(Arrays.asList(2, 3, 4, 6, 5, 7))));
31-
noPrizeLotteryTickets = new LotteryTickets(List.of(new LotteryTicket(Arrays.asList(11, 21, 31, 41, 15, 16))));
32-
LotteryTicket winnerTicketNumbers = new LotteryTicket(List.of(1, 2, 3, 4, 5, 6));
33-
winnerTicket = new WinnerLotteryTicket(winnerTicketNumbers, 7);
25+
firstPrizeLotteryTickets = new LotteryTickets(List.of(LotteryTicket.of(Arrays.asList(
26+
LotteryNumber.of(1), LotteryNumber.of(2), LotteryNumber.of(3),
27+
LotteryNumber.of(4), LotteryNumber.of(5), LotteryNumber.of(6)))));
28+
secondPrizeLotteryTickets = new LotteryTickets(List.of(LotteryTicket.of(Arrays.asList(
29+
LotteryNumber.of(2), LotteryNumber.of(3), LotteryNumber.of(4),
30+
LotteryNumber.of(6), LotteryNumber.of(1), LotteryNumber.of(10)))));
31+
secondPrizeWithBonusNumberLotteryTickets = new LotteryTickets(List.of(LotteryTicket.of(Arrays.asList(
32+
LotteryNumber.of(2), LotteryNumber.of(3), LotteryNumber.of(4),
33+
LotteryNumber.of(6), LotteryNumber.of(5), LotteryNumber.of(7)))));
34+
noPrizeLotteryTickets = new LotteryTickets(List.of(LotteryTicket.of(Arrays.asList(
35+
LotteryNumber.of(11), LotteryNumber.of(21), LotteryNumber.of(31),
36+
LotteryNumber.of(41), LotteryNumber.of(15), LotteryNumber.of(16)))));
37+
LotteryTicket winnerTicketNumbers = LotteryTicket.of(Arrays.asList(
38+
LotteryNumber.of(1), LotteryNumber.of(2), LotteryNumber.of(3),
39+
LotteryNumber.of(4), LotteryNumber.of(5), LotteryNumber.of(6)));
40+
winnerTicket = new WinnerLotteryTicket(winnerTicketNumbers, LotteryNumber.of(7));
3441
}
3542

3643
@Test

0 commit comments

Comments
 (0)