Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

[Lee, Nathan] 로또 2단계 - 보너스 번호 추가 #41

Open
wants to merge 19 commits into
base: nathan29849
Choose a base branch
from
Open
Changes from 1 commit
Commits
Show all changes
19 commits
Select commit Hold shift + click to select a range
97da692
[step2] 시작
nathan29849 Feb 23, 2022
edf45b6
[step2] Enum 클래스 이름 변경(Rank) 및 switch문 Enum 클래스 내부로 이동
nathan29849 Feb 23, 2022
c59c7d5
[step2] makeAutoTicket(), makeManualTicket 분리해 수동 추첨 구현
street62 Feb 23, 2022
f438af0
[step2] 보너스 볼 기능 추가
nathan29849 Feb 23, 2022
cedce92
[step2] recactoring : 당첨 티켓과 현재 로또 티켓을 비교하는 기능을 TicketOffice에서 LottoT…
nathan29849 Feb 23, 2022
0a0f20d
[step2] 로또 자동/수동 입력 오류 수정
street62 Feb 23, 2022
2be4b31
[step2] TicketOffice 클래스 자동/수동 설정 리팩토링
street62 Feb 23, 2022
00a3220
[step2] TicketOffice.checkBonusNumber() -> LottoTicket.checkBonusNumb…
nathan29849 Feb 23, 2022
7162394
[step2] TicketOffice 클래스의 당첨 관련 기능을 LottoCompany 클래스로 분리
street62 Feb 24, 2022
ff671c5
[step2] User 클래스 추가
street62 Feb 24, 2022
2778b9a
[step2] LottoCompany 클래스를 통해 User에서 당첨 정보를 조회
nathan29849 Feb 24, 2022
a89c370
[step2] Rank 수정, 당첨 통계 Map key Integer -> Rank 수정
street62 Feb 24, 2022
6cc42b8
[step2] OutputView.showWinningResult 개선
nathan29849 Feb 24, 2022
8cc12ad
[step2] Rank 클래스 리팩토링 : checkBonus 메서드를 통해 indent를 줄임
nathan29849 Feb 24, 2022
68655b3
[step2] Rank 클래스에 FAIL 추가
nathan29849 Feb 24, 2022
c988010
[step3] 수동 티켓 개수 입력 받은 후 한꺼번에 생성하는 기능 구현
nathan29849 Feb 25, 2022
643fd1f
[step3] AutoTicketOffice, ManualTicketOffice 클래스 추가
street62 Feb 25, 2022
01591d8
[step3] User.goTicketOffice 메서드 구현
nathan29849 Feb 25, 2022
a2bed80
[step3] README 3단계 수동구매 기능 추가 관련 정보 기입
nathan29849 Feb 25, 2022
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Prev Previous commit
Next Next commit
[step2] 보너스 볼 기능 추가
Rank enum Class에 FIRST ~ FIFTH 까지 총 5단계로 구성
TicketOffice에서 보너스를 처리하는 메서드 : checkBonusNumber(), setBonusNumber() 추가
이에 따른 InputView, OutputView 개선
nathan29849 committed Feb 23, 2022
commit f438af0871f77f920794a85073cd7c4e222d19e5
1 change: 1 addition & 0 deletions src/main/java/Main.java
Original file line number Diff line number Diff line change
@@ -8,6 +8,7 @@ public static void main(String[] args) {
TicketOffice to = new TicketOffice();
List<LottoTicket> tickets = to.issueTickets();
to.setWinningNumber();
to.setBonusNumber();
to.getStatistic(tickets);
}
}
19 changes: 11 additions & 8 deletions src/main/java/domain/Rank.java
Original file line number Diff line number Diff line change
@@ -1,10 +1,11 @@
package domain;

public enum Rank {
FORTH(3, 5000),
THIRD(4, 50000),
SECOND(5, 1500000),
FIRST(6, 2000000000);
FIFTH(3, 5_000),
FORTH(4, 50_000),
THIRD(5, 1_500_000),
SECOND(7, 30_000_000),
FIRST(6, 2_000_000_000);

private final int matchedNumber;
private final int prize;
@@ -18,17 +19,19 @@ public int getMatchedNumber() {
return matchedNumber;
}

public int getPrize(){
public int getPrize() {
return prize;
}

public static Rank designateRank(int matchedNumber) {
public static Rank designateRank(int matchedNumber, boolean isBonus) {
switch (matchedNumber) {
case 3:
return FORTH;
return FIFTH;
case 4:
return THIRD;
return FORTH;
case 5:
return THIRD;
case 7:
return SECOND;
default:
return FIRST;
38 changes: 31 additions & 7 deletions src/main/java/domain/TicketOffice.java
Original file line number Diff line number Diff line change
@@ -11,6 +11,7 @@ public class TicketOffice {
private final int SELECTED_NUMBER = 6;
private final int PRICE = 1000;
private int TOTAL_PRICE;
private int bonusNumber;
private List<Integer> winningNumbers = new ArrayList<>();
private Map<Integer, Integer> statistics = new HashMap<>();

@@ -19,6 +20,7 @@ public class TicketOffice {
statistics.put(4, 0);
statistics.put(5, 0);
statistics.put(6, 0);
statistics.put(7, 0);
}


@@ -59,8 +61,7 @@ public List<LottoTicket> issueTickets() {
for (int i = 0; i < numberOfTickets; i++) {
tickets.add(makeAutoTicket());
}
}
else {
} else {
for (int i = 0; i < numberOfTickets; i++) {
tickets.add(makeManualTicket());
}
@@ -76,25 +77,41 @@ public void setWinningNumber() {
}
}

public void setBonusNumber() { // 추후 당첨 번호에 없는 번호만 받도록 예외처리 필요
bonusNumber = InputView.getBonusNumber();
}

public void getStatistic(List<LottoTicket> tickets) {
int matchedNumber = 0;
boolean isBonus = false;
for (LottoTicket ticket : tickets) {
matchedNumber = checkWinningNumber(ticket.getTicketInfo());
isBonus = checkBonusNumber(ticket.getTicketInfo());
matchedNumber += temp(matchedNumber, isBonus);
statistics.computeIfPresent(matchedNumber, (k, v) -> v + 1);
}
OutputView.showWinningResult(this.statistics, calculateProfit());
OutputView.showWinningResult(this.statistics, calculateProfit(isBonus));
}

public double calculateProfit() {
private int temp(int matchedNumber, boolean isBonus){
if (matchedNumber == 5){
if(isBonus){
return 2;
}
}
return 0;
}

public double calculateProfit(boolean isBonus) {
int totalPrize = 0;
for (Integer matchedNumber : statistics.keySet()) {
totalPrize += (switchPrize(matchedNumber) * statistics.get(matchedNumber));
totalPrize += (switchPrize(matchedNumber, isBonus) * statistics.get(matchedNumber));
}
return ((double) (totalPrize - TOTAL_PRICE) / TOTAL_PRICE) * 100;
}

private int switchPrize(int matchedNumber) {
return Rank.designateRank(matchedNumber).getPrize();
private int switchPrize(int matchedNumber, boolean isBonus) {
return Rank.designateRank(matchedNumber, isBonus).getPrize();
}

private int checkWinningNumber(List<Integer> ticketInfo) {
@@ -105,6 +122,13 @@ private int checkWinningNumber(List<Integer> ticketInfo) {
return count;
}

private boolean checkBonusNumber(List<Integer> ticketInfo) {
if (ticketInfo.contains(bonusNumber)) {
return true;
}
return false;
}

private int isWinningNumber(int number) {
if (winningNumbers.contains(number)) {
return 1;
8 changes: 7 additions & 1 deletion src/main/java/view/InputView.java
Original file line number Diff line number Diff line change
@@ -18,7 +18,7 @@ public static int getAmount() {

public static String[] getWinningNumber() {
sc = new Scanner(System.in);
System.out.println("\n당첨 번호를 입력해 주세요.");
System.out.println("\n지난 주 당첨 번호를 입력해 주세요.");
return sc.nextLine().split(",");
}

@@ -39,4 +39,10 @@ public static List<Integer> getManualNumber() {
manualNumber.add(Integer.parseInt(number));
return manualNumber;
}

public static int getBonusNumber(){
sc = new Scanner(System.in);
System.out.println("보너스 볼을 입력해 주세요.");
return Integer.parseInt(sc.nextLine());
}
}
25 changes: 18 additions & 7 deletions src/main/java/view/OutputView.java
Original file line number Diff line number Diff line change
@@ -17,16 +17,27 @@ public static void completePurchase(int numberOfTickets, int change, List<LottoT
}

public static void showWinningResult(Map<Integer, Integer> statistics, double profitRate) {
System.out.println("\n당첨 통계");
System.out.println("__________");
StringBuilder sb = new StringBuilder();
int matchedNumber;
int prize;
for (Rank pa : Rank.values()) {
matchedNumber = pa.getMatchedNumber();
prize = pa.getPrize();
System.out.printf("%d개 일치 (%d원) - %d개", matchedNumber, prize, statistics.get(matchedNumber));
System.out.println();
sb.append("\n당첨 통계\n");
sb.append("__________\n");
for (Rank rank : Rank.values()) {
matchedNumber = rank.getMatchedNumber();
prize = rank.getPrize();
if (rank == Rank.SECOND){
matchedNumber -= 2;
}
sb.append(matchedNumber).append("개 일치");

if (rank == Rank.SECOND){
matchedNumber += 2;
sb.append(", 보너스 볼 일치");
}
sb.append(" (").append(prize).append(")원 - ");
sb.append(statistics.get(matchedNumber)).append("개\n");
}
System.out.println(sb.toString());
System.out.printf("총 수익률은 %.2f%%입니다.", profitRate);
}
}