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
20 changes: 12 additions & 8 deletions src/main/java/lotto/LottoGameApplication.java
Original file line number Diff line number Diff line change
@@ -1,8 +1,8 @@
package lotto;

import lotto.domain.game.LottoGame;
import java.util.List;
import lotto.domain.game.LottoMachine;
import lotto.domain.lotto.Money;
import lotto.domain.lotto.LottoTickets;
import lotto.domain.lotto.Purchase;
import lotto.domain.lotto.WinningTicket;
import lotto.domain.result.GameResult;
Expand All @@ -15,16 +15,20 @@ public static void main(String[] args) {
LottoMachine machine = new LottoMachine();

int purchaseAmount = InputView.inputPurchaseAmount();
Purchase purchase = machine.purchase(new Money(purchaseAmount));
int manualCount = InputView.inputManualLottoCount();
List<String> manualTickets = InputView.inputManualLottoTickets(manualCount);

Purchase purchase = machine.createPurchase(purchaseAmount, manualCount);
ResultView.printPurchase(purchase);

LottoTickets tickets = machine.generateTickets(manualTickets, purchase.getAutoCount());
ResultView.printTickets(tickets);

String winningLottoNumbers = InputView.inputWinningLottoNumbers();
int bonusNumber = InputView.inputBonusNumber();
WinningTicket winning = new WinningTicket(winningLottoNumbers, bonusNumber);

LottoGame game = new LottoGame(winning);
GameResult gameResult = game.check(purchase);

ResultView.printResult(gameResult, purchase.getPurchaseAmount());
GameResult result = tickets.match(winning);
ResultView.printResult(result, purchase);
}
}
}
111 changes: 80 additions & 31 deletions src/main/java/lotto/README.md
Original file line number Diff line number Diff line change
@@ -1,11 +1,13 @@
# ๊ธฐ๋Šฅ ์š”๊ตฌ์‚ฌํ•ญ

> ์ž…๋ ฅํ•œ ๊ธˆ์•ก๋งŒํผ ๋กœ๋˜ ์ž๋™์œผ๋กœ ๋ฐœ๊ธ‰ํ•ด์ฃผ๋Š” ๊ธฐ๋Šฅ
> ์ž…๋ ฅํ•œ ๊ธˆ์•ก๋งŒํผ ๋กœ๋˜๋ฅผ ์ˆ˜๋™/์ž๋™์œผ๋กœ ๋ฐœ๊ธ‰ํ•ด์ฃผ๋Š” ๊ธฐ๋Šฅ

1. ๊ตฌ์ž… ๊ธˆ์•ก ์ž…๋ ฅ ๊ธฐ๋Šฅ
2. N๊ฐœ์˜ ๋กœ๋˜ ๊ตฌ๋งค ๊ธฐ๋Šฅ (์ž๋™)
3. ๋‹น์ฒจ ๋ฒˆํ˜ธ ์ž…๋ ฅ ๊ธฐ๋Šฅ (๋‹น์ฒจ ๋ฒˆํ˜ธ 6๊ฐœ + ๋ณด๋„ˆ์Šค๋ณผ 1๊ฐœ)
4. ๋‹น์ฒจ ํ†ต๊ณ„ ์กฐํšŒ ๊ธฐ๋Šฅ
2. ์ˆ˜๋™ ๊ตฌ๋งค ๋กœ๋˜ ๊ฐœ์ˆ˜ ์ž…๋ ฅ ๊ธฐ๋Šฅ
3. ์ˆ˜๋™ ๋กœ๋˜ ๋ฒˆํ˜ธ ์ž…๋ ฅ ๊ธฐ๋Šฅ
4. N๊ฐœ์˜ ๋กœ๋˜ ๊ตฌ๋งค ๊ธฐ๋Šฅ (์ˆ˜๋™ + ์ž๋™)
5. ๋‹น์ฒจ ๋ฒˆํ˜ธ ์ž…๋ ฅ ๊ธฐ๋Šฅ (๋‹น์ฒจ ๋ฒˆํ˜ธ 6๊ฐœ + ๋ณด๋„ˆ์Šค๋ณผ 1๊ฐœ)
6. ๋‹น์ฒจ ํ†ต๊ณ„ ์กฐํšŒ ๊ธฐ๋Šฅ
- ๋ช‡ ๊ฐœ์˜ ๋ฒˆํ˜ธ๊ฐ€ ์ผ์น˜ํ•˜๋Š”์ง€, ๋ช‡ ๊ฐœ์ธ์ง€
- ๋ณด๋„ˆ์Šค๋ณผ ์ผ์น˜ ์—ฌ๋ถ€ (5๊ฐœ ์ผ์น˜ ์‹œ)
- ์ˆ˜์ต๋ฅ 
Expand All @@ -17,53 +19,73 @@
- ๋ฌด์—‡์ธ๊ฐ€? : ๊ตฌ๋งค๊ธˆ์— ๋”ฐ๋ผ ๋กœ๋˜๋ฅผ ์ƒ์„ฑํ•ด์ฃผ๋Š” ๋จธ์‹ 
- ์—ญํ• 
- ๋กœ๋˜ ๋ฐœ๊ธ‰ ๊ฐœ์ˆ˜ ๊ณ„์‚ฐ
- ๋žœ๋ค ๋กœ๋˜ ํ‹ฐ์ผ“ ์ƒ์„ฑ
- ์ˆ˜๋™ ๋กœ๋˜ ํ‹ฐ์ผ“ ๋ณ€ํ™˜
- ์ž๋™ ๋กœ๋˜ ํ‹ฐ์ผ“ ์ƒ์„ฑ
- ๊ตฌ๋งค ์ •๋ณด(Purchase) ์ƒ์„ฑ

## ๋กœ๋˜ ํ‹ฐ์ผ“๋“ค (LottoTickets)

- ๋ฌด์—‡์ธ๊ฐ€? : ์—ฌ๋Ÿฌ ๋กœ๋˜ ํ‹ฐ์ผ“์„ ๊ด€๋ฆฌํ•˜๋Š” ์ผ๊ธ‰ ์ปฌ๋ ‰์…˜
- ์—ญํ• 
- ๋กœ๋˜ ํ‹ฐ์ผ“ ๋ชฉ๋ก ๋ณด๊ด€
- ๋‹น์ฒจ ํ‹ฐ์ผ“๊ณผ ๋น„๊ตํ•˜์—ฌ ๊ฒŒ์ž„ ๊ฒฐ๊ณผ ์ƒ์„ฑ

## ๋กœ๋˜ (LottoTicket)

- ๋ฌด์—‡์ธ๊ฐ€? : 6๊ฐœ์˜ ๊ณ ์œ ํ•œ ์ˆซ์ž๋ฅผ ๋‹ด์€ ๋กœ๋˜ ํ‹ฐ์ผ“
- ์—ญํ• 
- 6๊ฐœ์˜ ์ˆซ์ž ๋ณด๊ด€
- ์ผ์น˜ ๊ฐฏ์ˆ˜ ๋น„๊ต
- ๋ฌธ์ž์—ด/์ˆซ์ž ๋ฐฐ์—ด๋กœ๋ถ€ํ„ฐ ํ‹ฐ์ผ“ ์ƒ์„ฑ
- ์ผ์น˜ ๊ฐœ์ˆ˜ ๋น„๊ต
- ํŠน์ • ๋ฒˆํ˜ธ ํฌํ•จ ์—ฌ๋ถ€ ํ™•์ธ

## ๋กœ๋˜ ์ˆซ์ž (LottoNumber)

- ๋ฌด์—‡์ธ๊ฐ€? : ๋กœ๋˜ ๋‚ด ์ˆซ์ž
- ์—ญํ• 
- ๋ฒˆํ˜ธ ์œ ํšจ์„ฑ ๋ณด์žฅ (1 ~ 45)
- ์บ์‹ฑ์„ ํ†ตํ•œ ๊ฐ์ฒด ์žฌ์‚ฌ์šฉ
- ์ˆซ์ž ๊ฐ์ฒด ๋น„๊ต

## ๊ธˆ์•ก (Money)

- ๋ฌด์—‡์ธ๊ฐ€? : ๊ธˆ์•ก์„ ํ‘œํ˜„ํ•˜๋Š” ์ผ๊ธ‰ ์ปฌ๋ ‰์…˜
- ์—ญํ• 
- ๊ธˆ์•ก ์œ ํšจ์„ฑ ๋ณด์žฅ (0 ์ด์ƒ)
- ๊ธˆ์•ก ์—ฐ์‚ฐ (๋ง์…ˆ, ๊ณฑ์…ˆ, ๋‚˜๋ˆ—์…ˆ)
- BigDecimal์„ ์‚ฌ์šฉํ•œ ์ •ํ™•ํ•œ ๊ธˆ์•ก ๊ณ„์‚ฐ

## ๊ตฌ๋งค (Purchase)

- ๋ฌด์—‡์ธ๊ฐ€? : ๋กœ๋˜ ๊ตฌ๋งค ์ •๋ณด๋ฅผ ๋‹ด์€ ๊ฐ์ฒด
- ๋ฌด์—‡์ธ๊ฐ€? : ๋กœ๋˜ ๊ตฌ๋งค ์ •๋ณด์™€ ๊ธˆ์•ก ๊ณ„์‚ฐ์„ ๋‹ด๋‹นํ•˜๋Š” ๊ฐ์ฒด
- ์—ญํ• 
- ๊ตฌ๋งคํ•œ ๋กœ๋˜ ํ‹ฐ์ผ“ ๋ชฉ๋ก ๊ด€๋ฆฌ
- ํ‹ฐ์ผ“ ๊ฐœ์ˆ˜ ์กฐํšŒ
- ์ˆ˜๋™/์ž๋™ ๊ตฌ๋งค ๊ฐœ์ˆ˜ ๊ด€๋ฆฌ
- ์ด ๊ตฌ๋งค ๊ธˆ์•ก ๊ณ„์‚ฐ
- ์ˆ˜๋™ ๊ตฌ๋งค ์ˆ˜ ์œ ํšจ์„ฑ ๊ฒ€์ฆ
- ์ˆ˜์ต๋ฅ  ๊ณ„์‚ฐ

### ์„ค๊ณ„ ๊ฒฐ์ •: Money๋ฅผ Purchase์— ํ†ตํ•ฉํ•œ ์ด์œ 

๊ธฐ์กด์—๋Š” `Money`(๊ธˆ์•ก VO)์™€ `Purchase`(๊ตฌ๋งค ์ •๋ณด)๊ฐ€ ๋ถ„๋ฆฌ๋˜์–ด ์žˆ์—ˆ๋‹ค.

```
Money: "๋‚˜๋Š” ๊ธˆ์•ก์ด์•ผ. ๋”ํ•˜๊ณ , ๋นผ๊ณ , ๋น„๊ตํ•  ์ˆ˜ ์žˆ์–ด"
Purchase: "๋‚˜๋Š” Money๋ฅผ ๊ฐ–๊ณ  ์žˆ์–ด. Money์—๊ฒŒ ๋ฌผ์–ด๋ณด๊ณ  ํŒ๋‹จํ•ด"
```

**๋ฌธ์ œ์ :**
- Money๊ฐ€ ์ˆ˜๋™์ ์ธ ๊ฐ’ ๊ฐ์ฒด๋กœ๋งŒ ์กด์žฌ
- Purchase๊ฐ€ Money์—๊ฒŒ ๋ฌผ์–ด๋ณด๊ณ  ํŒ๋‹จํ•˜๋Š” ๊ตฌ์กฐ
- "์ˆ˜์ต๋ฅ "์€ "๊ธˆ์•ก์˜ ๋น„์œจ"์ด ์•„๋‹ˆ๋ผ "๊ตฌ๋งค์˜ ๊ฒฐ๊ณผ"

**๊ฐœ์„ :**
- Purchase๊ฐ€ ๊ธˆ์•ก ๊ด€๋ จ ๋กœ์ง์„ ์ง์ ‘ ๋‹ด๋‹น (๋Šฅ๋™์  ๊ฐ์ฒด)
- "๋กœ๋˜ ๊ตฌ๋งค"๋ผ๋Š” ๋„๋ฉ”์ธ ๋งฅ๋ฝ์—์„œ ์ˆ˜์ต๋ฅ  ๊ณ„์‚ฐ์ด ์ž์—ฐ์Šค๋Ÿฌ์›€
- int ํƒ€์ž…์œผ๋กœ ๋‹จ์ˆœํ™” (BigDecimal wrapper ๋ถˆํ•„์š”)

```
Purchase: "๋‚˜๋Š” ๋กœ๋˜ ๊ตฌ๋งค์•ผ. ์–ผ๋งˆ ์ผ๊ณ , ๋ช‡ ์žฅ ์ƒ€๋Š”์ง€ ์•Œ์•„. ์ˆ˜์ต๋ฅ ๋„ ๊ณ„์‚ฐํ•ด์ค„๊ฒŒ"
```

## ๋‹น์ฒจ ํ‹ฐ์ผ“ (WinningTicket)

- ๋ฌด์—‡์ธ๊ฐ€? : ๋‹น์ฒจ ๋ฒˆํ˜ธ 6๊ฐœ์™€ ๋ณด๋„ˆ์Šค๋ณผ 1๊ฐœ๋ฅผ ๋‹ด์€ ํ‹ฐ์ผ“
- ์—ญํ• 
- ๋‹น์ฒจ ๋ฒˆํ˜ธ 6๊ฐœ ๋ณด๊ด€
- ๋ณด๋„ˆ์Šค๋ณผ ๋ณด๊ด€
- ๊ตฌ๋งค ํ‹ฐ์ผ“์˜ ๋ณด๋„ˆ์Šค๋ณผ ํฌํ•จ ์—ฌ๋ถ€ ํ™•์ธ

## ๋กœ๋˜ ๊ฒŒ์ž„ (LottoGame)

- ๋ฌด์—‡์ธ๊ฐ€? : ๋‹น์ฒจ ๋ฒˆํ˜ธ์™€ ๊ตฌ๋งคํ•œ ํ‹ฐ์ผ“๋“ค์„ ๋น„๊ตํ•˜์—ฌ ๊ฒฐ๊ณผ๋ฅผ ์ƒ์„ฑํ•˜๋Š” ๊ฐ์ฒด
- ์—ญํ• 
- ๋‹น์ฒจ ๋ฒˆํ˜ธ ๋ณด๊ด€
- ๊ตฌ๋งคํ•œ ํ‹ฐ์ผ“๋“ค์˜ ๋‹น์ฒจ ๊ฒฐ๊ณผ ๊ณ„์‚ฐ
- ๊ฒŒ์ž„ ๊ฒฐ๊ณผ ์ƒ์„ฑ
- ๊ตฌ๋งค ํ‹ฐ์ผ“๊ณผ ๋น„๊ตํ•˜์—ฌ ๋“ฑ์ˆ˜(Rank) ๋ฐ˜ํ™˜

## ๋‹น์ฒจ ๋“ฑ์ˆ˜ (Rank)

Expand All @@ -72,15 +94,42 @@
- ์ผ์น˜ ๊ฐœ์ˆ˜์™€ ๋ณด๋„ˆ์Šค๋ณผ ์—ฌ๋ถ€์— ๋”ฐ๋ฅธ ๋“ฑ์ˆ˜ ํŒ์ •
- ๋“ฑ์ˆ˜๋ณ„ ๋‹น์ฒจ๊ธˆ ๊ด€๋ฆฌ
- 5๊ฐœ ์ผ์น˜ ์‹œ ๋ณด๋„ˆ์Šค๋ณผ๋กœ 2๋“ฑ/3๋“ฑ ๊ตฌ๋ถ„
- ๋‹น์ฒจ ๊ฐœ์ˆ˜์— ๋”ฐ๋ฅธ ์ด ์ƒ๊ธˆ ๊ณ„์‚ฐ

### ์„ค๊ณ„ ๊ฒฐ์ •: ์ƒ๊ธˆ ๊ณ„์‚ฐ ๋กœ์ง์„ Rank ๋‚ด๋ถ€์— ์บก์Аํ™”ํ•œ ์ด์œ 

๊ธฐ์กด์—๋Š” GameResult๊ฐ€ Rank์—๊ฒŒ prize๋ฅผ ๋ฌผ์–ด๋ณด๊ณ  ์ง์ ‘ ๊ณ„์‚ฐํ–ˆ๋‹ค.

```java
// ๊ธฐ์กด: GameResult์—์„œ ๊ณ„์‚ฐ (Ask)
entry.getKey().getPrize() * entry.getValue()
```

**๋ฌธ์ œ์ :**
- Rank๊ฐ€ prize ๊ฐ’๋งŒ ์ œ๊ณตํ•˜๋Š” ์ˆ˜๋™์  ๊ฐ์ฒด
- "์ƒ๊ธˆ ร— ๊ฐœ์ˆ˜" ๊ณ„์‚ฐ ๋กœ์ง์ด GameResult์— ๋…ธ์ถœ

**๊ฐœ์„ :**
- Rank๊ฐ€ ์ง์ ‘ ์ƒ๊ธˆ์„ ๊ณ„์‚ฐํ•˜๋„๋ก ๋ณ€๊ฒฝ (Tell, Don't Ask)

```java
// ๊ฐœ์„ : Rank์—๊ฒŒ ๊ณ„์‚ฐ ์š”์ฒญ (Tell)
entry.getKey().calculatePrize(entry.getValue())
```

- Rank๊ฐ€ ์ž์‹ ์˜ prize๋ฅผ ์•Œ๊ณ  ์žˆ์œผ๋ฏ€๋กœ, ๊ณ„์‚ฐ๋„ Rank๊ฐ€ ๋‹ด๋‹นํ•˜๋Š” ๊ฒƒ์ด ์ž์—ฐ์Šค๋Ÿฌ์›€
- GameResult๋Š” "์–ผ๋งˆ์ธ์ง€ ๊ณ„์‚ฐํ•ด์ค˜"๋ผ๊ณ  ์š”์ฒญ๋งŒ ํ•จ

## ๋กœ๋˜ ๊ฒŒ์ž„ ๊ฒฐ๊ณผ (GameResult)

- ๋ฌด์—‡์ธ๊ฐ€? : ์ „์ฒด ๋กœ๋˜ ๊ตฌ๋งค ๊ฒฐ๊ณผ (๋‹น์ฒจ ํ†ต๊ณ„, ์ˆ˜์ต๋ฅ )๋ฅผ ๋‚˜ํƒ€๋‚ด๋Š” ๊ฐ์ฒด
- ๋ฌด์—‡์ธ๊ฐ€? : ์ „์ฒด ๋กœ๋˜ ๊ตฌ๋งค ๊ฒฐ๊ณผ (๋‹น์ฒจ ํ†ต๊ณ„)๋ฅผ ๋‚˜ํƒ€๋‚ด๋Š” ๊ฐ์ฒด
- ์—ญํ• 
- ๋“ฑ์ˆ˜๋ณ„ ๋‹น์ฒจ ํ†ต๊ณ„ ๊ด€๋ฆฌ
- ์ˆ˜์ต๋ฅ  ๊ณ„์‚ฐ (๋‹น์ฒจ ๊ธˆ์•ก / ๊ตฌ์ž… ๊ธˆ์•ก)
- ์†์ต ํŒ์ • (๊ธฐ์ค€: 1.0)


- ์ด ๋‹น์ฒจ ๊ธˆ์•ก ๊ณ„์‚ฐ

## ๋žœ๋ค ๋ฒˆํ˜ธ ์ƒ์„ฑ๊ธฐ (Random)

- ๋ฌด์—‡์ธ๊ฐ€? : ๋กœ๋˜ ๋ฒˆํ˜ธ๋ฅผ ๋žœ๋ค์œผ๋กœ ์ƒ์„ฑํ•˜๋Š” ์œ ํ‹ธ๋ฆฌํ‹ฐ
- ์—ญํ• 
- 1~45 ๋ฒ”์œ„์—์„œ ์ค‘๋ณต ์—†์ด 6๊ฐœ ๋ฒˆํ˜ธ ์ƒ์„ฑ
- ์ •๋ ฌ๋œ LottoNumber ๋ฆฌ์ŠคํŠธ ๋ฐ˜ํ™˜
23 changes: 0 additions & 23 deletions src/main/java/lotto/domain/game/LottoGame.java

This file was deleted.

34 changes: 24 additions & 10 deletions src/main/java/lotto/domain/game/LottoMachine.java
Original file line number Diff line number Diff line change
@@ -1,33 +1,47 @@
package lotto.domain.game;

import java.util.ArrayList;
import java.util.List;
import lotto.domain.lotto.LottoTicket;
import lotto.domain.lotto.LottoTickets;
import lotto.domain.lotto.Money;
import lotto.domain.lotto.Purchase;

public class LottoMachine {

private static final Money DEFAULT_LOTTO_TICKET_PRICE = new Money(1_000);
private static final int DEFAULT_LOTTO_TICKET_PRICE = 1_000;

private final Money lottoTicketPrice;
private final int lottoTicketPrice;

public LottoMachine() {
this(DEFAULT_LOTTO_TICKET_PRICE);
}

public LottoMachine(Money lottoTicketPrice) {
public LottoMachine(int lottoTicketPrice) {
this.lottoTicketPrice = lottoTicketPrice;
}

public Purchase purchase(Money money) {
return new Purchase(lottoTicketPrice, generateTickets(calculate(money)));
public Purchase createPurchase(int budget, int manualCount) {
return new Purchase(budget, lottoTicketPrice, manualCount);
}

private int calculate(Money money) {
return money.divideForCount(lottoTicketPrice);
public LottoTickets generateTickets(List<String> manualTickets, int autoCount) {
List<LottoTicket> manual = convert(manualTickets);
List<LottoTicket> auto = generate(autoCount);

List<LottoTicket> allTickets = new ArrayList<>(manual);
allTickets.addAll(auto);
return new LottoTickets(allTickets);
}

LottoTickets generateTickets(int cnt) {
return new LottoTickets(cnt);
private List<LottoTicket> convert(List<String> tickets) {
return tickets.stream().map(LottoTicket::new).toList();
}

private List<LottoTicket> generate(int count) {
List<LottoTicket> tickets = new ArrayList<>();
for (int i = 0; i < count; i++) {
tickets.add(new LottoTicket(Random.generate()));
}
return tickets;
}
}
4 changes: 2 additions & 2 deletions src/main/java/lotto/domain/game/Rank.java
Original file line number Diff line number Diff line change
Expand Up @@ -32,8 +32,8 @@ public static Rank valueOf(int matched, boolean bonusMatched) {
.orElse(NONE);
}

public int getPrize() {
return prize;
public int calculatePrize(int count) {
return prize * count;
}

private static boolean isMatch(Rank rank, int matched,
Expand Down
29 changes: 5 additions & 24 deletions src/main/java/lotto/domain/lotto/LottoTickets.java
Original file line number Diff line number Diff line change
@@ -1,47 +1,28 @@
package lotto.domain.lotto;

import java.util.ArrayList;
import java.util.List;
import lotto.domain.game.Random;
import lotto.domain.result.GameResult;

public class LottoTickets {
private final List<LottoTicket> tickets;

public LottoTickets(int cnt) {
this(generate(cnt));
}

public LottoTickets(List<LottoTicket> tickets){
this.tickets = tickets;
}

private static List<LottoTicket> generate(int cnt){
List<LottoTicket> tickets = new ArrayList<>();
for (int i = 0; i < cnt; i++) {
tickets.add(new LottoTicket(Random.generate()));
}
return tickets;
}

public Money calculate(Money pricePerTicket) {
return pricePerTicket.multiply(tickets.size());
}

public GameResult updateRank(WinningTicket winningTicket) {
public GameResult match(WinningTicket winning) {
GameResult gameResult = new GameResult();
for(LottoTicket ticket : tickets){
gameResult.updateRank(winningTicket.match(ticket));
gameResult.updateRank(winning.match(ticket));
}
return gameResult;
}

@Override
public String toString(){
public String toString() {
StringBuilder sb = new StringBuilder();
sb.append(tickets.size()+"๊ฐœ๋ฅผ ๊ตฌ๋งคํ–ˆ์Šต๋‹ˆ๋‹ค.");
for (int i = 0; i < tickets.size(); i++) {
sb.append(tickets.get(i) + "\n");
for (LottoTicket ticket : tickets) {
sb.append(ticket).append("\n");
}
return sb.toString();
}
Expand Down
Loading