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

[로또] 김태우 미션 제출합니다. #385

Open
wants to merge 4 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
25 changes: 25 additions & 0 deletions README.md
Original file line number Diff line number Diff line change
@@ -1 +1,26 @@
# javascript-lotto-precourse

## 기능 요구 사항
1. 로또 번호의 숫자 범위는 1~45까지이다.
2. 1개의 로또를 발행할 때 중복되지 않는 6개의 숫자를 뽑는다.
3. 당첨 번호 추첨 시 중복되지 않는 숫자 6개와 보너스 번호 1개를 뽑는다.
4. 당첨은 1등부터 5등까지 있다. 당첨 기준과 금액은 아래와 같다.
- 1등: 6개 번호 일치 / 2,000,000,000원
- 2등: 5개 번호 + 보너스 번호 일치 / 30,000,000원
- 3등: 5개 번호 일치 / 1,500,000원
- 4등: 4개 번호 일치 / 50,000원
- 5등: 3개 번호 일치 / 5,000원
5. 로또 구입 금액을 입력하면 구입 금액에 해당하는 만큼 로또를 발행해야 한다.
6. 로또 1장의 가격은 1,000원이다.
7. 당첨 번호와 보너스 번호를 입력받는다.
8. 사용자가 구매한 로또 번호와 당첨 번호를 비교하여 당첨 내역 및 수익률을 출력하고 로또 게임을 종료한다.
9. 사용자가 잘못된 값을 입력할 경우 "[ERROR]"로 시작하는 메시지와 함께 Error를 발생시키고 해당 메시지를 출력한 다음 해당 지점부터 다시 입력을 받는다.

## 구현 기능
### 입력
1. 구입금액 입력
2. 당첨 번호 및 보너스 번호 입력
### 출력
1. 구매한 로또 매수 출력
2. 각 로또 별 선택된 번호 출력
3. 당첨 통계 출력 및 수익률 출력
28 changes: 27 additions & 1 deletion src/App.js
Original file line number Diff line number Diff line change
@@ -1,5 +1,31 @@
import { Console, Random } from "@woowacourse/mission-utils";
import Lotto from "./Lotto.js";
import { howManyLotto, getWinNumber, getBonusNumber } from "./Input.js";

class App {
async run() {}
async run() {
const results = [0, 0, 0, 0, 0];
const lottoArray = await howManyLotto();
const winNumbers = await getWinNumber();
const bonusNum = await getBonusNumber(winNumbers);

for (const numbers of lottoArray) {
const matchCount = Lotto.getMatchedCount(numbers, winNumbers);
const numInArray = numbers.getNumbers();
const isBonusMatched = numInArray.includes(parseInt(bonusNum, 10));
if (matchCount === 5 && isBonusMatched) results[1] += 1; // 2등
if (matchCount === 6) results[0] += 1; // 1등
if (matchCount >= 3 && matchCount !== 5) results[matchCount - 3] += 1; // 3등, 4등, 5등
}
Console.print(" ");
Console.print("당첨 통계\n---");
Console.print("5등: 3개 번호 일치 / 5,000원 - " + results[4] + "개");
Console.print("4등: 4개 번호 일치 / 50,000원 - " + results[3] + "개");
Console.print("3등: 5개 번호 일치 / 1,500,000원 - " + results[2] + "개");
Console.print("2등: 5개 번호 + 보너스 번호 일치 / 30,000,000원 - " + results[1] + "개");
Console.print("1등: 6개 번호 일치 / 2,000,000,000원 - " + results[0] + "개");

}
}

export default App;
59 changes: 59 additions & 0 deletions src/Input.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,59 @@
import {Console, Random} from '@woowacourse/mission-utils';
import Lotto from "./Lotto.js";

export async function howManyLotto() {
while (true) { // 유효한 입력을 받을 때까지 반복
try {
const budget = await Console.readLineAsync("구입금액을 입력해 주세요.\n");
if ((budget % 1000) !== 0 || isNaN(budget) || budget <= 0) {
throw new Error("[ERROR] 로또는 1000원 단위로 한장 씩 구매할 수 있습니다.\n");
}
const lottoArray = chosenNumbers(budget / 1000);
return lottoArray;
}
catch (error) {
Console.print(error.message); // 에러 메시지 출력
}
}
}


async function chosenNumbers(howMany) {
Console.print(" ");
Console.print(howMany +"개를 구매했습니다.\n");
let numbers = [];
const chosenNumbersArray = [];
for (let i = 0; i < howMany; i++) {
numbers[i] = Random.pickUniqueNumbersInRange(1, 45, 6);
Console.print("[" + numbers[i].join(', ') + "]");
chosenNumbersArray[i] = new Lotto(numbers[i]);
}

return chosenNumbersArray;
}

export async function getWinNumber() {
Console.print(" ");
let winNumbers = await Console.readLineAsync("당첨 번호를 입력해 주세요.\n");
winNumbers = winNumbers.split(',').map(num => Number(num.trim())); // 문자열을 숫자로 변환

// 유효성 검사
const uniqueNumbers = new Set(winNumbers); // 중복 제거된 숫자 집합 생성
if (winNumbers.length !== 6 || uniqueNumbers.size !== 6 || winNumbers.some(num => isNaN(num) || num < 1 || num > 45)) {
throw new Error("[ERROR] 당첨 번호는 1부터 45 사이의 중복되지 않은 숫자 6개여야 합니다.");
}

return winNumbers;
}


export async function getBonusNumber(winNumbers) {
Console.print(" ");
const bonusNum = await Console.readLineAsync("보너스 번호를 입력해 주세요.\n");

if (winNumbers.includes(Number(bonusNum))) {
throw new Error(`[ERROR] 보너스 번호 ${bonusNum}은 당첨 번호에 포함되어 있습니다.`);
}

return Number(bonusNum);
}
15 changes: 13 additions & 2 deletions src/Lotto.js
Original file line number Diff line number Diff line change
Expand Up @@ -10,9 +10,20 @@ class Lotto {
if (numbers.length !== 6) {
throw new Error("[ERROR] 로또 번호는 6개여야 합니다.");
}
const uniqueNumbers = new Set(numbers);
if (uniqueNumbers.size !== 6) {
throw new Error("[ERROR] 로또 번호는 중복되지 않아야 합니다."); }
}

// TODO: 추가 기능 구현
}
getNumbers() {
return this.#numbers;
}

static getMatchedCount(numbers, winNumbers) {
let numbersToArray = numbers.getNumbers();
return numbersToArray.filter(num => winNumbers.includes(num)).length;
}


}
export default Lotto;