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

[로또] 이동원 미션 제출합니다. #1355

Open
wants to merge 6 commits into
base: main
Choose a base branch
from
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
61 changes: 60 additions & 1 deletion README.md
Original file line number Diff line number Diff line change
@@ -1 +1,60 @@
# java-lotto-precourse
# 로또

### 체크포인트

- [x] 로또 숫자 범위 상수화
- [x] 당첨 금액 상수화
- [x] 입력
- [x] 로또 구입 금액에 따른 로또 발행
- [x] 로또 1장 가격 상수화
- [x] 당첨 번호 입력
- [x] 보너스 번호 입력
- [x] 출력
- [x] 당첨 내역, 수익률 출력
- [x] 로또 객체
- [x] 로또 번호를 오름차순으로 저장
- [x] 예외 처리
- [x] 잘못된 값 입력


<br>


### 풀이 방향

문제의 조건을 위에서 부터 차례대로 만들어가면서 생각나는 대로 만든 후

리팩토링을 통해서 정돈할 생각.

1. 로또 범위, 상금과 같은 상수는 enum 으로 모두 관리

(enum 에서 _ 사용해도 되었나?)
2. 필요한 객체라 생각되는 것들

> 로또(객체), 로또번호 생성기, 내가 가지고 있을 로또 용지들, 당첨 결과 계산 할 객체
3. 로또 머신에서 랜덤 볼들을 받아서 `MyLotto` 에 채워 넣음
4. 당첨 결과를 계산하고 그 정보를 저장


### 고민 사항, 생각해볼 점

고민 1

로또를 몇가지 자동 번호를 통해서 만들었을때 그 로또 번호들을 어디에 저장해야 할지? -> 로또 머신에서 번호를 발행하고 모두 저장?

결론

최대한 작은 단위로 나누는게 정답일 것 같아서 `[로또 머신]`, `[나의 로또 현황]`, `[하나의 로또]` 로 나누기로 결정


<br>

고민2

`MyLotto` 클래스 안에 로또 용지의 정보와 당첨번호를 저장한다고 할때, 당첨 결과도 저장해야 하는가?, 너무 객체가 커지지 않나?

결론

실생활로 생각해봤을때 '나' 가 로또 용지를 가지고 있고 당첨 번호를 확인하고 결과를 내가 예측하기에 결과 연산도 `MyLotto` 안에서 이루어지고 결과도 저장하도록 결정


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


public class Application {
public static void main(String[] args) {
// TODO: 프로그램 구현

Input input = new Input();
Output output = new Output();
LottoMachine lottoMachine = new LottoMachine();

int lottoTry = input.useMoney();
Lotto winPrice = input.checkNumber();
int bonus = input.bonus();

MyLotto myLotto = new MyLotto(winPrice, bonus);

lottoMachine.action(lottoTry / 1000, myLotto);
Output.currentLottos(myLotto);

myLotto.priceResult();

output.totalPrice(myLotto.priceResult());

}

}
43 changes: 43 additions & 0 deletions src/main/java/lotto/Input.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,43 @@
package lotto;

import camp.nextstep.edu.missionutils.Console;

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

public class Input {

private static final String BUY_RESULT = "개를 구매했습니다.";
private int money;
public int useMoney() {
try {
money = Integer.parseInt(input());
if (money % 1000 == 0)
throw new IllegalArgumentException("[ERROR] : 가격은 1000 단위여야 합니다");
} catch (NumberFormatException e) {
System.out.println("[ERROR] : 올바른 가격 입력값이 아닙니다");
useMoney();
} catch (IllegalArgumentException e) {
useMoney();
}
System.out.println(money / 1000 + BUY_RESULT);
return money;
}

public Lotto checkNumber() {
String[] numbers = input().split(",");
List<Integer> balls = new ArrayList<>();
for (String number : numbers) {
balls.add(Integer.parseInt(number));
}
return new Lotto(balls);
}

private String input() {
return Console.readLine();
}

public int bonus() {
return Integer.parseInt(input());
}
}
6 changes: 5 additions & 1 deletion src/main/java/lotto/Lotto.java
Original file line number Diff line number Diff line change
@@ -1,5 +1,6 @@
package lotto;

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

public class Lotto {
Expand All @@ -14,7 +15,10 @@ private void validate(List<Integer> numbers) {
if (numbers.size() != 6) {
throw new IllegalArgumentException("[ERROR] 로또 번호는 6개여야 합니다.");
}
Collections.sort(numbers);
}

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

import camp.nextstep.edu.missionutils.Randoms;

public class LottoMachine {

static final int START_NUM = 1;
static final int END_NUM = 45;
static final int BALLS = 6;


public void action(int count, MyLotto myLotto) {
int index = 0;
while (index++ < count) {
myLotto.add(randomLottoNumbers());
}
}

private Lotto randomLottoNumbers() {
return new Lotto(Randoms.pickUniqueNumbersInRange(START_NUM, END_NUM, BALLS));
}


}
27 changes: 27 additions & 0 deletions src/main/java/lotto/LottoPrice.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,27 @@
package lotto;

public enum LottoPrice {
FIRST(6, 2000000000),
SECOND(5, 30000000),
THIRD(5, 1500000),
FOURTH(4, 50000),
FIFTH(3, 5000)
;

private final int match;
private final int price;


LottoPrice(int match, int price) {
this.match = match;
this.price = price;
}

public int getMatch() {
return match;
}

public int getPrice() {
return price;
}
}
69 changes: 69 additions & 0 deletions src/main/java/lotto/MyLotto.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,69 @@
package lotto;

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

import static lotto.LottoPrice.*;

public class MyLotto {

private final List<Lotto> lottos;
private final Lotto winPrice;
private final int bonus;
private final PriceStats priceStats;

public MyLotto(Lotto winPrice, int bonus) {
this.priceStats = new PriceStats();
this.lottos = new ArrayList<>();
this.winPrice = winPrice;
this.bonus = bonus;
}

// 이를 통해서만 데이터 추가 가능
public void add(Lotto lotto) {
lottos.add(lotto);
}

public PriceStats priceResult() {
for (Lotto lotto : lottos) {
isMatchLottoNumbers(lotto);
}
return priceStats;
}

public List<Lotto> getLottos() {
return lottos;
}

private void isMatchLottoNumbers(Lotto lotto) {
int cnt = 0;
for (Integer number : winPrice.getNumbers()) {
if (lotto.getNumbers().contains(number)) {
cnt++;
}
}
if (cnt == FIRST.getMatch()) {
priceStats.add(4);
return;
}
if (cnt == SECOND.getMatch()) {
isBonusNumber(lotto);
return;
}
if (cnt == FOURTH.getMatch()) {
priceStats.add(1);
return;
}
if (cnt == FIFTH.getMatch()) {
priceStats.add(0);
}
}

private void isBonusNumber(Lotto lotto) {
if (lotto.getNumbers().contains(bonus)) {
priceStats.add(3);
return;
}
priceStats.add(2);
}
}
29 changes: 29 additions & 0 deletions src/main/java/lotto/Output.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,29 @@
package lotto;

import java.time.LocalDate;
import java.util.stream.Collectors;

public class Output {
static final String FIFTH = "3개 일치 (5,000원) - ";
static final String FOURTH = "4개 일치 (50,000원) - 개";
static final String THIRD = "5개 일치 (1,500,000원) - 개";
static final String SECOND = "5개 일치, 보너스 볼 일치 (30,000,000원) - 개";
static final String FIRST = "6개 일치 (2,000,000,000원) - 개";
public static void currentLottos(MyLotto myLotto) {
for (Lotto lotto : myLotto.getLottos()) {
String balls = lotto.getNumbers().stream()
.map(String::valueOf)
.collect(Collectors.joining(", "));
System.out.println("[" + balls + "]");
}
System.out.println();
}

public void totalPrice(PriceStats priceStats) {
System.out.println(FIFTH + priceStats.get(0) + "개");
System.out.println(FOURTH + priceStats.get(1) + "개");
System.out.println(THIRD + priceStats.get(2) + "개");
System.out.println(SECOND + priceStats.get(3) + "개");
System.out.println(FIRST + priceStats.get(4) + "개");
}
}
26 changes: 26 additions & 0 deletions src/main/java/lotto/PriceStats.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,26 @@
package lotto;

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

public class PriceStats {
private final List<Integer> status;

public PriceStats() {
status = new ArrayList<>(5);
Collections.fill(status, 0);
}

public void add(int index) {
status.set(index, status.get(index) + 1);
}

public List<Integer> getStatus() {
return status;
}

public Integer get(int i) {
return status.get(i);
}
}