Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
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
11 changes: 9 additions & 2 deletions src/main/java/LottoApplication.java
Original file line number Diff line number Diff line change
@@ -1,11 +1,15 @@
import domain.lotto.Lotto;
import domain.lotto.LottoCollection;
import domain.lotto.LottoNumber;
import domain.lotto.WinningLotto;
import domain.money.Money;
import domain.provider.LottoSeller;
import input.InputView;
import output.OutputView;
import domain.LottoStatistics;

import java.util.Scanner;

/**
* @author delf
*/
Expand All @@ -15,11 +19,14 @@ public static void main(String[] args) {
LottoSeller lottoSeller = new LottoSeller(lottoPrice);

Money money = InputView.inputMoney();
LottoCollection myLotto = lottoSeller.sellTo(money);

int manualCount = InputView.getManualCount();

LottoCollection myLotto = lottoSeller.sellTo(money, manualCount);

OutputView.printLotto(myLotto);

Lotto winningLotto = InputView.inputWinningLottoNumber();
WinningLotto winningLotto = InputView.inputWinningLottoNumber();

LottoStatistics lottoStatistics = new LottoStatistics(winningLotto, myLotto, money);
OutputView.showWinningStatistics(lottoStatistics);
Expand Down
8 changes: 3 additions & 5 deletions src/main/java/domain/LottoStatistics.java
Original file line number Diff line number Diff line change
Expand Up @@ -2,6 +2,7 @@

import domain.lotto.Lotto;
import domain.lotto.LottoCollection;
import domain.lotto.WinningLotto;
import domain.money.Money;

import java.util.Iterator;
Expand All @@ -14,7 +15,7 @@ public class LottoStatistics implements Iterable<Rank> {
private Map<Rank, Integer> counter;
private Money invest;

public LottoStatistics(Lotto winningLotto, LottoCollection lottoCollection, Money money) {
public LottoStatistics(WinningLotto winningLotto, LottoCollection lottoCollection, Money money) {
this.counter = getCounter(winningLotto, lottoCollection);
this.invest = money;
}
Expand All @@ -25,13 +26,10 @@ public float getRor() {
sum += rank.getProfit(counter.get(rank));
}

System.out.println(invest.getAmount());
return (float) sum / invest.getAmount();
}

private final static Rank[] PRINT_ORDER_RANK = {Rank.FIFTH, Rank.FOURTH, Rank.THIRD, /*Rank.SECOND, */Rank.FIRST};

private Map<Rank, Integer> getCounter(Lotto winningLotto, LottoCollection lottoCollection) {
private Map<Rank, Integer> getCounter(WinningLotto winningLotto, LottoCollection lottoCollection) {
Map<Rank, Integer> counter = Rank.RANK_COUNTER();
for (Lotto lotto : lottoCollection) {
counter.merge(winningLotto.match(lotto), 1, Integer::sum);
Expand Down
10 changes: 7 additions & 3 deletions src/main/java/domain/Rank.java
Original file line number Diff line number Diff line change
Expand Up @@ -25,12 +25,12 @@ public enum Rank {
this.winningMoney = winningMoney;
}

public static Rank valueOf(int countOfMatch) {
public static Rank valueOf(int countOfMatch, boolean matchBonus) {
if (countOfMatch < WINNING_MIN_COUNT) {
return MISS;
}

if (SECOND.matchCount(countOfMatch)) {
if (SECOND.matchCount(countOfMatch) && matchBonus) {
return SECOND;
}

Expand Down Expand Up @@ -61,6 +61,10 @@ public static Map<Rank, Integer> RANK_COUNTER() {

@Override
public String toString() {
return String.format("%d개 일치 (%,d원)", countOfMatch, winningMoney);
String note = "";
if (this == Rank.SECOND) {
note = ", 보너스볼 일치";
}
return String.format("%d개 일치%s (%,d원)", countOfMatch, note, winningMoney);
}
}
19 changes: 5 additions & 14 deletions src/main/java/domain/lotto/Lotto.java
Original file line number Diff line number Diff line change
Expand Up @@ -7,36 +7,27 @@
*/
public class Lotto {

private static final int PICK_NUM = 6;
public static final int PICK_NUM = 6;
private List<LottoNumber> lotto;

public Lotto(List<LottoNumber> lotto) {
// 중복 체크
if (lotto.size() < PICK_NUM) {
throw new IllegalArgumentException();
}
this.lotto = lotto;
}

public Rank match(Lotto userLotto) {
int matchCount = getMatchCount(userLotto);
return Rank.valueOf(matchCount);
public int getMatchCount(Lotto userLotto) {
return (int) lotto.stream().filter(userLotto::contains).count();
}

private int getMatchCount(Lotto userLotto) {
int count = 0;
for (LottoNumber n : this.lotto) {
count += userLotto.contains(n) ? 1 : 0;
}
return count;
}

private boolean contains(LottoNumber n) {
public boolean contains(LottoNumber n) {
return lotto.contains(n);
}

@Override
public String toString() {
return lotto.toString();
}

}
14 changes: 14 additions & 0 deletions src/main/java/domain/lotto/LottoCollection.java
Original file line number Diff line number Diff line change
@@ -1,5 +1,7 @@
package domain.lotto;

import java.util.ArrayList;
import java.util.Collection;
import java.util.Iterator;
import java.util.List;

Expand All @@ -9,13 +11,21 @@
public class LottoCollection implements Iterable<Lotto> {
private List<Lotto> lottoList;

public LottoCollection() {
lottoList = new ArrayList<>();
}

public LottoCollection(List<Lotto> lottoList) {
if(lottoList.isEmpty()) {
throw new IllegalArgumentException();
}
this.lottoList = lottoList;
}

public void addAll(LottoCollection lottoCollection) {
lottoList.addAll(lottoCollection.getLottoList());
}

@Override
public Iterator<Lotto> iterator() {
return lottoList.iterator();
Expand All @@ -24,4 +34,8 @@ public Iterator<Lotto> iterator() {
public int size() {
return lottoList.size();
}

private List<Lotto> getLottoList() {
return lottoList;
}
}
24 changes: 24 additions & 0 deletions src/main/java/domain/lotto/WinningLotto.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,24 @@
package domain.lotto;

import domain.Rank;

public class WinningLotto {
private Lotto lotto;
private LottoNumber bonusNumber;

public WinningLotto(Lotto lotto, LottoNumber bonusNumber) {
this.lotto = lotto;
this.bonusNumber = bonusNumber;
}

public Rank match(Lotto userLotto) {
int matchCount = lotto.getMatchCount(userLotto);
boolean matchBonus = userLotto.contains(bonusNumber);
return Rank.valueOf(matchCount, matchBonus);
}

@Override
public String toString() {
return String.format("%s + %s", lotto , bonusNumber);
}
}
23 changes: 23 additions & 0 deletions src/main/java/domain/lotto/streragy/LottoAutoGenerateStrategy.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,23 @@
package domain.lotto.streragy;

import domain.lotto.Lotto;
import domain.lotto.LottoNumber;

import java.util.Collections;
import java.util.List;
import java.util.stream.Collectors;
import java.util.stream.IntStream;

/**
* @author delf
*/
public class LottoAutoGenerateStrategy implements LottoGenerateStrategy {

private static List<Integer> lottoNumberList = IntStream.rangeClosed(LottoNumber.MIN, LottoNumber.MAX).boxed().collect(Collectors.toList());

@Override
public Lotto generateLotto() {
Collections.shuffle(lottoNumberList);
return new Lotto(lottoNumberList.stream().limit(Lotto.PICK_NUM).map(LottoNumber::of).collect(Collectors.toList()));
}
}
10 changes: 10 additions & 0 deletions src/main/java/domain/lotto/streragy/LottoGenerateStrategy.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,10 @@
package domain.lotto.streragy;

import domain.lotto.Lotto;

/**
* @author delf
*/
public interface LottoGenerateStrategy {
Lotto generateLotto();
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,32 @@
package domain.lotto.streragy;

import domain.lotto.Lotto;
import domain.lotto.LottoNumber;
import input.ConsoleInput;
import input.Inputtable;

import java.util.Arrays;

import static java.util.stream.Collectors.toList;

/**
* @author delf
*/
public class LottoManualGenerateStrategy implements LottoGenerateStrategy{

private Inputtable inputInterface;

public LottoManualGenerateStrategy(Inputtable inputInterface) {
this.inputInterface = inputInterface;
}

@Override
public Lotto generateLotto() {
String inputValue = inputInterface.getStringValue();
// 중복체크
return new Lotto(Arrays.stream(inputValue.trim().split(","))
.map(Integer::parseInt)
.map(LottoNumber::of)
.collect(toList()));
}
}
23 changes: 17 additions & 6 deletions src/main/java/domain/provider/LottoSeller.java
Original file line number Diff line number Diff line change
Expand Up @@ -2,7 +2,11 @@

import domain.lotto.Lotto;
import domain.lotto.LottoCollection;
import domain.lotto.streragy.LottoAutoGenerateStrategy;
import domain.lotto.streragy.LottoGenerateStrategy;
import domain.lotto.streragy.LottoManualGenerateStrategy;
import domain.money.Money;
import input.ConsoleInput;

import java.util.ArrayList;
import java.util.List;
Expand All @@ -13,27 +17,34 @@
public class LottoSeller {

private Money lotto;
private LottoGenerator lottoGenerator = new LottoGenerator(); // 현재는 고정

public LottoSeller(Money lottoPrice) {
this.lotto = lottoPrice;

}

public LottoCollection sellTo(Money money) {
public LottoCollection sellTo(Money money, int manualCount) {
int buyLottoSize = getCountOfLotto(money);
return generateLottoCollection(buyLottoSize);
if (manualCount > buyLottoSize) {
throw new IllegalArgumentException();
}

LottoCollection lottoCollection = new LottoCollection();
lottoCollection.addAll(generateLottoCollection(new LottoManualGenerateStrategy(new ConsoleInput()), manualCount));
lottoCollection.addAll(generateLottoCollection(new LottoAutoGenerateStrategy(), buyLottoSize - manualCount));

return lottoCollection;
}

private int getCountOfLotto(Money money) {
return Money.of(money).getAmount() / lotto.getAmount();
}

private LottoCollection generateLottoCollection(/* 로또 생성 전략 ,*/ int size) {
private LottoCollection generateLottoCollection(LottoGenerateStrategy strategy, int size) {
List<Lotto> lottoList = new ArrayList<>();
for (int i = 0; i < size; i++) {
lottoList.add(lottoGenerator.generateLotto());
lottoList.add(strategy.generateLotto());
}

return new LottoCollection(lottoList);
}
}
16 changes: 16 additions & 0 deletions src/main/java/input/ConsoleInput.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,16 @@
package input;

import java.util.Scanner;

/**
* @author delf
*/
public class ConsoleInput implements Inputtable {

private static Scanner scanner = new Scanner(System.in);

@Override
public String getStringValue() {
return scanner.nextLine();
}
}
26 changes: 20 additions & 6 deletions src/main/java/input/InputView.java
Original file line number Diff line number Diff line change
Expand Up @@ -2,6 +2,7 @@

import domain.lotto.Lotto;
import domain.lotto.LottoNumber;
import domain.lotto.WinningLotto;
import domain.money.Money;

import java.util.Arrays;
Expand All @@ -12,26 +13,39 @@
public class InputView {
private static final String buyGuideText = "구입금액을 입력해 주세요.";
private static final String winningGuideText = "지난 주 당첨 번호를 입력해 주세요.";
private static final String bonusNumberGuideText = "보너스 볼을 입력해 주세요.";

public static Money inputMoney() {
return buyMock(1400000);
}

private static Money buyMock(int n) {
System.out.println(buyGuideText);
return new Money(n);
return Money.of(n);
}

public static Lotto inputWinningLottoNumber() {
public static WinningLotto inputWinningLottoNumber() {
return winningLottoMock();
}

private static Lotto winningLottoMock() {
public static int getManualCount() {
System.out.println("수동으로 구매할 로또 수를 입력해 주세요.");
final int count = 3;
System.out.println(count);
return count; // 임시
}

private static WinningLotto winningLottoMock() {
System.out.println(winningGuideText);
Lotto lotto = new Lotto(Arrays.asList(LottoNumber.of(1), LottoNumber.of(2), LottoNumber.of(3), LottoNumber.of(4), LottoNumber.of(5), LottoNumber.of(6)));
System.out.println(lotto);
System.out.println("> 입력함");

return lotto;
}
System.out.println(bonusNumberGuideText);
WinningLotto winningLotto = new WinningLotto(lotto, LottoNumber.of(7));
System.out.println("> 입력함");

System.out.println(" 입력 값: " + winningLotto + "\n");

return winningLotto;
}
}
8 changes: 8 additions & 0 deletions src/main/java/input/Inputtable.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,8 @@
package input;

/**
* @author delf
*/
public interface Inputtable {
String getStringValue();
}
Loading