diff --git a/README.md b/README.md index b168a180..7e5afe2f 100644 --- a/README.md +++ b/README.md @@ -1 +1,65 @@ # javascript-planetlotto-precourse + +# 최종테스트 (행성 로또) + +- [ ] README.md에 국현할 기능 목록과 도전 목표 작성하기 +- [ ]기능 요구사항 + +- 기능 요구사항에 기재되지 않은 내용은 스스로 판단하여 구현한다. +- [ ] 프로그래밍 요구사항 +- [ ] 도전과제 + +과제 제출 전 체크리스트 + +- [ ] 요구된 사항에 명시된 출력 형식을 따랐나 +- [ ] 기능 구현을 완료한 후 아래 가이드에 따라 모든 테스트가 성공적으로 실행되 는지 확인한다. +- [ ] 테스트 성공했는지 확인 +- + +# 행성로또 + +## 과제 진행 요구사항 + +- [ ] git 커밋 단위는 README.md 에 정리한 기능 목록 단위로 추가한다. +- feat (feature) +- fix (bug fix) +- docs (documentation) +- style (formatting, missing semi colons, …) +- refactor +- test (when adding missing tests) +- chore (maintain) + +## 기능 요구사항 + +### 입력/출력 역할은 제공된 InputView, OutputView에서 수행하며 기존 메서드를 수정, 삭제할 수 없다. + +[] 에러문구는 "[ERROR]"로 시작 +[] 로또 구입금액 입력받기 +[] 구입금액에 따른 구매 장수 출력 +[] 로또 구매 장수에 따른 구매한 로또의 장수만큼 번호 출력 +[] 당첨번호 입력받기 +[] 보너스 번호 입력받기 +[] 당첨 통계 내기 +[] 당첨된 로또 갯수에 따른 당첨된 금액과 그에 따른 갯수 출력하기 + +# 프로그래밍 요구사항 + +[] Node.js 22.19.0 버전에서 실행 가능해야 한다. +[] 프로그램 실행의 시작점은 App.js의 run()이다. +[] package.json 파일은 변경할 수 없으며, 제공된 라이브러리와 스타일 라이브러리 이외의 외부 라이브러리는 사용하지 않는다. +[] 프로그램 종료 시 process.exit()를 호출하지 않는다. +[] 프로그래밍 요구 사항에서 달리 명시하지 않는 한 파일, 패키지 등의 이름을 바꾸거나 이동하지 않는다. +[] 자바스크립트 코드 컨벤션을 지키면서 프로그래밍한다. +[] 기본적으로 JavaScript Style Guide를 원칙으로 한다. +[] 기본으로 제공되는 테스트가 통과해야 한다. + +# 도전과제 + +[] 리팩토링 +[] 기능확장 - 1~3주차 오픈미션 돌아보기 + +- 아쉬웠던 점은 무엇인가요? +- 다음에는 다르게 해보고 싶었던 것은 무엇인가요? +- 피드백을 받았지만 적용하지 못한 것은 무엇인가요? + +// 예외테스트는 신경안써도됨 diff --git a/src/App.js b/src/App.js index 091aa0a5..9a0e63fe 100644 --- a/src/App.js +++ b/src/App.js @@ -1,5 +1,101 @@ +import { Console, Random } from "@woowacourse/mission-utils"; +import { InputView, OutputView } from "./view.js"; +import { MissionUtils } from "@woowacourse/mission-utils"; +import Lotto from "./lotto.js"; class App { - async run() {} + async run() { + // 로또 구입금액 입력받기 + const input = await InputView.askAmount(); + const ticketCount = input / 500; + + // 로또 구매 장수에 따른 구매한 로또의 장수만큼 번호 출력 + let myLottoTicketList = []; + for (let i = 0; i < ticketCount; i++) { + let numbers = Lotto.getLottoNumber(); + myLottoTicketList.push(numbers); + } + // OutputView.printBlank(); + // 구입금액에 따른 구매 장수 출력 + + const outPut = OutputView.printPurchasedLottos(myLottoTicketList); + + // 지난주 당첨번호 입력받기 + const lastWinNumber = await InputView.askWinningLotto(); + + //당첨번호 출력하기 + // Console.print(lastWinNumber); + // console.log("지난주 당첨번호 -> ", lastWinNumber); + + // 보너스 번호 입력받기 + const lastBonusNumber = await InputView.askBonusNumber(); + + // const 당첨된거확인하기위한함수 = getLastWinNumber( + // lastWinNumber, + // lastBonusNumber + // ); + + // console.log("myLottoTicketList-> ", myLottoTicketList); + // 당첨된 로또 갯수에 따른 당첨된 금액과 그에 따른 갯수 출력하기 + + let results = { + 5: 0, + "4+b": 0, + 4: 0, + "3+b": 0, + "2+b": 0, + 0: 0, + }; + + // let results = { + // 1: 0, + // 2: 0, + // 3: 0, + // 4: 0, + // 5: 0, + // 0: 0, + // }; + + for (let i = 0; i < myLottoTicketList.length; i++) { + const myLotto = myLottoTicketList[i]; + // console.log(lotto); + // console.log(typeof lotto); + const correctType = Lotto.getCorrectType( + lastWinNumber, + lastBonusNumber, + myLotto + ); + console.log("myLotto->", myLotto[0]); + if (!correctType) { + continue; + } + results[correctType]++; + } + + // console.log(results); + + const r0 = results["5"]; + const r1 = results["4+b"]; + + const r2 = results["4"]; + const r3 = results["3+b"]; + + const r4 = results["2+b"]; + const r5 = results["0"]; + + // console.log("-------------->>>>>>>>", results); + // console.log("여기보세요 ", r0, r1, r2, r3, r4, r5); + + const Map = { 1: r0, 2: r1, 3: r2, 4: r3, 5: r4, 0: r5 }; + // 당첨 번호를 입력해 주세요. + // 1, 2, 3, 4, 5 + + // 보너스 번호 번호를 입력해 주세요. + // 6 + // countsByRank = results; + // countsByRank = {}; + OutputView.printResult(results); + // console.log("costOutput ---> ", costOutput); + } } export default App; diff --git a/src/lotto.js b/src/lotto.js new file mode 100644 index 00000000..9d5e02fd --- /dev/null +++ b/src/lotto.js @@ -0,0 +1,74 @@ +import { Console, Random } from "@woowacourse/mission-utils"; + +class Lotto { + static getLottoNumber() { + return Random.pickUniqueNumbersInRange(1, 30, 5).sort((a, b) => a - b); + } + // 보너스 숫자 검사 + // static checkBonusNumber() {} + + // static getLastWinNumber(lastWinNumber, lastBonusNumber, myLottoTicketList) { + // const lastWinNumber = lastWinNumber; + // const lastBonusNumber = lastBonusNumber; + // return lastWinNumber, lastBonusNumber; + // } + static getCorrectType(lastWinNumber, lastBonusNumber, myLotto) { + let correctCount = 0; + console.log("이거 myLotto-> ", myLotto); + console.log("이거 lastWinNumber ", lastWinNumber); + console.log("이거 lastBonusNumber ", lastBonusNumber); + + for (let i = 0; i < myLotto.length; i++) { + // if (lastWinNumber.filter((value) => myLotto.includes(value))) { + // correctCount++; + + // } + let correctNumberList = lastWinNumber.filter((value) => + myLotto.includes(value) + ); + correctCount = correctNumberList.length; + console.log("correct--->", correctCount); + } + // if (correctCount === 5) { + // return 5; + // } + // if (correctCount === 4 && myLotto.includes(lastBonusNumber)) { + // return ; + // } + // if (correctCount === 4) { + // return 3; + // } + // if (correctCount === 3 && myLotto.includes(lastBonusNumber)) { + // return 4; + // } + // if (correctCount === 2 && myLotto.includes(lastBonusNumber)) { + // return 5; + // } + + // if ((correctCount = 0)) { + // return 0; + // } + + if (correctCount === 5) { + return 5; + } + if (correctCount === 4 && myLotto.includes(lastBonusNumber)) { + return "4+b"; + } + if (correctCount === 4) { + return 4; + } + if (correctCount === 3 && myLotto.includes(lastBonusNumber)) { + return "3+b"; + } + if (correctCount === 2 && myLotto.includes(lastBonusNumber)) { + return "2+b"; + } + + if ((correctCount = 0)) { + return 0; + } + return correctCount; // 몇개 당첨됐는지? + } +} +export default Lotto; diff --git a/src/sadas b/src/sadas new file mode 100644 index 00000000..ee84c044 --- /dev/null +++ b/src/sadas @@ -0,0 +1,71 @@ +; import { Console, Random } from "@woowacourse/mission-utils"; + +; class Lotto { +; #numbers; + +; constructor(numbers) { +; this.#validate(numbers); +; this.#numbers = numbers; +; } + +; #validate(numbers) { +; if (numbers.length !== 6) { +; throw new Error("[ERROR] 로또 번호는 6개여야 합니다."); +; } + +; const correctSet = new Set(numbers); +; // console.log(correctSet); +; if (correctSet.size !== 6) { +; throw new Error("[ERROR] 중복되는 값이 있습니다."); +; } +; } + +; getNumbers() { +; return this.#numbers; +; } + +; getCorrectType(correctNumbers, bonusNumber) { +; let correctCount = 0; +; for (let i = 0; i < this.#numbers.length; i++) { +; if (correctNumbers.includes(this.#numbers[i])) { +; correctCount++; +; } +; } + +; if (correctCount < 3) { +; return false; +; } + +; if (correctCount === 5 && this.#numbers.includes(bonusNumber)) { +; return "5+b"; +; } +; return correctCount; // 몇개 당첨됐는지? +; } + +; static() { +; return Random.pickUniqueNumbersInRange(1, 45, 6).sort((a, b) => a - b); +; } + +; // 3개 일치 (5,000원) - 1개 +; // 4개 일치 (50,000원) - 0개 +; // 5개 일치 (1,500,000원) - 0개 +; // 5개 일치, 보너스 볼 일치 (30,000,000원) - 0개 +; // 6개 일치 (2,000,000,000원) - 0개 +; // 총 수익률은 62.5%입니다. + +; validateNumbers() { +; //TODO 입력 된 값들이 문자인지 검증 +; const arr = this.#numbers; +; for (let n of arr) { +; if (Number.isNaN(Number(n))) { +; throw new Error( +; "[ERROR] 로또 번호는 숫자로 이루어져야 합니다. 아직 문자입니다." +; ); +; continue; +; } +; } +; } +; // TODO: 추가 기능 구현 +; } + +; export default Lotto; diff --git a/src/view.js b/src/view.js index ae6afd9c..24d903e3 100644 --- a/src/view.js +++ b/src/view.js @@ -5,10 +5,12 @@ const InputView = { * @returns {number} */ async askAmount() { - const input = await MissionUtils.Console.readLineAsync('구입금액을 입력해 주세요.\n'); + const input = await MissionUtils.Console.readLineAsync( + "구입금액을 입력해 주세요.\n" + ); const num = parseInt(input, 10); if (Number.isNaN(num)) { - throw new Error('구매금액은 숫자여야 합니다.'); + throw new Error("구매금액은 숫자여야 합니다."); } return num; }, @@ -17,15 +19,17 @@ const InputView = { * @returns {number[]} */ async askWinningLotto() { - const input = await MissionUtils.Console.readLineAsync('지난 주 당첨 번호를 입력해 주세요.\n'); + const input = await MissionUtils.Console.readLineAsync( + "지난 주 당첨 번호를 입력해 주세요.\n" + ); return input - .replaceAll(' ', '') - .split(',') + .replaceAll(" ", "") + .split(",") .map((s) => { const n = parseInt(s, 10); if (Number.isNaN(n)) { - throw new Error('당첨 번호는 숫자여야 합니다.'); + throw new Error("당첨 번호는 숫자여야 합니다."); } return n; }); @@ -35,10 +39,12 @@ const InputView = { * @returns {number} */ async askBonusNumber() { - const input = await MissionUtils.Console.readLineAsync('보너스 번호를 입력해 주세요.\n'); + const input = await MissionUtils.Console.readLineAsync( + "보너스 번호를 입력해 주세요.\n" + ); const num = parseInt(input, 10); if (Number.isNaN(num)) { - throw new Error('보너스 번호는 숫자여야 합니다.'); + throw new Error("보너스 번호는 숫자여야 합니다."); } return num; }, @@ -51,9 +57,9 @@ const OutputView = { printPurchasedLottos(lottos) { const lines = [ `${lottos.length}개를 구매했습니다.`, - ...lottos.map(lotto => `[${lotto.join(', ')}]`), + ...lottos.map((lotto) => `[${lotto.join(", ")}]`), ]; - MissionUtils.Console.print(lines.join('\n')); + MissionUtils.Console.print(lines.join("\n")); }, /** @@ -65,26 +71,49 @@ const OutputView = { printResult(countsByRank) { const getCount = (k) => countsByRank.get(k) ?? 0; + console.log(); const output = [ - '당첨 통계', - '---', + "당첨 통계", + "---", `5개 일치 (100,000,000원) - ${getCount(1)}개`, `4개 일치, 보너스 번호 일치 (10,000,000원) - ${getCount(2)}개`, `4개 일치 (1,500,000원) - ${getCount(3)}개`, `3개 일치, 보너스 번호 일치 (500,000원) - ${getCount(4)}개`, `2개 일치, 보너스 번호 일치 (5,000원) - ${getCount(5)}개`, `0개 일치 (0원) - ${getCount(0)}개`, - ].join('\n'); + ].join("\n"); MissionUtils.Console.print(output); }, + // printResult(countsByRank) { + // // const getCount = (k) => countsByRank.get(k) ?? 0; + + // console.log("countsByRank", countsByRank); + // const output = [ + // "당첨 통계", + // "---", + // `5개 일치 (100,000,000원) - ${countsByRank["5"]}개`, + // `4개 일치, 보너스 번호 일치 (10,000,000원) - ${countsByRank["4+b"]}개`, + // `4개 일치 (1,500,000원) - ${countsByRank["4"]}개`, + // `3개 일치, 보너스 번호 일치 (500,000원) - ${countsByRank["3+b"]}개`, + // `2개 일치, 보너스 번호 일치 (5,000원) - ${countsByRank["2+b"]}개`, + // `0개 일치 (0원) - ${countsByRank["0"]}개`, + // ].join("\n"); + + // MissionUtils.Console.print(output); + // }, + /** * @param {string} message */ printErrorMessage(message) { MissionUtils.Console.print(`[ERROR] ${message}`); }, + + // printBlank() { + // return Console.print("\n"); + // }, }; export { InputView, OutputView };