Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
23 commits
Select commit Hold shift + click to select a range
8f26937
docs: 구현할 기능 목록 작성
tjdakf Jan 10, 2026
9ce16ae
feat: 로또 구입 금액 입력 기능 추가
tjdakf Jan 10, 2026
f880e42
feat: 구입 금액이 로또 금액 단위와 맞는지 확인하는 기능 추가
tjdakf Jan 10, 2026
dddf266
feat: 로또 구입 수량을 계산한다.
tjdakf Jan 10, 2026
c9c1035
feat: 로또 구입 수량만큼 반복한다
tjdakf Jan 10, 2026
196abed
feat: 랜덤 번호로 로또를 생성한다.
tjdakf Jan 10, 2026
dca1e93
feat: 생성한 로또를 저장한다.
tjdakf Jan 10, 2026
50fce69
feat: 구매한 로또를 출력한다
tjdakf Jan 10, 2026
ddb363e
refactor: 메서드 정리
tjdakf Jan 10, 2026
f7c9f04
feat: 당첨 번호 입력 및 재입력 기능 구현
tjdakf Jan 10, 2026
9ba0e20
feat: 입력된 번호를 저장한다.
tjdakf Jan 10, 2026
c8e46d0
feat: 입력된 번호가 5개가 맞는지 검증한다.
tjdakf Jan 10, 2026
28eba4c
feat: 입력된 번호 숫자 범위 검증
tjdakf Jan 10, 2026
6860fab
feat: 입력된 번호 숫자 중복 검증
tjdakf Jan 10, 2026
bd53e6e
refactor: 당첨 번호 입력 리팩터링
tjdakf Jan 10, 2026
25a049a
feat: 보너스 번호 입력 및 재입력 기능 추가
tjdakf Jan 10, 2026
77a4b3c
feat: 보너스 번호 중복 검증
tjdakf Jan 10, 2026
cac1ce0
refactor: 보너스 입력 기능 리팩터링
tjdakf Jan 10, 2026
d78403c
feat: 로또와 당첨번호를 비교하여 일치 수 계산 기능 추가
tjdakf Jan 10, 2026
a493c3d
feat: 등수 계산 기능 추가
tjdakf Jan 10, 2026
e142184
feat: 등수 출력 기능 구현
tjdakf Jan 10, 2026
0630376
feat: 출렬 정렬 기능 추가
tjdakf Jan 10, 2026
fd386a9
feat: 보너스 번호 범위 검증 기능 추가
tjdakf Jan 10, 2026
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
92 changes: 92 additions & 0 deletions README.md
Original file line number Diff line number Diff line change
@@ -1 +1,93 @@
# java-planetlotto-precourse

## 참고
로또 번호 숫자 범위
- 1 ~ 30

1개 로또
- 중복되지 않는 5개의 숫자

당첨 번호 추첨
- 중복되지 않는 숫자 5개 + 보너스 번호 1 개

당첨 기준
1등 / 5개 일치 / 100,000,000
2등 / ...

예외 처리
- 메세지 출력 후 해당 부분부터 다시 입력
- [ERROR] 로또 번호는 1부터 30 사이의 숫자여야 합니다.


## 구현할 기능 목록

### 구입 금액 입력
- [x] 예외가 발생하면 로또 구입 금액 입력부터 재실행 한다.


입력
- [x] 로또 구입 금액을 입력받는다. // int


비즈니스
- [x] 금액이 500원 단위가 맞는지 확인한다.
- [x] 500원 단위가 아니면 예외가 발생한다.
- [x] 로또 구입 수량을 계산한다. 금액 / 500

### 로또 발행
비즈니스
- [x] 로또 구입 수량만큼 반복한다.
- [x] 랜덤 번호를 생성한다. List<로또번호>
- [x] 로또를 생성한다.
- [x] 로또를 저장한다.


출력
- [x] 구매한 로또를 출력한다 //
입력 요구 -> List<List<Integer>> lottos

### 당첨 번호 입력
- [x] 예외가 발생하면 당첨 번호 입력부터 재실행한다.


입력
- [x] 당첨 번호를 입력받는다. // List<Integer>


비즈니스
- [x] 입력된 당첨 번호가 5개인지 검증한다.
- [x] 입력된 당첨 번호가 1~30 사이의 숫자인지 검증한다.
- [x] 입력된 당첨 번호가 중복이 없는지 검사한다.
- [x] 입력된 번호를 저장한다. // WinningLotto(List<당첨로또>, 보너스번호)

### 보너스 번호 입력
- [x] 예외가 발생하면 보너스 번호 입력부터 재실행한다.


입력
- [x] 보너스 번호를 입력받는다. // int


비즈니스
- [x] 보너스 번호가 당첨번호와 중복되지 않는지 검증
- [x] 입력된 번호를 저장한다.

### 당첨 통계 출력
비즈니스
- [x] 로또와 당첨번호의 결과를 비교하여 등수를 반환한다.
- [x] 구매한 로또의 등수를 계산한다.
- [x] 등수를 저장한다.
- [x] 결과를 출력한다.
입력 요구 -> Map<등수, 당첨개수> countsByRank

### 추가
- [x] 출력 정렬 필요함
- [x] 보너스 번호 검증 안되고 있음. // LottoPolicy에서 체크 어떤지?

도메인
- Lotto // 로또, 로또에 사용하는 숫자 검증
- WinningLotto // 당첨로또, 보너스 번호
- LottoGenerator // 로또 생성, List<로또 번호>
- PurchasedLotto // List<Lotto>
- LottoService //
- LottoPolicy // 구매금액 확인, 등수 계산
14 changes: 13 additions & 1 deletion src/main/java/planetlotto/Application.java
Original file line number Diff line number Diff line change
@@ -1,7 +1,19 @@
package planetlotto;

import planetlotto.controller.LottoController;
import planetlotto.domain.*;
import planetlotto.service.LottoService;

public class Application {
public static void main(String[] args) {
// TODO: 프로그램 구현
LottoPolicy policy = new LottoPolicy();
LottoGenerator generator = new RandomLottoGenerator();
PurchasedLotto purchased = new PurchasedLotto();
WinningLotto winning = new WinningLotto();

LottoService service = new LottoService(policy, generator, purchased, winning);

LottoController controller = new LottoController(service);
controller.run();
}
}
77 changes: 77 additions & 0 deletions src/main/java/planetlotto/controller/LottoController.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,77 @@
package planetlotto.controller;

import planetlotto.service.LottoService;
import planetlotto.view.InputView;
import planetlotto.view.OutputView;

import java.util.List;

public class LottoController {
private LottoService service;

public LottoController(LottoService service) {
this.service = service;
}

public void run() {
purchaseLottos();

setWinningNumbers();
setBonus();

OutputView.printResult(service.aggregateRank());
}

private void setBonus() {
while (true) {
try {
int bonus = InputView.askBonusNumber();
OutputView.printLienSeparator();
service.setBonus(bonus);
} catch (IllegalArgumentException e) {
OutputView.printErrorMessage(e.getMessage());
continue;
}
break;
}
}

private void setWinningNumbers() {
while (true) {
try {
List<Integer> winningNumbers = InputView.askWinningLotto();
OutputView.printLienSeparator();
service.setWinningNumbers(winningNumbers);
} catch (IllegalArgumentException e) {
OutputView.printErrorMessage(e.getMessage());
continue;
}
break;
}
}

private void purchaseLottos() {
int amount = getAmount();
int purchaseQuantity = service.getPurchaseQuantity(amount);

for (int i = 0; i < purchaseQuantity; i++) {
service.generateLotto();
}
OutputView.printPurchasedLottos(service.getPurchasedLottos());
}

private int getAmount() {
int amount;
while (true) {
try {
amount = InputView.askAmount();
OutputView.printLienSeparator();
service.validateAmount(amount);
} catch (IllegalArgumentException e) {
OutputView.printErrorMessage(e.getMessage());
continue;
}
return amount;
}
}
}
43 changes: 43 additions & 0 deletions src/main/java/planetlotto/domain/Lotto.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,43 @@
package planetlotto.domain;

import java.util.HashSet;
import java.util.List;

public class Lotto {
private List<Integer> numbers;

public Lotto(List<Integer> numbers) {
this.numbers = numbers;
validateNumbers();
}

public List<Integer> getNumbers() {
return numbers;
}

private void validateNumbers() {
// 숫자 5개 검증
if (numbers.size() != 5) {
throw new IllegalArgumentException("로또 숫자는 5개여야 합니다.");
}

// 숫자 범위 검증
for (Integer number : numbers) {
if (number < 1 || number > 30) {
throw new IllegalArgumentException("로또 번호는 1부터 30 사이의 숫자여야 합니다.");
}
}

// 중복 검증
if (numbers.size() != new HashSet<>(numbers).size()) {
throw new IllegalArgumentException("중복된 숫자 입력은 허용되지 않습니다.");
}
}

@Override
public String toString() {
return "Lotto{" +
"numbers=" + numbers +
'}';
}
}
5 changes: 5 additions & 0 deletions src/main/java/planetlotto/domain/LottoGenerator.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,5 @@
package planetlotto.domain;

public interface LottoGenerator {
Lotto generate();
}
27 changes: 27 additions & 0 deletions src/main/java/planetlotto/domain/LottoPolicy.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,27 @@
package planetlotto.domain;

public class LottoPolicy {
private static final int LOTTO_PRICE = 500;

public boolean isCorrectUnit(int amount) {
return amount % LOTTO_PRICE == 0;
}

public int getPurchaseQuantity(int amount) {
return amount / LOTTO_PRICE;
}

public int determineRank(WinningLotto winning, Lotto lotto) {
int count = winning.compareWithWinning(lotto);
if (count == 5) return 1;
if (count == 4) {
if (winning.hasBonus(lotto)) {
return 2;
}
return 3;
}
if (count == 3 && winning.hasBonus(lotto)) return 4;
if (count == 2) return 5;
return 0;
}
}
28 changes: 28 additions & 0 deletions src/main/java/planetlotto/domain/PurchasedLotto.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,28 @@
package planetlotto.domain;

import java.util.ArrayList;
import java.util.List;

public class PurchasedLotto {
private List<Lotto> lottos = new ArrayList<>();

public void addLotto(Lotto lotto) {
lottos.add(lotto);
}

public List<List<Integer>> getLottostoList() {
List<List<Integer>> resultLottos = new ArrayList<>();
for (Lotto lotto : lottos) {
resultLottos.add(
lotto.getNumbers().stream()
.sorted(Integer::compareTo)
.toList()
);
}
return resultLottos;
}

public List<Lotto> getLottos() {
return lottos;
}
}
11 changes: 11 additions & 0 deletions src/main/java/planetlotto/domain/RandomLottoGenerator.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,11 @@
package planetlotto.domain;

import camp.nextstep.edu.missionutils.Randoms;

public class RandomLottoGenerator implements LottoGenerator {

@Override
public Lotto generate() {
return new Lotto(Randoms.pickUniqueNumbersInRange(1, 30, 5));
}
}
36 changes: 36 additions & 0 deletions src/main/java/planetlotto/domain/WinningLotto.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,36 @@
package planetlotto.domain;

import java.util.List;

public class WinningLotto {
private Lotto winning;
private int bonus;

public void setWinning(List<Integer> winningNumbers) {
this.winning = new Lotto(winningNumbers);
}

public void setBonus(int bonus) {
if (bonus < 1 || bonus > 30) {
throw new IllegalArgumentException("보너스 번호는 1부터 30 사이의 숫자여야 합니다.");
}

if (winning.getNumbers().contains(bonus)) {
throw new IllegalArgumentException("보너스 번호는 당첨 번호와 중복될 수 없습니다.");
}
}

public int compareWithWinning(Lotto lotto) {
int count = 0;
for (Integer numbers : lotto.getNumbers()) {
if (winning.getNumbers().contains(numbers)) {
count++;
}
}
return count;
}

public boolean hasBonus(Lotto lotto) {
return lotto.getNumbers().contains(bonus);
}
}
Loading