Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
28 commits
Select commit Hold shift + click to select a range
5c3bf57
docs: 기능 구현을 위한 역할 분배 문서 작성
SISUinSea Sep 3, 2024
3bf5048
docs: README.md에 구현 목록 정리
SISUinSea Sep 8, 2024
2066acb
docs(readme): 구현 객체 추가
SISUinSea Sep 11, 2024
7b760a1
docs(readme): 구현 객체 추가
SISUinSea Sep 11, 2024
5cd79a0
feat(Lotto): 로또 번호 생성 기능 추가
SISUinSea Sep 13, 2024
fe8e3f2
Merge remote-tracking branch 'origin/main'
SISUinSea Sep 13, 2024
278724a
feat(Deposit): 로또 구입 금액을 입력받아 저장하는 기능 구현
SISUinSea Sep 13, 2024
d02a4c4
fix(Lotto): Constructor Arguments로 로또 번호를 넘겨받아 생성하도록 코드 수정
SISUinSea Sep 13, 2024
fa63588
docs: Model 구현사항 목록 재작성
SISUinSea Sep 19, 2024
773000e
refactor(Amount): Deposit 클래스 Amount로 이름 변경
SISUinSea Sep 19, 2024
5cff2bd
feat(MyLottos): 사용자의 로또를 발행하는 기능 구현
SISUinSea Sep 19, 2024
c03a32f
docs: 예외처리 구현사항 수정, Result 구현사항 추가
SISUinSea Sep 20, 2024
7e773b0
feat(WinningNumbers): 당첨 번호와 보너스 번호를 저장하는 기능 추가
SISUinSea Sep 20, 2024
b04e465
feat(Result): 로또 결과값을 계산하는 기능 추가
SISUinSea Sep 20, 2024
eda508a
feat(Lotto): 로또 번호를 반환하는 기능 추가
SISUinSea Sep 20, 2024
7e13845
docs: View 구현 사항 정리
SISUinSea Sep 20, 2024
4b32c48
feat(MyLottos): 구입한 로또 개수를 반환하는 기능 추가
SISUinSea Sep 21, 2024
9c89c64
rename(Result): getRankResult() 메소드 이름을 getRank()로 수정
SISUinSea Sep 21, 2024
34302e2
feat(OutputView): 요구 형식에 맞게 출력하는 기능 추가
SISUinSea Sep 21, 2024
dc1a1e2
feat(InputView): 사용자에게 입력값을 입력받는 기능 구현
SISUinSea Sep 21, 2024
62f9a97
fix(View): 인스턴스 생성 없이 메소드에 접근할 수 있게끔 static 키워드 메소드에 추가
SISUinSea Sep 21, 2024
811859e
feat(Controller): 전체 기능을 동작하게 하는 기능 추가
SISUinSea Sep 21, 2024
60db71d
feat(Controller): 예외 상황 발생 시 예외 문구 출력하는 기능 추가
SISUinSea Sep 21, 2024
2f30c4b
feat: 예외상황 문구 출력 기능 추가
SISUinSea Sep 22, 2024
ba4fe85
fix(MyLottos): 에러 발생 원인 코드 수정
SISUinSea Sep 22, 2024
eb4eafd
fix(OutputView): 출력 형시게 맞도록 띄어쓰기 삭제
SISUinSea Sep 22, 2024
64312d0
fix(ApplicationTest): 에러 메시지 수정
SISUinSea Sep 22, 2024
cc97708
feat(Application): 어플리케이션 코드 추가
SISUinSea Sep 22, 2024
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
41 changes: 41 additions & 0 deletions docs/README.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,41 @@
# Model
## Amount
- [x] 로또 구입 금액을 저장하는 객체
- [x] 예외 처리 : 잘못된 입력값이 들어왔을 때 IllegalArgumentException을 발생시킨다.
- [x] 입력값이 1,000원으로 나누어 떨어지지 않았을 때 IllegalArgumentException를 발생시킨다.
- [x] 당첨 번호 숫자가 1 ~ 45 사이의 숫자가 아닌 경우 IllegalArgumentException를 발생시킨다.


## MyLottos
- [x] 로또들을 구입 금액에 맞게 구매하는 객체
- [x] 로또 번호들을 오름차순으로 정렬한다.

## WinningNumbers
- [x] 당첨 번호, 보너스 번호를 저장하는 객체
- [x] 예외 처리 : 잘못된 입력값이 들어왔을 때 IllegalArgumentException을 발생시킨다.
- [x] 보너스 번호가 당첨 번호와 중복될 경우 IllegalArgumentException를 발생시킨다.
- [x] 당첨 번호들 중 1보다 작거나 45보다 큰 수가 있을 때 IllegalArgumentException을 발생시킨다.
- [x] 보너스 번호가 1보다 작거나 45보다 클 때 IllegalArgumentException을 발생시킨다.

## Result
- [x] 당첨 번호, 보너스 번호와 구매한 로또들을 비교해서 결과를 계산하는 객체
- [x] WinningNumbers와 Lotto를 비교해서 맞은 개수를 계산
- [x] bonusNumber와 Lotto를 비교해서 bonusNumber가 존재하는지 확인
- [x] 맞은 개수와 bonuse가 맞았는지를 통해서 로또가 몇 등인지 확인
- [x] 해당하는 등수의 상금을 더하기
- [x] 수익률을 계산하기

# View
## OutputView
- [x] 구매한 로또들의 번호를 출력
- [x] 당첨 통계를 출력


## InputView
- [x] 로또 구입 금액을 입력
- [x] 당첨 번호를 입력
- [x] 보너스 번호를 입력
- [x] 예외 처리 : 잘못된 입력값이 들어왔을 때 IllegalArgumentException을 발생시킨다.
- [x] 숫자가 아닌 값을 입력했을 때


5 changes: 4 additions & 1 deletion src/main/java/lotto/Application.java
Original file line number Diff line number Diff line change
@@ -1,7 +1,10 @@
package lotto;

import lotto.controller.Controller;

public class Application {
public static void main(String[] args) {
// TODO: 프로그램 구현
Controller controller = new Controller();
controller.run();
}
}
20 changes: 17 additions & 3 deletions src/main/java/lotto/Lotto.java
Original file line number Diff line number Diff line change
@@ -1,20 +1,34 @@
package lotto;

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

public class Lotto {
private final List<Integer> numbers;
private List<Integer> numbers;

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

private void validate(List<Integer> numbers) {
validateArgumentIsNotOversized(numbers);
validateNumbersAreUnique(numbers);
}
private void validateArgumentIsNotOversized(List<Integer> numbers) {
if (numbers.size() != 6) {
throw new IllegalArgumentException();
throw new IllegalArgumentException("로또 번호는 6개여야 합니다.");
}
}
private void validateNumbersAreUnique(List<Integer> numbers) {
Set<Integer> numbersSet = new HashSet<>(numbers);
if (numbersSet.size() != numbers.size()) {
throw new IllegalArgumentException("로또 번호는 모두 다른 숫자들로 구성되어야 합니다.");
}
}

// TODO: 추가 기능 구현
public List<Integer> getNumbers() {
return numbers;
}
}
55 changes: 55 additions & 0 deletions src/main/java/lotto/controller/Controller.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,55 @@
package lotto.controller;

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

import lotto.model.Amount;
import lotto.model.MyLottos;
import lotto.model.Result;
import lotto.model.WinningNumbers;
import lotto.view.InputView;
import lotto.view.OutputView;

public class Controller {
enum ProgressState {
START,
INPUT_PURCHASE_AMOUNT,
INPUT_WINNING_NUMBERS,
INPUT_BONUS_NUMBER,
DONE
};
public void run() {
ProgressState progressState = ProgressState.START;
Amount amount = new Amount(0);
MyLottos myLottos = new MyLottos(0);
WinningNumbers winningNumbers;
List<Integer> winningNumberList = new ArrayList<>();
int bonusNumber;


while (progressState != ProgressState.DONE) {
try {
if (progressState == ProgressState.START) {
int purchaseAmount = InputView.getPurchaseAmount();
amount = new Amount(purchaseAmount);
myLottos = new MyLottos(purchaseAmount);
OutputView.printMyLottosNumbers(myLottos);
progressState = ProgressState.INPUT_PURCHASE_AMOUNT;
}
if (progressState == ProgressState.INPUT_PURCHASE_AMOUNT) {
winningNumberList = InputView.getWinningNumbers();
progressState = ProgressState.INPUT_WINNING_NUMBERS;
}
if (progressState == ProgressState.INPUT_WINNING_NUMBERS) {
bonusNumber = InputView.getBonusNumber();
winningNumbers = new WinningNumbers(winningNumberList, bonusNumber);
Result result = new Result(winningNumbers, myLottos, amount);
OutputView.printTotalStatus(result);
progressState = ProgressState.DONE;
}
} catch (IllegalArgumentException e) {
System.out.println("[ERROR] " + e.getMessage());
}
}
}
}
20 changes: 20 additions & 0 deletions src/main/java/lotto/model/Amount.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,20 @@
package lotto.model;

public class Amount {
private int value;

public Amount(int value) {
validateArgumentIsDividedTo1000(value);
this.value = value;
}

private void validateArgumentIsDividedTo1000(int value) {
if (value % 1000 != 0) {
throw new IllegalArgumentException("1,000원 단위의 금액을 입력해주세요.");
}
}

public int getValue() {
return value;
}
}
39 changes: 39 additions & 0 deletions src/main/java/lotto/model/MyLottos.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,39 @@
package lotto.model;

import lotto.Lotto;

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

import camp.nextstep.edu.missionutils.Randoms;

public class MyLottos {
private int count;
private List<Lotto> myLottos = new ArrayList<>();

public MyLottos(int value) {
// create count using amount value
this.count = value / 1000;
// count 만큼의 로또 발행
for (int i = 0; i < count; i++) {
myLottos.add(makeLotto());
}
}

private Lotto makeLotto() {
List<Integer> numbers = Randoms.pickUniqueNumbersInRange(1, 45, 6);
List<Integer> lottoNumbers = new ArrayList<>(numbers);
Collections.sort(lottoNumbers);
Lotto lotto = new Lotto(lottoNumbers);

return lotto;
}

public List<Lotto> getLottos() {
return myLottos;
}
public int getLottoCount() {
return count;
}
}
84 changes: 84 additions & 0 deletions src/main/java/lotto/model/Result.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,84 @@
package lotto.model;

import java.util.Set;
import java.util.List;

import lotto.Lotto;

import java.util.HashSet;

public class Result {
int[] rank;
long totalWinningPrize;
double rateOfReturn;

public Result(WinningNumbers winningNumbers, MyLottos myLottos, Amount amount) {
rank = new int[5 + 1];
totalWinningPrize = 0;
for (Lotto myLotto : myLottos.getLottos()) {
int matchCount = getMatchCount(winningNumbers.getWinningNumbers(), myLotto.getNumbers());
boolean doesLottoContainBonusNumber = checkIfLottoContainsBonusNumber(winningNumbers.getBonusNumber(), myLotto.getNumbers());
computeRankAndWinningPrize(matchCount, doesLottoContainBonusNumber);
computeRateOfReturn(amount.getValue());
}
}
private int getMatchCount(List<Integer> winningNumbers, List<Integer> lottoNumbers) {
int count = 0;
Set<Integer> winningNumbersSet = new HashSet<>(winningNumbers);
for (int lottoNumber : lottoNumbers) {
if (winningNumbersSet.contains(lottoNumber)) {
count ++;
}
}

return count;
}
private boolean checkIfLottoContainsBonusNumber(int bonusNumber, List<Integer> myLottoNumbers) {
boolean isContained = false;
for (int lottoNumber : myLottoNumbers) {
if (bonusNumber == lottoNumber) {
isContained = true;
break;
}
}

return isContained;
}
private void computeRankAndWinningPrize(int matchCount, boolean doesLottoContainBonusNumber) {
if (matchCount == 6) {
rank[1] ++;
totalWinningPrize += 2_000_000_000L;
return;
}
if (matchCount == 5 && doesLottoContainBonusNumber) {
rank[2] ++;
totalWinningPrize += 30_000_000L;
return;
}
if (matchCount == 5) {
rank[3] ++;
totalWinningPrize += 1_500_000L;
return;
}
if (matchCount == 4) {
rank[4] ++;
totalWinningPrize += 50_000L;
return;
}
if (matchCount == 3) {
rank[5] ++;
totalWinningPrize += 5_000L;
return;
}
}
private void computeRateOfReturn(int value) {
this.rateOfReturn = (this.totalWinningPrize / (double) value) * 100;
}

public int[] getRank() {
return rank;
}
public double getRateOfReturn() {
return rateOfReturn;
}
}
54 changes: 54 additions & 0 deletions src/main/java/lotto/model/WinningNumbers.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,54 @@
package lotto.model;

import java.util.List;

import lotto.Lotto;

public class WinningNumbers {
private Lotto winningLotto;
private int bonusNumber;

public WinningNumbers(List<Integer> winningNumbers, int bonusNumber) {

this.winningLotto = new Lotto(winningNumbers);
validate(winningNumbers, bonusNumber);

this.bonusNumber = bonusNumber;

}


private void validate(List<Integer> winningNumbers, int bonusNumber) {
validateWinningNumbersOnlyContainNumberBetween1To45(winningNumbers);
validateWinningNumbersNotContainBonusNumber(winningNumbers, bonusNumber);
validateBonusNumberIsBetween1To45(bonusNumber);

}
private void validateWinningNumbersOnlyContainNumberBetween1To45(List<Integer> winningNumbers) {
for (int number : winningNumbers) {
if (number < 1 || number > 45) {
throw new IllegalArgumentException("로또 번호는 1부터 45 사이의 숫자여야 합니다.");
}
}
}
private void validateWinningNumbersNotContainBonusNumber(List<Integer> winningNumbers, int bonusNumber) {
for (int number : winningNumbers) {
if (bonusNumber == number) {
throw new IllegalArgumentException("보너스 번호는 당첨 번호와 달라야 합니다.");
}
}
}
private void validateBonusNumberIsBetween1To45(int bonusNumber) {
if (bonusNumber < 1 || bonusNumber > 45) {
throw new IllegalArgumentException("보너스 번호는 1부터 45 사이의 숫자여야 합니다.");
}
}

public List<Integer> getWinningNumbers() {
return winningLotto.getNumbers();
}

public int getBonusNumber() {
return bonusNumber;
}
}
46 changes: 46 additions & 0 deletions src/main/java/lotto/view/InputView.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,46 @@
package lotto.view;

import java.util.List;
import java.util.ArrayList;
import camp.nextstep.edu.missionutils.Console;


public class InputView {
public static int getPurchaseAmount() {
System.out.println("구입금액을 입력해 주세요.");
String inputString = Console.readLine();
int purchaseAmount;
try {
purchaseAmount = Integer.valueOf(inputString);
} catch (NumberFormatException e) {
throw new IllegalArgumentException("로또 번호는 1부터 45 사이의 숫자여야 합니다.");
}

return purchaseAmount;
}
public static List<Integer> getWinningNumbers() {
System.out.println("당첨 번호를 입력해 주세요.");
String inputString = Console.readLine();
String[] stringElements = inputString.split(",");

List<Integer> result = new ArrayList<>();
for (String stringElement : stringElements) {
try {
result.add(Integer.valueOf(stringElement));
} catch (NumberFormatException e) {
throw new IllegalArgumentException("로또 번호는 1부터 45 사이의 숫자여야 합니다.");
}
}

return result;
}
public static int getBonusNumber() {
System.out.println("보너스 번호를 입력해 주세요.");
String inputString = Console.readLine();
try {
return Integer.valueOf(inputString);
} catch (NumberFormatException e ) {
throw new IllegalArgumentException("로또 번호는 1부터 45 사이의 숫자여야 합니다.");
}
}
}
Loading