Skip to content

Commit cb97e23

Browse files
feat: 3단계 로또 2등 (#2757)
* chore: 패키지 이동 * feat: 3단계 로또 2등(#2756) * chore: 패키지 이동 * refactor: PR 리뷰 반영한 리팩토링 Co-authored-by: annelguplus <[email protected]>
1 parent baed45d commit cb97e23

36 files changed

+405
-377
lines changed

README.md

+37-8
Original file line numberDiff line numberDiff line change
@@ -1,9 +1,38 @@
11
# 로또
2-
## 진행 방법
3-
* 로또 요구사항을 파악한다.
4-
* 요구사항에 대한 구현을 완료한 후 자신의 github 아이디에 해당하는 브랜치에 Pull Request(이하 PR)를 통해 코드 리뷰 요청을 한다.
5-
* 코드 리뷰 피드백에 대한 개선 작업을 하고 다시 PUSH한다.
6-
* 모든 피드백을 완료하면 다음 단계를 도전하고 앞의 과정을 반복한다.
7-
8-
## 온라인 코드 리뷰 과정
9-
* [텍스트와 이미지로 살펴보는 온라인 코드 리뷰 과정](https://github.com/next-step/nextstep-docs/tree/master/codereview)
2+
## 기능명세서
3+
- 문자열 계산기(StringCalculator.java)
4+
- 로또(자동) 추첨 프로그램(AutoResultView.java)
5+
- 로또(2등) 추첨 프로그램(AutoResultView.java)
6+
- 로또 수동 추첨 프로그램(ManualResultView.java)
7+
8+
# Commit Message Convention
9+
```html
10+
<type>: <subject>
11+
<body>
12+
<footer>
13+
```
14+
- e.g) feat: add login api (#12)
15+
16+
# Type
17+
```text
18+
feat : 새로운 기능 추가, 기존의 기능을 요구 사항에 맞추어 수정
19+
fix : 기능에 대한 버그 수정
20+
build : 빌드 관련 수정
21+
chore : 패키지 매니저 수정, 그 외 기타 수정 ex) .gitignore
22+
ci : CI 관련 설정 수정
23+
docs : 문서(주석) 수정
24+
style : 코드 스타일, 포맷팅에 대한 수정
25+
refactor : 기능의 변화가 아닌 코드 리팩터링 ex) 변수 이름 변경
26+
test : 테스트 코드 추가/수정
27+
release : 버전 릴리즈
28+
```
29+
30+
# Subject
31+
- 간략하게 어떠한 작업을 하였는지 작성한다.
32+
- e.g) feat: 3단계 자동차 경주 기능 구현
33+
34+
# Body
35+
- Subject에서 작성하지 못한 상세 설명을 작성한다.
36+
37+
# Footer
38+
- 어떤 이슈에 대한 작업인지 이슈 번호를 작성한다.(#issue번호)

src/main/java/JavaLottoApplication.java

+1-1
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
import ui.AutoResultView;
2-
import ui.ResultView;
2+
import ui.common.ResultView;
33

44
public class JavaLottoApplication {
55
public static void main(String... args) {

src/main/java/StringCalculator.java

+2
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,5 @@
1+
import domain.string_calculator.*;
2+
import domain.string_calculator.Number;
13
import org.jetbrains.annotations.NotNull;
24

35
import java.util.ArrayList;

src/main/java/constant/LotteryRules.java

+1-6
Original file line numberDiff line numberDiff line change
@@ -3,13 +3,8 @@
33
public class LotteryRules {
44
public static final int DEFAULT_LOTTERY_TICKET_PRICE = 1000;
55
public static final int NUMBER_OF_MATCHED_TICKET_NUMBER_FOR_FIRST_PLACE = 6;
6+
public static final int NUMBER_OF_MATCHED_TICKET_NUMBER_FOR_SECOND_WITH_BONUS_PLACE = 7;
67
public static final int NUMBER_OF_MATCHED_TICKET_NUMBER_FOR_SECOND_PLACE = 5;
78
public static final int NUMBER_OF_MATCHED_TICKET_NUMBER_FOR_THIRD_PLACE = 4;
89
public static final int NUMBER_OF_MATCHED_TICKET_NUMBER_FOR_FOURTH_PLACE = 3;
9-
public static final int NUMBER_OF_MATCHED_TICKET_NUMBER_FOR_UNKNOWN = 0;
10-
public static final int REWARD_OF_FIRST_PLACE = 2000000000;
11-
public static final int REWARD_OF_SECOND_PLACE = 1500000;
12-
public static final int REWARD_OF_THIRD_PLACE = 50000;
13-
public static final int REWARD_OF_FOURTH_PLACE = 5000;
14-
public static final int REWARD_OF_UNKNOWN = 0;
1510
}

src/main/java/constant/Prize.java

-21
This file was deleted.

src/main/java/constant/Rank.java

+9-26
Original file line numberDiff line numberDiff line change
@@ -1,37 +1,20 @@
11
package constant;
22

3-
import static constant.LotteryRules.*;
3+
public enum Rank {
4+
FIRST(2000000000L),
5+
SECOND(1500000L),
6+
SECOND_WITH_BONUS(30000000L),
7+
THIRD(50000L),
8+
FOURTH(5000L),
9+
UNKNOWN(0L);
410

5-
public class Rank {
6-
private final long countOfMatchedNumber;
711
private final long reward;
812

9-
public Rank(long countOfMatchedNumber) {
10-
this.countOfMatchedNumber = countOfMatchedNumber;
11-
reward = 0L;
12-
}
13-
14-
public Rank(long countOfMatchedNumber, long reward) {
15-
this.countOfMatchedNumber = countOfMatchedNumber;
13+
Rank(long reward) {
1614
this.reward = reward;
1715
}
1816

19-
public long getReward() {
17+
public long findReward() {
2018
return reward;
2119
}
22-
23-
public String findRank() {
24-
switch ((int) countOfMatchedNumber) {
25-
case NUMBER_OF_MATCHED_TICKET_NUMBER_FOR_FOURTH_PLACE:
26-
return "FOURTH";
27-
case NUMBER_OF_MATCHED_TICKET_NUMBER_FOR_THIRD_PLACE:
28-
return "THIRD";
29-
case NUMBER_OF_MATCHED_TICKET_NUMBER_FOR_SECOND_PLACE:
30-
return "SECOND";
31-
case NUMBER_OF_MATCHED_TICKET_NUMBER_FOR_FIRST_PLACE:
32-
return "FIRST";
33-
default:
34-
return "UNKNOWN";
35-
}
36-
}
3720
}

src/main/java/domain/LotteryWinningService.java

-32
This file was deleted.

src/main/java/domain/TicketCountService.java

-13
This file was deleted.

src/main/java/domain/TicketNumberService.java

-27
This file was deleted.

src/main/java/vo/LotteryTicket.java src/main/java/domain/lottery/LotteryTicket.java

+1-1
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
package vo;
1+
package domain.lottery;
22

33
import java.util.List;
44

Original file line numberDiff line numberDiff line change
@@ -0,0 +1,29 @@
1+
package domain.lottery;
2+
3+
import util.Calculator;
4+
import util.RandomNumberGenerator;
5+
6+
import java.util.ArrayList;
7+
import java.util.List;
8+
9+
import static constant.LotteryRules.DEFAULT_LOTTERY_TICKET_PRICE;
10+
11+
public class LotteryTickets {
12+
private final List<LotteryTicket> lotteryTickets;
13+
14+
public LotteryTickets(long amount) {
15+
int countOfLotteryTickets = (int) Calculator.divide(amount, DEFAULT_LOTTERY_TICKET_PRICE);
16+
lotteryTickets = new ArrayList<>(countOfLotteryTickets);
17+
for (long count = 1; count <= countOfLotteryTickets; count++) {
18+
lotteryTickets.add(new LotteryTicket(RandomNumberGenerator.generateNumbers()));
19+
}
20+
}
21+
22+
public LotteryTickets(List<LotteryTicket> lotteryTickets) {
23+
this.lotteryTickets = lotteryTickets;
24+
}
25+
26+
public List<LotteryTicket> getLotteryTickets() {
27+
return lotteryTickets;
28+
}
29+
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,44 @@
1+
package domain.lottery;
2+
3+
import constant.Rank;
4+
5+
import java.util.ArrayList;
6+
import java.util.List;
7+
8+
import static constant.LotteryRules.*;
9+
10+
public class RewardLotteryTickets {
11+
private final List<Rank> ranks;
12+
private final List<Long> rewards;
13+
14+
public RewardLotteryTickets(LotteryTickets lotteryTickets, WinnerLotteryTicket winnerLotteryTicket) {
15+
ranks = new ArrayList<>();
16+
rewards = new ArrayList<>();
17+
18+
for (LotteryTicket lotteryTicket : lotteryTickets.getLotteryTickets()) {
19+
ranks.add(winnerLotteryTicket.findRank(lotteryTicket));
20+
rewards.add(winnerLotteryTicket.findRank(lotteryTicket).findReward());
21+
}
22+
}
23+
24+
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+
}
39+
}
40+
41+
public long sumAllRewards() {
42+
return rewards.stream().reduce(0L, Long::sum);
43+
}
44+
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,38 @@
1+
package domain.lottery;
2+
3+
import constant.Rank;
4+
5+
import static constant.LotteryRules.*;
6+
7+
public class WinnerLotteryTicket {
8+
private final LotteryTicket winnerLotteryTicket;
9+
private final int bonusTicketNumber;
10+
11+
public WinnerLotteryTicket(LotteryTicket winnerTicket, int bonusTicketNumber) {
12+
this.winnerLotteryTicket = winnerTicket;
13+
this.bonusTicketNumber = bonusTicketNumber;
14+
}
15+
16+
public boolean hasBonusTicketNumber(LotteryTicket lotteryTicket) {
17+
return lotteryTicket.getTicketNumbers().stream().anyMatch(number -> number == bonusTicketNumber);
18+
}
19+
20+
public Rank findRank(LotteryTicket lotteryTicket) {
21+
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;
23+
switch (countOfMatchedNumber) {
24+
case NUMBER_OF_MATCHED_TICKET_NUMBER_FOR_FOURTH_PLACE:
25+
return Rank.FOURTH;
26+
case NUMBER_OF_MATCHED_TICKET_NUMBER_FOR_THIRD_PLACE:
27+
return Rank.THIRD;
28+
case NUMBER_OF_MATCHED_TICKET_NUMBER_FOR_SECOND_PLACE:
29+
return Rank.SECOND;
30+
case NUMBER_OF_MATCHED_TICKET_NUMBER_FOR_SECOND_WITH_BONUS_PLACE:
31+
return Rank.SECOND_WITH_BONUS;
32+
case NUMBER_OF_MATCHED_TICKET_NUMBER_FOR_FIRST_PLACE:
33+
return Rank.FIRST;
34+
default:
35+
return Rank.UNKNOWN;
36+
}
37+
}
38+
}

src/main/java/Number.java src/main/java/domain/string_calculator/Number.java

+2
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,5 @@
1+
package domain.string_calculator;
2+
13
public class Number {
24
private final long number;
35

src/main/java/Numbers.java src/main/java/domain/string_calculator/Numbers.java

+2
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,5 @@
1+
package domain.string_calculator;
2+
13
import java.util.List;
24

35
public class Numbers {

src/main/java/Operation.java src/main/java/domain/string_calculator/Operation.java

+2
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,5 @@
1+
package domain.string_calculator;
2+
13
public class Operation {
24
private final String operation;
35

src/main/java/Operations.java src/main/java/domain/string_calculator/Operations.java

+2
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,5 @@
1+
package domain.string_calculator;
2+
13
import java.util.List;
24

35
public class Operations {

src/main/java/TotalNumber.java src/main/java/domain/string_calculator/TotalNumber.java

+2
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,5 @@
1+
package domain.string_calculator;
2+
13
public class TotalNumber {
24
private long total;
35

+13
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,13 @@
1+
package service;
2+
3+
import domain.lottery.*;
4+
5+
public class LotteryService {
6+
public long countOfLotteryWinners(int countOfMatchedNumber, RewardLotteryTickets rewardLotteryTickets) {
7+
return rewardLotteryTickets.countOfRank(countOfMatchedNumber);
8+
}
9+
10+
public long findTotalRewards(RewardLotteryTickets rewardLotteryTickets) {
11+
return rewardLotteryTickets.sumAllRewards();
12+
}
13+
}

0 commit comments

Comments
 (0)