From 0fc001eb9d6dca7642ab847d9cde5310481ce672 Mon Sep 17 00:00:00 2001 From: Kim_Yjoo Date: Thu, 31 Oct 2024 00:49:56 +0900 Subject: [PATCH 01/37] initiate --- README.md | 1 + 1 file changed, 1 insertion(+) diff --git a/README.md b/README.md index 15bb106b5..ff0b16aa9 100644 --- a/README.md +++ b/README.md @@ -1 +1,2 @@ # javascript-lotto-precourse +init \ No newline at end of file From 150bb116f8d0a53d2d384b0ed656b08420d1322b Mon Sep 17 00:00:00 2001 From: Kim_Yjoo Date: Thu, 31 Oct 2024 23:07:14 +0900 Subject: [PATCH 02/37] =?UTF-8?q?docs=20:=20=EC=B2=AB=20=EA=B8=B0=EB=8A=A5?= =?UTF-8?q?=20=EA=B5=AC=ED=98=84=20=EB=AA=A9=EB=A1=9D=20=EC=9E=91=EC=84=B1?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - 입력, 로또 게임 진행, 출력으로 구분하여 작성 --- README.md | 44 +++++++++++++++++++++++++++++++++++++++++++- 1 file changed, 43 insertions(+), 1 deletion(-) diff --git a/README.md b/README.md index ff0b16aa9..940cd660f 100644 --- a/README.md +++ b/README.md @@ -1,2 +1,44 @@ # javascript-lotto-precourse -init \ No newline at end of file + +# 기능 구현 목록 +### 입력 +- [ ] 로또 구입 금액을 입력한다. +- [ ] 당첨번호를 입력한다. +- [ ] 보너스 번호를 입력한다. + #### 입력 처리 + - [ ] 로또 구입 금액을 통해 로또 구입 개수 계산한다. + - [ ] 당첨 번호 입력을 구분자로 구분한다. + - [ ] 사용자의 구입 금액을 저장한다. + - [ ] 사용자의 당첨 번호를 저장한다. + - [ ] 사용자의 보너스 번호를 저장한다. + + #### 입력 조건 + - [ ] 로또 구입 금액은 1000원 단위로 입력 받는다. + - [ ] 당첨 번호는 쉼표를 기준으로 구분한다. + - [ ] 로또 번호는 1에서 45사이의 숫자여야 한다. + - [ ] 로또 번호의 중복이 있으면 안된다. (보너스도 마찬가지) + - [ ] 로또 번호는 6자리이다. + - [ ] 보너스 번호는 숫자 하나이다. + + #### 입력 예외 처리 목록 + - [ ] 로또 구입 금액이 1000원 단위가 아닐 경우. + - [ ] 당첨 번호 중 숫자가 아닌 특수문자가 있을 경우. + - [ ] 로또 번호가 1에서 45사이의 숫자가 아닐 경우. + - [ ] 로또 번호에 중복이 있을 경우. + 보너스 번호 포함. + - [ ] 로또 번호가 보너스 제외하고 6자리가 아닐 경우. + - [ ] 보너스 번호가 숫자가 아닌 특수문자일 경우. + - [ ] 로또 번호가 소수일 경우 + +### 로또 게임 진행 +- [ ] 랜덤한 당첨 번호를 생성한다. +- [ ] 랜덤한 보너스 번호를 생성한다. +- [ ] 사용자의 당첨 번호와 비교했을 때 일치하는 개수를 구한다. +- [ ] 사용자의 보너스 번호와 비교했을 때 일치하는지 확인한다. +- [ ] 사용자의 로또가 몇 등 당첨인지 판단한다. +- [ ] 당첨 금액 및 투입 금액에 따른 사용자의 수익률을 계산한다. + +### 출력 +- [ ] 구매한 로또의 개수를 출력한다. +- [ ] 당첨 통계 안내 메시지를 출력한다. +- [ ] 정해진 당첨 등수를 모두 출력한다. 그와 함께 사용자가 각 등수에 당첨된 개수를 출력한다. +- [ ] 사용자의 수익률을 출력한다. \ No newline at end of file From e7596d0f36fecc126ebf205b57d19442abd3517e Mon Sep 17 00:00:00 2001 From: Kim_Yjoo Date: Thu, 31 Oct 2024 23:24:06 +0900 Subject: [PATCH 03/37] =?UTF-8?q?docs=20:=20=EA=B3=BC=EC=A0=9C=20=EC=88=98?= =?UTF-8?q?=ED=96=89=20=EC=B2=B4=ED=81=AC=EB=A6=AC=EC=8A=A4=ED=8A=B8=20?= =?UTF-8?q?=EC=9E=91=EC=84=B1?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- README.md | 22 ++++++++++++++++++++-- 1 file changed, 20 insertions(+), 2 deletions(-) diff --git a/README.md b/README.md index 940cd660f..4bbdfba05 100644 --- a/README.md +++ b/README.md @@ -1,6 +1,24 @@ -# javascript-lotto-precourse +# 우테코 프리코스 3주차 [자동차 게임] +## 과제 수행 체크리스트 +#### 개발 과정 준수 사항 +- [ ] 코드 포매팅 사용 +- [ ] README.MD 기능 목록 수시로 업데이트 +- [ ] 자바스크립트 코드 컨벤션 준수 -# 기능 구현 목록 +#### 코드 준수 사항 +- [ ] 값 하드 코딩 금지, 상수화 +- [ ] 들여쓰기 depth 2이내 +- [ ] else 문 지양 +- [ ] 함수 길이 15라인 이내 유지 (한 가지 기능) +- [ ] 구현 순서 준수(클래스 : 필드, 생성자, 매서드 순) +- [ ] 메서드가 한 가지 기능을 담당하는지 확인하는 기준 세우기 (ex: 15줄 이내) + +#### 테스트 코드 준수 사항 +- [ ] 테스트를 작성하는 이유에 대해 생각하기 +- [ ] Jest 이용 테스트코드 +- [ ] 기능의 단위 테스트 작성 (UI(System.out, System.in, Scanner) 로직은 제외한다.) + +## 기능 구현 목록 ### 입력 - [ ] 로또 구입 금액을 입력한다. - [ ] 당첨번호를 입력한다. From 20e6f3b6cab8bc2e0bb2659939c13903241920bc Mon Sep 17 00:00:00 2001 From: Kim_Yjoo Date: Thu, 31 Oct 2024 23:27:43 +0900 Subject: [PATCH 04/37] =?UTF-8?q?docs=20:=20=EB=94=94=EC=9E=90=EC=9D=B8=20?= =?UTF-8?q?=EC=88=98=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- README.md | 43 ++++++++++++++++++++++--------------------- 1 file changed, 22 insertions(+), 21 deletions(-) diff --git a/README.md b/README.md index 4bbdfba05..71fe66b5f 100644 --- a/README.md +++ b/README.md @@ -20,32 +20,33 @@ ## 기능 구현 목록 ### 입력 +- #### 사용자 입력 - [ ] 로또 구입 금액을 입력한다. - [ ] 당첨번호를 입력한다. - [ ] 보너스 번호를 입력한다. - #### 입력 처리 - - [ ] 로또 구입 금액을 통해 로또 구입 개수 계산한다. - - [ ] 당첨 번호 입력을 구분자로 구분한다. - - [ ] 사용자의 구입 금액을 저장한다. - - [ ] 사용자의 당첨 번호를 저장한다. - - [ ] 사용자의 보너스 번호를 저장한다. +- #### 입력 처리 +- [ ] 로또 구입 금액을 통해 로또 구입 개수 계산한다. +- [ ] 당첨 번호 입력을 구분자로 구분한다. +- [ ] 사용자의 구입 금액을 저장한다. +- [ ] 사용자의 당첨 번호를 저장한다. +- [ ] 사용자의 보너스 번호를 저장한다. - #### 입력 조건 - - [ ] 로또 구입 금액은 1000원 단위로 입력 받는다. - - [ ] 당첨 번호는 쉼표를 기준으로 구분한다. - - [ ] 로또 번호는 1에서 45사이의 숫자여야 한다. - - [ ] 로또 번호의 중복이 있으면 안된다. (보너스도 마찬가지) - - [ ] 로또 번호는 6자리이다. - - [ ] 보너스 번호는 숫자 하나이다. +- #### 입력 조건 +- [ ] 로또 구입 금액은 1000원 단위로 입력 받는다. +- [ ] 당첨 번호는 쉼표를 기준으로 구분한다. +- [ ] 로또 번호는 1에서 45사이의 숫자여야 한다. +- [ ] 로또 번호의 중복이 있으면 안된다. (보너스도 마찬가지) +- [ ] 로또 번호는 6자리이다. +- [ ] 보너스 번호는 숫자 하나이다. - #### 입력 예외 처리 목록 - - [ ] 로또 구입 금액이 1000원 단위가 아닐 경우. - - [ ] 당첨 번호 중 숫자가 아닌 특수문자가 있을 경우. - - [ ] 로또 번호가 1에서 45사이의 숫자가 아닐 경우. - - [ ] 로또 번호에 중복이 있을 경우. + 보너스 번호 포함. - - [ ] 로또 번호가 보너스 제외하고 6자리가 아닐 경우. - - [ ] 보너스 번호가 숫자가 아닌 특수문자일 경우. - - [ ] 로또 번호가 소수일 경우 +- #### 입력 예외 처리 목록 +- [ ] 로또 구입 금액이 1000원 단위가 아닐 경우. +- [ ] 당첨 번호 중 숫자가 아닌 특수문자가 있을 경우. +- [ ] 로또 번호가 1에서 45사이의 숫자가 아닐 경우. +- [ ] 로또 번호에 중복이 있을 경우. + 보너스 번호 포함. +- [ ] 로또 번호가 보너스 제외하고 6자리가 아닐 경우. +- [ ] 보너스 번호가 숫자가 아닌 특수문자일 경우. +- [ ] 로또 번호가 소수일 경우 ### 로또 게임 진행 - [ ] 랜덤한 당첨 번호를 생성한다. From ec7a64f9439809aee4e9caaea1bdcee001d134ed Mon Sep 17 00:00:00 2001 From: Kim_Yjoo Date: Thu, 31 Oct 2024 23:29:19 +0900 Subject: [PATCH 05/37] =?UTF-8?q?docs=20:=20=EB=94=94=EC=9E=90=EC=9D=B8=20?= =?UTF-8?q?=EC=9E=AC=EC=88=98=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- README.md | 62 +++++++++++++++++++++++++++---------------------------- 1 file changed, 31 insertions(+), 31 deletions(-) diff --git a/README.md b/README.md index 71fe66b5f..f517cba9f 100644 --- a/README.md +++ b/README.md @@ -21,43 +21,43 @@ ## 기능 구현 목록 ### 입력 - #### 사용자 입력 -- [ ] 로또 구입 금액을 입력한다. -- [ ] 당첨번호를 입력한다. -- [ ] 보너스 번호를 입력한다. + - [ ] 로또 구입 금액을 입력한다. + - [ ] 당첨번호를 입력한다. + - [ ] 보너스 번호를 입력한다. - #### 입력 처리 -- [ ] 로또 구입 금액을 통해 로또 구입 개수 계산한다. -- [ ] 당첨 번호 입력을 구분자로 구분한다. -- [ ] 사용자의 구입 금액을 저장한다. -- [ ] 사용자의 당첨 번호를 저장한다. -- [ ] 사용자의 보너스 번호를 저장한다. + - [ ] 로또 구입 금액을 통해 로또 구입 개수 계산한다. + - [ ] 당첨 번호 입력을 구분자로 구분한다. + - [ ] 사용자의 구입 금액을 저장한다. + - [ ] 사용자의 당첨 번호를 저장한다. + - [ ] 사용자의 보너스 번호를 저장한다. - #### 입력 조건 -- [ ] 로또 구입 금액은 1000원 단위로 입력 받는다. -- [ ] 당첨 번호는 쉼표를 기준으로 구분한다. -- [ ] 로또 번호는 1에서 45사이의 숫자여야 한다. -- [ ] 로또 번호의 중복이 있으면 안된다. (보너스도 마찬가지) -- [ ] 로또 번호는 6자리이다. -- [ ] 보너스 번호는 숫자 하나이다. + - [ ] 로또 구입 금액은 1000원 단위로 입력 받는다. + - [ ] 당첨 번호는 쉼표를 기준으로 구분한다. + - [ ] 로또 번호는 1에서 45사이의 숫자여야 한다. + - [ ] 로또 번호의 중복이 있으면 안된다. (보너스도 마찬가지) + - [ ] 로또 번호는 6자리이다. + - [ ] 보너스 번호는 숫자 하나이다. - #### 입력 예외 처리 목록 -- [ ] 로또 구입 금액이 1000원 단위가 아닐 경우. -- [ ] 당첨 번호 중 숫자가 아닌 특수문자가 있을 경우. -- [ ] 로또 번호가 1에서 45사이의 숫자가 아닐 경우. -- [ ] 로또 번호에 중복이 있을 경우. + 보너스 번호 포함. -- [ ] 로또 번호가 보너스 제외하고 6자리가 아닐 경우. -- [ ] 보너스 번호가 숫자가 아닌 특수문자일 경우. -- [ ] 로또 번호가 소수일 경우 + - [ ] 로또 구입 금액이 1000원 단위가 아닐 경우. + - [ ] 당첨 번호 중 숫자가 아닌 특수문자가 있을 경우. + - [ ] 로또 번호가 1에서 45사이의 숫자가 아닐 경우. + - [ ] 로또 번호에 중복이 있을 경우. + 보너스 번호 포함. + - [ ] 로또 번호가 보너스 제외하고 6자리가 아닐 경우. + - [ ] 보너스 번호가 숫자가 아닌 특수문자일 경우. + - [ ] 로또 번호가 소수일 경우 ### 로또 게임 진행 -- [ ] 랜덤한 당첨 번호를 생성한다. -- [ ] 랜덤한 보너스 번호를 생성한다. -- [ ] 사용자의 당첨 번호와 비교했을 때 일치하는 개수를 구한다. -- [ ] 사용자의 보너스 번호와 비교했을 때 일치하는지 확인한다. -- [ ] 사용자의 로또가 몇 등 당첨인지 판단한다. -- [ ] 당첨 금액 및 투입 금액에 따른 사용자의 수익률을 계산한다. + - [ ] 랜덤한 당첨 번호를 생성한다. + - [ ] 랜덤한 보너스 번호를 생성한다. + - [ ] 사용자의 당첨 번호와 비교했을 때 일치하는 개수를 구한다. + - [ ] 사용자의 보너스 번호와 비교했을 때 일치하는지 확인한다. + - [ ] 사용자의 로또가 몇 등 당첨인지 판단한다. + - [ ] 당첨 금액 및 투입 금액에 따른 사용자의 수익률을 계산한다. ### 출력 -- [ ] 구매한 로또의 개수를 출력한다. -- [ ] 당첨 통계 안내 메시지를 출력한다. -- [ ] 정해진 당첨 등수를 모두 출력한다. 그와 함께 사용자가 각 등수에 당첨된 개수를 출력한다. -- [ ] 사용자의 수익률을 출력한다. \ No newline at end of file + - [ ] 구매한 로또의 개수를 출력한다. + - [ ] 당첨 통계 안내 메시지를 출력한다. + - [ ] 정해진 당첨 등수를 모두 출력한다. 그와 함께 사용자가 각 등수에 당첨된 개수를 출력한다. + - [ ] 사용자의 수익률을 출력한다. \ No newline at end of file From 7753cc7724c2cb9585097db5bf206d186dcae664 Mon Sep 17 00:00:00 2001 From: Kim_Yjoo Date: Thu, 31 Oct 2024 23:33:08 +0900 Subject: [PATCH 06/37] =?UTF-8?q?doc=20:=20=EA=B8=B0=EB=8A=A5=20=EB=AA=A9?= =?UTF-8?q?=EB=A1=9D=20=EC=84=B8=EB=B6=84=ED=99=94?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- README.md | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/README.md b/README.md index f517cba9f..916cf1b98 100644 --- a/README.md +++ b/README.md @@ -49,15 +49,20 @@ - [ ] 로또 번호가 소수일 경우 ### 로또 게임 진행 +- #### 당첨 로또 번호 생성 - [ ] 랜덤한 당첨 번호를 생성한다. - [ ] 랜덤한 보너스 번호를 생성한다. +- #### 사용자의 로또 당첨 여부 확인 - [ ] 사용자의 당첨 번호와 비교했을 때 일치하는 개수를 구한다. - [ ] 사용자의 보너스 번호와 비교했을 때 일치하는지 확인한다. +- #### 사용자의 로또 게임 결과 판단 - [ ] 사용자의 로또가 몇 등 당첨인지 판단한다. - [ ] 당첨 금액 및 투입 금액에 따른 사용자의 수익률을 계산한다. ### 출력 +- #### 안내 메시지 - [ ] 구매한 로또의 개수를 출력한다. - [ ] 당첨 통계 안내 메시지를 출력한다. +- #### 로또 결과 출력 - [ ] 정해진 당첨 등수를 모두 출력한다. 그와 함께 사용자가 각 등수에 당첨된 개수를 출력한다. - [ ] 사용자의 수익률을 출력한다. \ No newline at end of file From 99f9177000b0606660906fc466e4fd55ab0eb259 Mon Sep 17 00:00:00 2001 From: Kim_Yjoo Date: Thu, 31 Oct 2024 23:38:18 +0900 Subject: [PATCH 07/37] =?UTF-8?q?docs=20:=20=EA=B3=BC=EC=A0=9C=20=EC=88=98?= =?UTF-8?q?=ED=96=89=20=EC=B2=B4=ED=81=AC=EB=A6=AC=EC=8A=A4=ED=8A=B8?= =?UTF-8?q?=EC=97=90=20=EC=8A=A4=ED=84=B0=EB=94=94=20=ED=95=99=EC=8A=B5=20?= =?UTF-8?q?=EB=82=B4=EC=9A=A9=20=EC=B6=94=EA=B0=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- README.md | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/README.md b/README.md index 916cf1b98..3b00f64a1 100644 --- a/README.md +++ b/README.md @@ -4,14 +4,18 @@ - [ ] 코드 포매팅 사용 - [ ] README.MD 기능 목록 수시로 업데이트 - [ ] 자바스크립트 코드 컨벤션 준수 +- [ ] 코드의 목적이 들어나는 변수명 고려 #### 코드 준수 사항 +- [ ] let 선언 줄이기, const 사용 +- [ ] 접근제어자 표시 - [ ] 값 하드 코딩 금지, 상수화 - [ ] 들여쓰기 depth 2이내 - [ ] else 문 지양 - [ ] 함수 길이 15라인 이내 유지 (한 가지 기능) - [ ] 구현 순서 준수(클래스 : 필드, 생성자, 매서드 순) - [ ] 메서드가 한 가지 기능을 담당하는지 확인하는 기준 세우기 (ex: 15줄 이내) +- [ ] 예외 처리 (validation) 를 따로 분류하여 관리하기 #### 테스트 코드 준수 사항 - [ ] 테스트를 작성하는 이유에 대해 생각하기 From a95a0dea0d14e73e34a41cc3dab4f653e7a24e35 Mon Sep 17 00:00:00 2001 From: Ong_Du Date: Sat, 2 Nov 2024 22:29:50 +0900 Subject: [PATCH 08/37] =?UTF-8?q?feat=20:=20=EC=9C=A0=EC=A0=80=20=EC=9E=85?= =?UTF-8?q?=EB=A0=A5=20=EC=84=B8=ED=8A=B8=20=EC=B6=94=EA=B0=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - 유저의 구입 금액 입력 - 유저의 당첨 번호 입력 - 유저의 보너스 번호 입력 --- README.md | 6 +++--- src/App.js | 19 ++++++++++++++++++- 2 files changed, 21 insertions(+), 4 deletions(-) diff --git a/README.md b/README.md index 3b00f64a1..22ae72db4 100644 --- a/README.md +++ b/README.md @@ -25,9 +25,9 @@ ## 기능 구현 목록 ### 입력 - #### 사용자 입력 - - [ ] 로또 구입 금액을 입력한다. - - [ ] 당첨번호를 입력한다. - - [ ] 보너스 번호를 입력한다. + - [x] 로또 구입 금액을 입력한다. + - [x] 당첨번호를 입력한다. + - [x] 보너스 번호를 입력한다. - #### 입력 처리 - [ ] 로또 구입 금액을 통해 로또 구입 개수 계산한다. - [ ] 당첨 번호 입력을 구분자로 구분한다. diff --git a/src/App.js b/src/App.js index 091aa0a5d..031215c18 100644 --- a/src/App.js +++ b/src/App.js @@ -1,5 +1,22 @@ +import {Console} from '@woowacourse/mission-utils' class App { - async run() {} + async run() { + const userPurchaseAmount = this.getUserPurchaseAmount(); + const userWinningNumber = this.getUserWinningNumber(); + const userWinningBonusNumber = this.getUserWinningBonusNumber(); + } + + getUserPurchaseAmount(){ + return Console.readLineAsync('구입금액을 입력해 주세요.'); + } + + getUserWinningNumber(){ + return Console.readLineAsync('당첨 번호를 입력해 주세요.'); + } + + getUserWinningBonusNumber(){ + return Console.readLineAsync('보너스 번호를 입력해 주세요.'); + } } export default App; From 19c5b67babe5591e55bb0fbb4c47ead0ea60b213 Mon Sep 17 00:00:00 2001 From: Ong_Du Date: Sat, 2 Nov 2024 22:31:59 +0900 Subject: [PATCH 09/37] =?UTF-8?q?fix=20:=20=EC=9C=A0=EC=A0=80=20=EC=9E=85?= =?UTF-8?q?=EB=A0=A5=20=EC=84=B8=ED=8A=B8=20async=20=EC=B6=94=EA=B0=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- package-lock.json | 49 ++++++++++++++++++++++++++--------------------- src/App.js | 12 ++++++------ 2 files changed, 33 insertions(+), 28 deletions(-) diff --git a/package-lock.json b/package-lock.json index 3243a564f..6253c0aab 100644 --- a/package-lock.json +++ b/package-lock.json @@ -2459,12 +2459,13 @@ } }, "node_modules/braces": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.2.tgz", - "integrity": "sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==", + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.3.tgz", + "integrity": "sha512-yQbXgO/OSZVD2IsiLlro+7Hf6Q18EJrKSEsdoMzKePKXct3gvD8oLcOQdIzGupr5Fj+EDe8gO/lxc1BzfMpxvA==", "dev": true, + "license": "MIT", "dependencies": { - "fill-range": "^7.0.1" + "fill-range": "^7.1.1" }, "engines": { "node": ">=8" @@ -2909,10 +2910,11 @@ } }, "node_modules/fill-range": { - "version": "7.0.1", - "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.0.1.tgz", - "integrity": "sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ==", + "version": "7.1.1", + "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.1.1.tgz", + "integrity": "sha512-YsGpe3WHLK8ZYi4tWDg2Jy3ebRz2rXowDxnld4bkQB00cc/1Zw9AWnC0i9ztDJitivtQvaI9KaLyKrc+hBW0yg==", "dev": true, + "license": "MIT", "dependencies": { "to-regex-range": "^5.0.1" }, @@ -3146,6 +3148,7 @@ "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz", "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==", "dev": true, + "license": "MIT", "engines": { "node": ">=0.12.0" } @@ -4023,12 +4026,13 @@ "dev": true }, "node_modules/micromatch": { - "version": "4.0.5", - "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.5.tgz", - "integrity": "sha512-DMy+ERcEW2q8Z2Po+WNXuw3c5YaUSFjAO5GsJqfEl7UjvtIuFKO6ZrKvcItdy98dwFI2N1tg3zNIdKaQT+aNdA==", + "version": "4.0.8", + "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.8.tgz", + "integrity": "sha512-PXwfBhYu0hBCPw8Dn0E+WDYb7af3dSLVWKi3HGv84IdF4TyFoC0ysxFd0Goxw7nSv4T/PzEJQxsYsEiFCKo2BA==", "dev": true, + "license": "MIT", "dependencies": { - "braces": "^3.0.2", + "braces": "^3.0.3", "picomatch": "^2.3.1" }, "engines": { @@ -4666,6 +4670,7 @@ "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz", "integrity": "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==", "dev": true, + "license": "MIT", "dependencies": { "is-number": "^7.0.0" }, @@ -6600,12 +6605,12 @@ } }, "braces": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.2.tgz", - "integrity": "sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==", + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.3.tgz", + "integrity": "sha512-yQbXgO/OSZVD2IsiLlro+7Hf6Q18EJrKSEsdoMzKePKXct3gvD8oLcOQdIzGupr5Fj+EDe8gO/lxc1BzfMpxvA==", "dev": true, "requires": { - "fill-range": "^7.0.1" + "fill-range": "^7.1.1" } }, "browserslist": { @@ -6903,9 +6908,9 @@ } }, "fill-range": { - "version": "7.0.1", - "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.0.1.tgz", - "integrity": "sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ==", + "version": "7.1.1", + "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.1.1.tgz", + "integrity": "sha512-YsGpe3WHLK8ZYi4tWDg2Jy3ebRz2rXowDxnld4bkQB00cc/1Zw9AWnC0i9ztDJitivtQvaI9KaLyKrc+hBW0yg==", "dev": true, "requires": { "to-regex-range": "^5.0.1" @@ -7741,12 +7746,12 @@ "dev": true }, "micromatch": { - "version": "4.0.5", - "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.5.tgz", - "integrity": "sha512-DMy+ERcEW2q8Z2Po+WNXuw3c5YaUSFjAO5GsJqfEl7UjvtIuFKO6ZrKvcItdy98dwFI2N1tg3zNIdKaQT+aNdA==", + "version": "4.0.8", + "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.8.tgz", + "integrity": "sha512-PXwfBhYu0hBCPw8Dn0E+WDYb7af3dSLVWKi3HGv84IdF4TyFoC0ysxFd0Goxw7nSv4T/PzEJQxsYsEiFCKo2BA==", "dev": true, "requires": { - "braces": "^3.0.2", + "braces": "^3.0.3", "picomatch": "^2.3.1" } }, diff --git a/src/App.js b/src/App.js index 031215c18..6a9534541 100644 --- a/src/App.js +++ b/src/App.js @@ -1,20 +1,20 @@ import {Console} from '@woowacourse/mission-utils' class App { async run() { - const userPurchaseAmount = this.getUserPurchaseAmount(); - const userWinningNumber = this.getUserWinningNumber(); - const userWinningBonusNumber = this.getUserWinningBonusNumber(); + const userPurchaseAmount = await this.getUserPurchaseAmount(); + const userWinningNumber = await this.getUserWinningNumber(); + const userWinningBonusNumber = await this.getUserWinningBonusNumber(); } - getUserPurchaseAmount(){ + async getUserPurchaseAmount(){ return Console.readLineAsync('구입금액을 입력해 주세요.'); } - getUserWinningNumber(){ + async getUserWinningNumber(){ return Console.readLineAsync('당첨 번호를 입력해 주세요.'); } - getUserWinningBonusNumber(){ + async getUserWinningBonusNumber(){ return Console.readLineAsync('보너스 번호를 입력해 주세요.'); } } From 355481927bffb6e91631c0a856a3d12e23f1b314 Mon Sep 17 00:00:00 2001 From: Ong_Du Date: Sat, 2 Nov 2024 22:49:39 +0900 Subject: [PATCH 10/37] =?UTF-8?q?feat(computeLottoForPurchase)=20:=20?= =?UTF-8?q?=EA=B5=AC=EC=9E=85=20=EA=B8=88=EC=95=A1=20=EB=8C=80=EB=B9=84=20?= =?UTF-8?q?=EC=88=98=EB=A0=B9=20=EB=A1=9C=EB=98=90=20=EA=B0=9C=EC=88=98=20?= =?UTF-8?q?=EA=B3=84=EC=82=B0=20=ED=95=A8=EC=88=98=20=EC=B6=94=EA=B0=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/App.js | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/src/App.js b/src/App.js index 6a9534541..7c3fcf402 100644 --- a/src/App.js +++ b/src/App.js @@ -4,6 +4,9 @@ class App { const userPurchaseAmount = await this.getUserPurchaseAmount(); const userWinningNumber = await this.getUserWinningNumber(); const userWinningBonusNumber = await this.getUserWinningBonusNumber(); + + const userLottoAmount = computeLottoForPurchase(); + } async getUserPurchaseAmount(){ @@ -17,6 +20,11 @@ class App { async getUserWinningBonusNumber(){ return Console.readLineAsync('보너스 번호를 입력해 주세요.'); } + + computeLottoForPurchase(purchaseAmount){ + return purchaseAmount / 1000; + } + } export default App; From 4b21933e891f947254d23b078aeeb33edaf8020a Mon Sep 17 00:00:00 2001 From: Ong_Du Date: Sat, 2 Nov 2024 23:01:19 +0900 Subject: [PATCH 11/37] =?UTF-8?q?feat(separateString)=20:=20=EA=B5=AC?= =?UTF-8?q?=EB=B6=84=EC=9E=90=20=EA=B8=B0=EC=A4=80=20=EB=AC=B8=EC=9E=90?= =?UTF-8?q?=EC=97=B4=20=EB=B6=84=EB=A6=AC=20=ED=95=A8=EC=88=98=20=EC=B6=94?= =?UTF-8?q?=EA=B0=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/App.js | 19 ++++++++++++------- 1 file changed, 12 insertions(+), 7 deletions(-) diff --git a/src/App.js b/src/App.js index 7c3fcf402..4ec469c62 100644 --- a/src/App.js +++ b/src/App.js @@ -1,15 +1,16 @@ import {Console} from '@woowacourse/mission-utils' + class App { async run() { - const userPurchaseAmount = await this.getUserPurchaseAmount(); + const userPurchaseAmount = await this.getPurchaseAmount(); const userWinningNumber = await this.getUserWinningNumber(); - const userWinningBonusNumber = await this.getUserWinningBonusNumber(); + const userWinningBonus = await this.getWinningBonus(); - const userLottoAmount = computeLottoForPurchase(); - + const userLottoAmount = this.computeLottoForPurchase(); + const winningNumbers = this.separateString(userWinningNumber, ','); } - async getUserPurchaseAmount(){ + async getPurchaseAmount(){ return Console.readLineAsync('구입금액을 입력해 주세요.'); } @@ -17,7 +18,7 @@ class App { return Console.readLineAsync('당첨 번호를 입력해 주세요.'); } - async getUserWinningBonusNumber(){ + async getWinningBonus(){ return Console.readLineAsync('보너스 번호를 입력해 주세요.'); } @@ -25,6 +26,10 @@ class App { return purchaseAmount / 1000; } + separateString(string, separator){ + return string.split(separator); + } + } -export default App; +export default App; \ No newline at end of file From d2feca56ad2207e2d4f314e1b1c3649a3f3a8dfa Mon Sep 17 00:00:00 2001 From: Kim_Yjoo Date: Sun, 3 Nov 2024 01:16:35 +0900 Subject: [PATCH 12/37] =?UTF-8?q?docs(README)=20:=20=EC=98=88=EC=99=B8?= =?UTF-8?q?=EC=B2=98=EB=A6=AC=EB=AA=A9=EB=A1=9D=20=EC=B6=94=EA=B0=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - 로또 구입 금액이 소수인 경우 추가 --- README.md | 23 ++++++++++++----------- 1 file changed, 12 insertions(+), 11 deletions(-) diff --git a/README.md b/README.md index 22ae72db4..478078e0a 100644 --- a/README.md +++ b/README.md @@ -29,22 +29,23 @@ - [x] 당첨번호를 입력한다. - [x] 보너스 번호를 입력한다. - #### 입력 처리 - - [ ] 로또 구입 금액을 통해 로또 구입 개수 계산한다. - - [ ] 당첨 번호 입력을 구분자로 구분한다. - - [ ] 사용자의 구입 금액을 저장한다. - - [ ] 사용자의 당첨 번호를 저장한다. - - [ ] 사용자의 보너스 번호를 저장한다. + - [x] 로또 구입 금액을 통해 로또 구입 개수 계산한다. + - [x] 당첨 번호 입력을 구분자로 구분한다. + - [x] 사용자의 구입 금액을 저장한다. + - [x] 사용자의 당첨 번호를 저장한다. + - [x] 사용자의 보너스 번호를 저장한다. - #### 입력 조건 - - [ ] 로또 구입 금액은 1000원 단위로 입력 받는다. - - [ ] 당첨 번호는 쉼표를 기준으로 구분한다. - - [ ] 로또 번호는 1에서 45사이의 숫자여야 한다. - - [ ] 로또 번호의 중복이 있으면 안된다. (보너스도 마찬가지) - - [ ] 로또 번호는 6자리이다. - - [ ] 보너스 번호는 숫자 하나이다. + - 로또 구입 금액은 1000원 단위로 입력 받는다. + - 당첨 번호는 쉼표를 기준으로 구분한다. + - 로또 번호는 1에서 45사이의 숫자여야 한다. + - 로또 번호의 중복이 있으면 안된다. (보너스도 마찬가지) + - 로또 번호는 6자리이다. + - 보너스 번호는 숫자 하나이다. - #### 입력 예외 처리 목록 - [ ] 로또 구입 금액이 1000원 단위가 아닐 경우. + - [ ] 로또 구입 금액이 소수인 경우. - [ ] 당첨 번호 중 숫자가 아닌 특수문자가 있을 경우. - [ ] 로또 번호가 1에서 45사이의 숫자가 아닐 경우. - [ ] 로또 번호에 중복이 있을 경우. + 보너스 번호 포함. From 706382bc1bc3fe3ef349e13fa3d0b3e17be898e6 Mon Sep 17 00:00:00 2001 From: Kim_Yjoo Date: Sun, 3 Nov 2024 01:26:01 +0900 Subject: [PATCH 13/37] =?UTF-8?q?feat=20:=20=EA=B5=AC=EC=9E=85=20=EA=B8=88?= =?UTF-8?q?=EC=95=A1=EC=9D=B4=201000=EC=9B=90=20=EB=8B=A8=EC=9C=84?= =?UTF-8?q?=EA=B0=80=20=EC=95=84=EB=8B=90=EB=95=8C=20=EC=98=88=EC=99=B8=20?= =?UTF-8?q?=EC=B6=9C=EB=A0=A5=20=EC=B6=94=EA=B0=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/App.js | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/src/App.js b/src/App.js index 4ec469c62..52646d487 100644 --- a/src/App.js +++ b/src/App.js @@ -8,6 +8,8 @@ class App { const userLottoAmount = this.computeLottoForPurchase(); const winningNumbers = this.separateString(userWinningNumber, ','); + + this.validateNotSatisfyThousandUnits(userPurchaseAmount); } async getPurchaseAmount(){ @@ -30,6 +32,11 @@ class App { return string.split(separator); } + validateNotSatisfyThousandUnits(purchaseAmount){ + if(purchaseAmount%1000 !== 0){ + throw new Error('[ERROR]구입 금액 에러, 1000원 단위 금액을 입력해주세요.') + } + } } export default App; \ No newline at end of file From e81f8dd85150fa4adea09e1b38f6ef5b2fc8acf3 Mon Sep 17 00:00:00 2001 From: Kim_Yjoo Date: Sun, 3 Nov 2024 18:52:45 +0900 Subject: [PATCH 14/37] =?UTF-8?q?feat=20:=20=EC=9E=85=EB=A0=A5=20=EC=98=88?= =?UTF-8?q?=EC=99=B8=EC=82=AC=ED=95=AD=20=EC=B6=94=EA=B0=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - 로또 구입 금액이 숫자가 아닌 값이 입력된 경우 - 로또 구입 금액에 소수가 입력된 경우. --- README.md | 5 +++-- src/App.js | 29 +++++++++++++++++++++++++---- 2 files changed, 28 insertions(+), 6 deletions(-) diff --git a/README.md b/README.md index 478078e0a..f23500478 100644 --- a/README.md +++ b/README.md @@ -44,8 +44,9 @@ - 보너스 번호는 숫자 하나이다. - #### 입력 예외 처리 목록 - - [ ] 로또 구입 금액이 1000원 단위가 아닐 경우. - - [ ] 로또 구입 금액이 소수인 경우. + - [x] 로또 구입 금액이 숫자가 아닌 값이 입력된 경우. + - [x] 로또 구입 금액이 1000원 단위가 아닐 경우. + - [x] 로또 구입 금액이 소수인 경우. - [ ] 당첨 번호 중 숫자가 아닌 특수문자가 있을 경우. - [ ] 로또 번호가 1에서 45사이의 숫자가 아닐 경우. - [ ] 로또 번호에 중복이 있을 경우. + 보너스 번호 포함. diff --git a/src/App.js b/src/App.js index 52646d487..a5a954fec 100644 --- a/src/App.js +++ b/src/App.js @@ -8,8 +8,11 @@ class App { const userLottoAmount = this.computeLottoForPurchase(); const winningNumbers = this.separateString(userWinningNumber, ','); - - this.validateNotSatisfyThousandUnits(userPurchaseAmount); + + this.validateDecimalNumber(userPurchaseAmount); + this.validateNotNumber(userPurchaseAmount); + this.validateNotThousandUnits(userPurchaseAmount); + this.validateHaveSpecialCharacters(userWinningNumber); } async getPurchaseAmount(){ @@ -32,11 +35,29 @@ class App { return string.split(separator); } - validateNotSatisfyThousandUnits(purchaseAmount){ - if(purchaseAmount%1000 !== 0){ + validateNotNumber(inputValue){ + const notNumber = new RegExp('[^0-9]+'); + if(notNumber.test(inputValue)){ + throw new Error('[ERROR]입력 에러, 금액 및 번호 입력 시 숫자만 입력해주세요.'); + } + } + validateDecimalNumber(inputValue){ + const decimalNumber = new RegExp('[.]+'); + if(decimalNumber.test(inputValue)){ + throw new Error('[ERROR]입력 에러, 금액 및 번호 입력 시 정수의 숫자만 입력해주세요.'); + } + } + validateNotThousandUnits(inputValue){ + if(inputValue%1000 !== 0){ throw new Error('[ERROR]구입 금액 에러, 1000원 단위 금액을 입력해주세요.') } } + validateHaveSpecialCharacters(inputValue){ + const matchWinningNumberFormat = new RegExp('[^\d],{1,1}|[a-zA-Z]|[\s]'); + if(matchWinningNumberFormat.test(inputValue)){ + throw new Error('[ERROR]당첨 번호 에러, 입력한 당첨번호의 형식이 맞지 않습니다.'); + } + } } export default App; \ No newline at end of file From cc10121d9ec65565f1b4d25242506ef7ab298857 Mon Sep 17 00:00:00 2001 From: Kim_Yjoo Date: Sun, 3 Nov 2024 19:03:27 +0900 Subject: [PATCH 15/37] =?UTF-8?q?feat=20:=20=EC=97=90=EB=9F=AC=EC=82=AC?= =?UTF-8?q?=ED=95=AD=20=EC=B6=94=EA=B0=80,=20=EB=A1=9C=EB=98=90=20?= =?UTF-8?q?=EB=B2=88=ED=98=B8=EA=B0=80=201=EC=97=90=EC=84=9C=2045=EC=82=AC?= =?UTF-8?q?=EC=9D=B4=EC=9D=98=20=EC=88=AB=EC=9E=90=EA=B0=80=20=EC=95=84?= =?UTF-8?q?=EB=8B=90=20=EA=B2=BD=EC=9A=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- README.md | 4 ++-- src/App.js | 10 +++++++++- 2 files changed, 11 insertions(+), 3 deletions(-) diff --git a/README.md b/README.md index f23500478..25d5ca76a 100644 --- a/README.md +++ b/README.md @@ -47,8 +47,8 @@ - [x] 로또 구입 금액이 숫자가 아닌 값이 입력된 경우. - [x] 로또 구입 금액이 1000원 단위가 아닐 경우. - [x] 로또 구입 금액이 소수인 경우. - - [ ] 당첨 번호 중 숫자가 아닌 특수문자가 있을 경우. - - [ ] 로또 번호가 1에서 45사이의 숫자가 아닐 경우. + - [x] 당첨 번호 중 숫자가 아닌 특수문자가 있을 경우. 당첨 번호 입력형식에 맞지 않은 경우. + - [x] 로또 번호가 1에서 45사이의 숫자가 아닐 경우. - [ ] 로또 번호에 중복이 있을 경우. + 보너스 번호 포함. - [ ] 로또 번호가 보너스 제외하고 6자리가 아닐 경우. - [ ] 보너스 번호가 숫자가 아닌 특수문자일 경우. diff --git a/src/App.js b/src/App.js index a5a954fec..0217ac6d0 100644 --- a/src/App.js +++ b/src/App.js @@ -13,6 +13,7 @@ class App { this.validateNotNumber(userPurchaseAmount); this.validateNotThousandUnits(userPurchaseAmount); this.validateHaveSpecialCharacters(userWinningNumber); + this.validateLottoNumberOutOfBounds(winningNumbers); } async getPurchaseAmount(){ @@ -53,11 +54,18 @@ class App { } } validateHaveSpecialCharacters(inputValue){ - const matchWinningNumberFormat = new RegExp('[^\d],{1,1}|[a-zA-Z]|[\s]'); + const matchWinningNumberFormat = new RegExp('/[^\d],{1,1}|[a-zA-Z]|[\s]/g'); if(matchWinningNumberFormat.test(inputValue)){ throw new Error('[ERROR]당첨 번호 에러, 입력한 당첨번호의 형식이 맞지 않습니다.'); } } + validateLottoNumberOutOfBounds(inputValue){ + inputValue.forEach((element) => { + if(element > 45 || element < 1){ + throw new Error('[ERROR]당첨 번호 에러, 로또 번호는 1에서 45사이의 숫자입니다.'); + } + }) + } } export default App; \ No newline at end of file From 856a452f9c39ac7340e97174fd3fa5a40ed97748 Mon Sep 17 00:00:00 2001 From: Kim_Yjoo Date: Sun, 3 Nov 2024 19:09:14 +0900 Subject: [PATCH 16/37] =?UTF-8?q?feat=20:=20=EC=97=90=EB=9F=AC=EC=82=AC?= =?UTF-8?q?=ED=95=AD=20=EC=B6=94=EA=B0=80,=20=EB=A1=9C=EB=98=90=20?= =?UTF-8?q?=EB=B2=88=ED=98=B8=EA=B0=80=206=EA=B0=9C=EC=9D=98=20=EC=88=AB?= =?UTF-8?q?=EC=9E=90=EA=B0=80=20=EC=95=84=EB=8B=90=20=EA=B2=BD=EC=9A=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- README.md | 2 +- src/App.js | 6 ++++++ 2 files changed, 7 insertions(+), 1 deletion(-) diff --git a/README.md b/README.md index 25d5ca76a..54a213623 100644 --- a/README.md +++ b/README.md @@ -50,7 +50,7 @@ - [x] 당첨 번호 중 숫자가 아닌 특수문자가 있을 경우. 당첨 번호 입력형식에 맞지 않은 경우. - [x] 로또 번호가 1에서 45사이의 숫자가 아닐 경우. - [ ] 로또 번호에 중복이 있을 경우. + 보너스 번호 포함. - - [ ] 로또 번호가 보너스 제외하고 6자리가 아닐 경우. + - [x] 로또 번호가 보너스 제외하고 6자리가 아닐 경우. - [ ] 보너스 번호가 숫자가 아닌 특수문자일 경우. - [ ] 로또 번호가 소수일 경우 diff --git a/src/App.js b/src/App.js index 0217ac6d0..49ac99733 100644 --- a/src/App.js +++ b/src/App.js @@ -14,6 +14,7 @@ class App { this.validateNotThousandUnits(userPurchaseAmount); this.validateHaveSpecialCharacters(userWinningNumber); this.validateLottoNumberOutOfBounds(winningNumbers); + this.validateLottoNumberAmount(winningNumbers); } async getPurchaseAmount(){ @@ -66,6 +67,11 @@ class App { } }) } + validateLottoNumberAmount(inputValue){ + if(inputValue.length > 6 || inputValue.length < 6){ + throw new Error('[ERROR]당첨 번호 에러, 로또 번호는 6개의 숫자를 입력해야합니다.'); + } + } } export default App; \ No newline at end of file From 9f6af40463b418b1f06c21ca9ea3c3a3784a09ae Mon Sep 17 00:00:00 2001 From: Kim_Yjoo Date: Sun, 3 Nov 2024 19:20:59 +0900 Subject: [PATCH 17/37] =?UTF-8?q?feat=20:=20=EC=97=90=EB=9F=AC=EC=82=AC?= =?UTF-8?q?=ED=95=AD=20=EC=B6=94=EA=B0=80,=20=EB=A1=9C=EB=98=90=20?= =?UTF-8?q?=EB=B2=88=ED=98=B8=EA=B0=80=20=EC=86=8C=EC=88=98=EC=9D=BC=20?= =?UTF-8?q?=EA=B2=BD=EC=9A=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- README.md | 2 +- src/App.js | 31 ++++++++++++++++++++----------- 2 files changed, 21 insertions(+), 12 deletions(-) diff --git a/README.md b/README.md index 54a213623..04fc11253 100644 --- a/README.md +++ b/README.md @@ -52,7 +52,7 @@ - [ ] 로또 번호에 중복이 있을 경우. + 보너스 번호 포함. - [x] 로또 번호가 보너스 제외하고 6자리가 아닐 경우. - [ ] 보너스 번호가 숫자가 아닌 특수문자일 경우. - - [ ] 로또 번호가 소수일 경우 + - [x] 로또 번호가 소수일 경우 ### 로또 게임 진행 - #### 당첨 로또 번호 생성 diff --git a/src/App.js b/src/App.js index 49ac99733..bda0b41c7 100644 --- a/src/App.js +++ b/src/App.js @@ -9,12 +9,13 @@ class App { const userLottoAmount = this.computeLottoForPurchase(); const winningNumbers = this.separateString(userWinningNumber, ','); - this.validateDecimalNumber(userPurchaseAmount); + this.validatePayDecimalNumber(userPurchaseAmount); this.validateNotNumber(userPurchaseAmount); this.validateNotThousandUnits(userPurchaseAmount); - this.validateHaveSpecialCharacters(userWinningNumber); - this.validateLottoNumberOutOfBounds(winningNumbers); - this.validateLottoNumberAmount(winningNumbers); + this.validateWinningNumberForm(userWinningNumber); + this.validateWinningNumberOutOfBounds(winningNumbers); + this.validateWinningNumberAmount(winningNumbers); + this.validateWinningNumberDecimal(winningNumbers); } async getPurchaseAmount(){ @@ -43,10 +44,10 @@ class App { throw new Error('[ERROR]입력 에러, 금액 및 번호 입력 시 숫자만 입력해주세요.'); } } - validateDecimalNumber(inputValue){ + validatePayDecimalNumber(inputValue){ const decimalNumber = new RegExp('[.]+'); if(decimalNumber.test(inputValue)){ - throw new Error('[ERROR]입력 에러, 금액 및 번호 입력 시 정수의 숫자만 입력해주세요.'); + throw new Error('[ERROR]입력 에러, 금액 입력 시 정수의 숫자만 입력해주세요.'); } } validateNotThousandUnits(inputValue){ @@ -54,24 +55,32 @@ class App { throw new Error('[ERROR]구입 금액 에러, 1000원 단위 금액을 입력해주세요.') } } - validateHaveSpecialCharacters(inputValue){ + validateWinningNumberForm(inputValue){ const matchWinningNumberFormat = new RegExp('/[^\d],{1,1}|[a-zA-Z]|[\s]/g'); if(matchWinningNumberFormat.test(inputValue)){ throw new Error('[ERROR]당첨 번호 에러, 입력한 당첨번호의 형식이 맞지 않습니다.'); } } - validateLottoNumberOutOfBounds(inputValue){ + validateWinningNumberOutOfBounds(inputValue){ inputValue.forEach((element) => { if(element > 45 || element < 1){ throw new Error('[ERROR]당첨 번호 에러, 로또 번호는 1에서 45사이의 숫자입니다.'); } - }) + }); } - validateLottoNumberAmount(inputValue){ + validateWinningNumberAmount(inputValue){ if(inputValue.length > 6 || inputValue.length < 6){ throw new Error('[ERROR]당첨 번호 에러, 로또 번호는 6개의 숫자를 입력해야합니다.'); } } -} + validateWinningNumberDecimal(inputValue){ + const decimalNumber = new RegExp('[.]+'); + inputValue.forEach((element) =>{ + if(decimalNumber.test(element)){ + throw new Error('[ERROR]당첨 번호 에러, 당첨 번호는 정수의 숫자만 입력해주세요.'); + } + }); + } +} export default App; \ No newline at end of file From 177ff2ccfe4fa12c4bdc58b886f8ad65eef895f1 Mon Sep 17 00:00:00 2001 From: Kim_Yjoo Date: Sun, 3 Nov 2024 19:22:31 +0900 Subject: [PATCH 18/37] =?UTF-8?q?docs=20:=20=EC=9E=85=EB=A0=A5=20=EC=98=88?= =?UTF-8?q?=EC=99=B8=20=EC=B2=98=EB=A6=AC=20=EB=AA=A9=EB=A1=9D=20=EA=B5=AC?= =?UTF-8?q?=EC=A1=B0=ED=99=94?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - 구입금액, 로또 번호, 보너스 번호로 구분지어 정리 --- README.md | 21 ++++++++++++--------- 1 file changed, 12 insertions(+), 9 deletions(-) diff --git a/README.md b/README.md index 04fc11253..c429a57da 100644 --- a/README.md +++ b/README.md @@ -44,15 +44,18 @@ - 보너스 번호는 숫자 하나이다. - #### 입력 예외 처리 목록 - - [x] 로또 구입 금액이 숫자가 아닌 값이 입력된 경우. - - [x] 로또 구입 금액이 1000원 단위가 아닐 경우. - - [x] 로또 구입 금액이 소수인 경우. - - [x] 당첨 번호 중 숫자가 아닌 특수문자가 있을 경우. 당첨 번호 입력형식에 맞지 않은 경우. - - [x] 로또 번호가 1에서 45사이의 숫자가 아닐 경우. - - [ ] 로또 번호에 중복이 있을 경우. + 보너스 번호 포함. - - [x] 로또 번호가 보너스 제외하고 6자리가 아닐 경우. - - [ ] 보너스 번호가 숫자가 아닌 특수문자일 경우. - - [x] 로또 번호가 소수일 경우 + - 구입 금액 + - [x] 로또 구입 금액이 숫자가 아닌 값이 입력된 경우. + - [x] 로또 구입 금액이 1000원 단위가 아닐 경우. + - [x] 로또 구입 금액이 소수인 경우. + - 로또 번호 + - [x] 로또 번호 중 숫자가 아닌 특수문자가 있을 경우. 로또 번호 입력형식에 맞지 않은 경우. + - [x] 로또 번호가 1에서 45사이의 숫자가 아닐 경우. + - [ ] 로또 번호에 중복이 있을 경우. + 보너스 번호 포함. + - [x] 로또 번호가 보너스 제외하고 6자리가 아닐 경우. + - [x] 로또 번호가 소수일 경우 + - 보너스 번호 + - [ ] 보너스 번호가 숫자가 아닌 특수문자일 경우. ### 로또 게임 진행 - #### 당첨 로또 번호 생성 From 89983976b51d35220ea366bd1768a8228df557c0 Mon Sep 17 00:00:00 2001 From: Kim_Yjoo Date: Sun, 3 Nov 2024 19:31:50 +0900 Subject: [PATCH 19/37] =?UTF-8?q?feat=20:=20=EC=97=90=EB=9F=AC=EC=82=AC?= =?UTF-8?q?=ED=95=AD=20=EC=B6=94=EA=B0=80,=20=EB=B3=B4=EB=84=88=EC=8A=A4?= =?UTF-8?q?=20=EB=B2=88=ED=98=B8=EA=B0=80=201=EC=97=90=EC=84=9C=2045?= =?UTF-8?q?=EC=82=AC=EC=9D=B4=EC=9D=98=20=EC=88=AB=EC=9E=90=EA=B0=80=20?= =?UTF-8?q?=EC=95=84=EB=8B=8C=20=EA=B2=BD=EC=9A=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/App.js | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/src/App.js b/src/App.js index bda0b41c7..d7a1ea3ae 100644 --- a/src/App.js +++ b/src/App.js @@ -16,6 +16,7 @@ class App { this.validateWinningNumberOutOfBounds(winningNumbers); this.validateWinningNumberAmount(winningNumbers); this.validateWinningNumberDecimal(winningNumbers); + this.validateBonusNumberOutOfBounds(userWinningBonus); } async getPurchaseAmount(){ @@ -81,6 +82,11 @@ class App { } }); } + validateBonusNumberOutOfBounds(inputValue){ + if(inputValue > 45 || inputValue < 1){ + throw new Error('[ERROR]보너스 번호 에러, 보너스 번호는 1에서 45사이의 숫자입니다.'); + } + } } export default App; \ No newline at end of file From 3aaa530456f04706b611590e44f527de0a5c6c9a Mon Sep 17 00:00:00 2001 From: Kim_Yjoo Date: Sun, 3 Nov 2024 19:32:06 +0900 Subject: [PATCH 20/37] =?UTF-8?q?docs=20:=20=EC=9E=85=EB=A0=A5=20=EC=98=88?= =?UTF-8?q?=EC=99=B8=20=EC=B2=98=EB=A6=AC=20=EC=B6=94=EA=B0=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- README.md | 3 +++ 1 file changed, 3 insertions(+) diff --git a/README.md b/README.md index c429a57da..b5a377676 100644 --- a/README.md +++ b/README.md @@ -56,6 +56,9 @@ - [x] 로또 번호가 소수일 경우 - 보너스 번호 - [ ] 보너스 번호가 숫자가 아닌 특수문자일 경우. + - [x] 보너스 번호가 1에서 45사이의 숫자가 아닐 경우. + - [ ] 보너스 번호가 중복일 경우 + - [ ] 보너스 번호가 소수일 경우 ### 로또 게임 진행 - #### 당첨 로또 번호 생성 From d66d87154e3bc4b88093d0c1b6493ee780285dbf Mon Sep 17 00:00:00 2001 From: Kim_Yjoo Date: Sun, 3 Nov 2024 19:44:56 +0900 Subject: [PATCH 21/37] =?UTF-8?q?feat=20:=20=EC=97=90=EB=9F=AC=EC=82=AC?= =?UTF-8?q?=ED=95=AD=20=EC=B6=94=EA=B0=80,=20=EB=B3=B4=EB=84=88=EC=8A=A4?= =?UTF-8?q?=EB=B2=88=ED=98=B8=EA=B0=80=20=EC=86=8C=EC=88=98=EC=9D=BC=20?= =?UTF-8?q?=EA=B2=BD=EC=9A=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- README.md | 2 +- src/App.js | 25 ++++++++++++++++--------- 2 files changed, 17 insertions(+), 10 deletions(-) diff --git a/README.md b/README.md index b5a377676..69724288b 100644 --- a/README.md +++ b/README.md @@ -58,7 +58,7 @@ - [ ] 보너스 번호가 숫자가 아닌 특수문자일 경우. - [x] 보너스 번호가 1에서 45사이의 숫자가 아닐 경우. - [ ] 보너스 번호가 중복일 경우 - - [ ] 보너스 번호가 소수일 경우 + - [x] 보너스 번호가 소수일 경우 ### 로또 게임 진행 - #### 당첨 로또 번호 생성 diff --git a/src/App.js b/src/App.js index d7a1ea3ae..b367d0306 100644 --- a/src/App.js +++ b/src/App.js @@ -4,19 +4,20 @@ class App { async run() { const userPurchaseAmount = await this.getPurchaseAmount(); const userWinningNumber = await this.getUserWinningNumber(); - const userWinningBonus = await this.getWinningBonus(); + const userBonusNumber = await this.getWinningBonus(); const userLottoAmount = this.computeLottoForPurchase(); const winningNumbers = this.separateString(userWinningNumber, ','); - this.validatePayDecimalNumber(userPurchaseAmount); - this.validateNotNumber(userPurchaseAmount); - this.validateNotThousandUnits(userPurchaseAmount); - this.validateWinningNumberForm(userWinningNumber); - this.validateWinningNumberOutOfBounds(winningNumbers); - this.validateWinningNumberAmount(winningNumbers); - this.validateWinningNumberDecimal(winningNumbers); - this.validateBonusNumberOutOfBounds(userWinningBonus); + // this.validatePayDecimalNumber(userPurchaseAmount); + // this.validateNotNumber(userPurchaseAmount); + // this.validateNotThousandUnits(userPurchaseAmount); + // this.validateWinningNumberForm(userWinningNumber); + // this.validateWinningNumberOutOfBounds(winningNumbers); + // this.validateWinningNumberAmount(winningNumbers); + // this.validateWinningNumberDecimal(winningNumbers); + // this.validateBonusNumberOutOfBounds(userBonusNumber); + this.validateBonusNumberDecimal(userBonusNumber) } async getPurchaseAmount(){ @@ -87,6 +88,12 @@ class App { throw new Error('[ERROR]보너스 번호 에러, 보너스 번호는 1에서 45사이의 숫자입니다.'); } } + validateBonusNumberDecimal(inputValue){ + const decimalNumber = new RegExp('[.]+'); + if(decimalNumber.test(inputValue)){ + throw new Error('[ERROR]보너스 번호 에러, 보너스 번호는 정수의 숫자만 입력해주세요.'); + } + } } export default App; \ No newline at end of file From ead5527826bcf668820891dc19eee2ce27b4f67e Mon Sep 17 00:00:00 2001 From: Kim_Yjoo Date: Sun, 3 Nov 2024 23:33:08 +0900 Subject: [PATCH 22/37] =?UTF-8?q?refactor=20:=20=EC=99=84=EC=84=B1?= =?UTF-8?q?=EB=90=9C=20=EC=82=AC=EC=9A=A9=EC=9E=90=20=EC=9E=85=EB=A0=A5=20?= =?UTF-8?q?=EA=B3=BC=EC=A0=95=EC=9D=84=20MVC=20=ED=8C=A8=ED=84=B4=EC=9D=84?= =?UTF-8?q?=20=EC=A0=81=EC=9A=A9=EC=8B=9C=EC=BC=9C=EC=84=9C=20=EB=A6=AC?= =?UTF-8?q?=ED=8E=99=ED=86=A0=EB=A7=81=EC=9D=84=20=EC=A7=84=ED=96=89?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - LottoGameController : 로또 게임 프로세스 진행 - LottoGameView : 로또 게임의 입출력 담당 - LottoGameService : 로또 게임의 기능 및 속성 관리 - App : 컨트롤러 생성 및 로또 게임 실행 --- src/App.js | 101 ++++--------------------------- src/LottoGameController.js | 34 +++++++++++ src/LottoGameService.js | 5 ++ src/LottoGameView.js | 20 ++++++ src/bonusNumberValidatePipe.js | 7 +++ src/parser.js | 14 +++++ src/purchaseValidatePipe.js | 9 +++ src/validate.js | 55 +++++++++++++++++ src/winningNumberValidatePipe.js | 9 +++ 9 files changed, 164 insertions(+), 90 deletions(-) create mode 100644 src/LottoGameController.js create mode 100644 src/LottoGameService.js create mode 100644 src/LottoGameView.js create mode 100644 src/bonusNumberValidatePipe.js create mode 100644 src/parser.js create mode 100644 src/purchaseValidatePipe.js create mode 100644 src/validate.js create mode 100644 src/winningNumberValidatePipe.js diff --git a/src/App.js b/src/App.js index b367d0306..1fd77ccf2 100644 --- a/src/App.js +++ b/src/App.js @@ -1,98 +1,19 @@ -import {Console} from '@woowacourse/mission-utils' +import LottoGameController from './LottoGameController.js' +import LottoGameView from './LottoGameView.js' +import LottoGameService from './LottoGameService.js' class App { - async run() { - const userPurchaseAmount = await this.getPurchaseAmount(); - const userWinningNumber = await this.getUserWinningNumber(); - const userBonusNumber = await this.getWinningBonus(); - - const userLottoAmount = this.computeLottoForPurchase(); - const winningNumbers = this.separateString(userWinningNumber, ','); - - // this.validatePayDecimalNumber(userPurchaseAmount); - // this.validateNotNumber(userPurchaseAmount); - // this.validateNotThousandUnits(userPurchaseAmount); - // this.validateWinningNumberForm(userWinningNumber); - // this.validateWinningNumberOutOfBounds(winningNumbers); - // this.validateWinningNumberAmount(winningNumbers); - // this.validateWinningNumberDecimal(winningNumbers); - // this.validateBonusNumberOutOfBounds(userBonusNumber); - this.validateBonusNumberDecimal(userBonusNumber) - } - - async getPurchaseAmount(){ - return Console.readLineAsync('구입금액을 입력해 주세요.'); - } + controller; - async getUserWinningNumber(){ - return Console.readLineAsync('당첨 번호를 입력해 주세요.'); + constructor(){ + this.controller = new LottoGameController( + new LottoGameView(), + new LottoGameService() + ) } - async getWinningBonus(){ - return Console.readLineAsync('보너스 번호를 입력해 주세요.'); - } - - computeLottoForPurchase(purchaseAmount){ - return purchaseAmount / 1000; - } - - separateString(string, separator){ - return string.split(separator); - } - - validateNotNumber(inputValue){ - const notNumber = new RegExp('[^0-9]+'); - if(notNumber.test(inputValue)){ - throw new Error('[ERROR]입력 에러, 금액 및 번호 입력 시 숫자만 입력해주세요.'); - } - } - validatePayDecimalNumber(inputValue){ - const decimalNumber = new RegExp('[.]+'); - if(decimalNumber.test(inputValue)){ - throw new Error('[ERROR]입력 에러, 금액 입력 시 정수의 숫자만 입력해주세요.'); - } - } - validateNotThousandUnits(inputValue){ - if(inputValue%1000 !== 0){ - throw new Error('[ERROR]구입 금액 에러, 1000원 단위 금액을 입력해주세요.') - } - } - validateWinningNumberForm(inputValue){ - const matchWinningNumberFormat = new RegExp('/[^\d],{1,1}|[a-zA-Z]|[\s]/g'); - if(matchWinningNumberFormat.test(inputValue)){ - throw new Error('[ERROR]당첨 번호 에러, 입력한 당첨번호의 형식이 맞지 않습니다.'); - } - } - validateWinningNumberOutOfBounds(inputValue){ - inputValue.forEach((element) => { - if(element > 45 || element < 1){ - throw new Error('[ERROR]당첨 번호 에러, 로또 번호는 1에서 45사이의 숫자입니다.'); - } - }); - } - validateWinningNumberAmount(inputValue){ - if(inputValue.length > 6 || inputValue.length < 6){ - throw new Error('[ERROR]당첨 번호 에러, 로또 번호는 6개의 숫자를 입력해야합니다.'); - } - } - validateWinningNumberDecimal(inputValue){ - const decimalNumber = new RegExp('[.]+'); - inputValue.forEach((element) =>{ - if(decimalNumber.test(element)){ - throw new Error('[ERROR]당첨 번호 에러, 당첨 번호는 정수의 숫자만 입력해주세요.'); - } - }); - } - validateBonusNumberOutOfBounds(inputValue){ - if(inputValue > 45 || inputValue < 1){ - throw new Error('[ERROR]보너스 번호 에러, 보너스 번호는 1에서 45사이의 숫자입니다.'); - } - } - validateBonusNumberDecimal(inputValue){ - const decimalNumber = new RegExp('[.]+'); - if(decimalNumber.test(inputValue)){ - throw new Error('[ERROR]보너스 번호 에러, 보너스 번호는 정수의 숫자만 입력해주세요.'); - } + async run() { + await this.controller.run(); } } diff --git a/src/LottoGameController.js b/src/LottoGameController.js new file mode 100644 index 000000000..b51c6b98d --- /dev/null +++ b/src/LottoGameController.js @@ -0,0 +1,34 @@ +import {validateWinningNumberForm} from './validate.js' +import {purchaseValidatePipe} from './purchaseValidatePipe.js' +import {winningNumberValidatePipe} from './winningNumberValidatePipe.js' +import {bonusNumberValidatePipe} from './bonusNumberValidatePipe.js' +import parser from './parser.js' + +class LottoGameController{ + constructor(view, service){ + this.view = view; + this.service = service + } + + static onGetPurchaseAmount(purchaseAmount){ + purchaseValidatePipe(purchaseAmount); + return parser.divideThousands(purchaseAmount); + } + static onGetWinningNumber(winningNumberString){ + validateWinningNumberForm(winningNumberString); + const winningNumbers = parser.separateString(winningNumberString, ','); + winningNumberValidatePipe(winningNumbers); + return winningNumbers; + } + static onGetBonusNumber(bonusNumber){ + bonusNumberValidatePipe(bonusNumber); + } + + async run(){ + const purchaseAmount = await this.view.getPurchaseAmount(); + const winningNumbers = await this.view.getWinningNumber(); + const bonusNumber = await this.view.getBonusNumber(); + } +} + +export default LottoGameController \ No newline at end of file diff --git a/src/LottoGameService.js b/src/LottoGameService.js new file mode 100644 index 000000000..bd4f34a78 --- /dev/null +++ b/src/LottoGameService.js @@ -0,0 +1,5 @@ +class LottoGameService{ + +} + +export default LottoGameService \ No newline at end of file diff --git a/src/LottoGameView.js b/src/LottoGameView.js new file mode 100644 index 000000000..207f65084 --- /dev/null +++ b/src/LottoGameView.js @@ -0,0 +1,20 @@ +import {Console} from '@woowacourse/mission-utils' +import LottoGameController from './LottoGameController.js' + +class LottoGameView{ + async getPurchaseAmount(){ + const input = await Console.readLineAsync('구입금액을 입력해 주세요.'); + return LottoGameController.onGetPurchaseAmount(input); + } + + async getWinningNumber(){ + const input = await Console.readLineAsync('당첨 번호를 입력해 주세요.'); + return LottoGameController.onGetWinningNumber(input); + } + + async getBonusNumber(){ + const input = await Console.readLineAsync('보너스 번호를 입력해 주세요.'); + return LottoGameController.onGetBonusNumber(input); + } +} +export default LottoGameView \ No newline at end of file diff --git a/src/bonusNumberValidatePipe.js b/src/bonusNumberValidatePipe.js new file mode 100644 index 000000000..1514f4053 --- /dev/null +++ b/src/bonusNumberValidatePipe.js @@ -0,0 +1,7 @@ +import {validateBonusNumberOutOfBounds, + validateBonusNumberDecimal} from './validate.js' + +export const bonusNumberValidatePipe = (bonusNumber) => { + validateBonusNumberOutOfBounds(bonusNumber); + validateBonusNumberDecimal(bonusNumber); +} \ No newline at end of file diff --git a/src/parser.js b/src/parser.js new file mode 100644 index 000000000..205071ee9 --- /dev/null +++ b/src/parser.js @@ -0,0 +1,14 @@ +const divideThousands = (element) => { + return element / 1000; +} + +const separateString = (element, separator) => { + return element.split(separator); +} + +const parser = { + divideThousands, + separateString, +} + +export default parser; \ No newline at end of file diff --git a/src/purchaseValidatePipe.js b/src/purchaseValidatePipe.js new file mode 100644 index 000000000..aadbe14e6 --- /dev/null +++ b/src/purchaseValidatePipe.js @@ -0,0 +1,9 @@ +import {validateNotNumber, + validateNotThousandUnits, + validatePayDecimalNumber} from './validate.js' + +export const purchaseValidatePipe = (purchaseAmount) => { + validateNotNumber(purchaseAmount); + validateNotThousandUnits(purchaseAmount); + validatePayDecimalNumber(purchaseAmount); +} diff --git a/src/validate.js b/src/validate.js new file mode 100644 index 000000000..cae44bd4e --- /dev/null +++ b/src/validate.js @@ -0,0 +1,55 @@ + +export const validateNotNumber = (inputValue) => { + const notNumber = new RegExp('[^0-9]+'); + if(notNumber.test(inputValue)){ + throw new Error('[ERROR]입력 에러, 금액 및 번호 입력 시 숫자만 입력해주세요.'); + } +} +export const validatePayDecimalNumber = (inputValue) => { + const decimalNumber = new RegExp('[.]+'); + if(decimalNumber.test(inputValue)){ + throw new Error('[ERROR]입력 에러, 금액 입력 시 정수의 숫자만 입력해주세요.'); + } +} +export const validateNotThousandUnits = (inputValue) => { + if(inputValue%1000 !== 0){ + throw new Error('[ERROR]구입 금액 에러, 1000원 단위 금액을 입력해주세요.') + } +} +export const validateWinningNumberForm = (inputValue) => { + const matchWinningNumberFormat = new RegExp('/[^\d],{1,1}|[a-zA-Z]|[\s]/g'); + if(matchWinningNumberFormat.test(inputValue)){ + throw new Error('[ERROR]당첨 번호 에러, 입력한 당첨번호의 형식이 맞지 않습니다.'); + } +} +export const validateWinningNumberOutOfBounds = (inputValue) => { + inputValue.forEach((element) => { + if(element > 45 || element < 1){ + throw new Error('[ERROR]당첨 번호 에러, 로또 번호는 1에서 45사이의 숫자입니다.'); + } + }); +} +export const validateWinningNumberAmount = (inputValue) => { + if(inputValue.length > 6 || inputValue.length < 6){ + throw new Error('[ERROR]당첨 번호 에러, 로또 번호는 6개의 숫자를 입력해야합니다.'); + } +} +export const validateWinningNumberDecimal = (inputValue) => { + const decimalNumber = new RegExp('[.]+'); + inputValue.forEach((element) =>{ + if(decimalNumber.test(element)){ + throw new Error('[ERROR]당첨 번호 에러, 당첨 번호는 정수의 숫자만 입력해주세요.'); + } + }); +} +export const validateBonusNumberOutOfBounds = (inputValue) => { + if(inputValue > 45 || inputValue < 1){ + throw new Error('[ERROR]보너스 번호 에러, 보너스 번호는 1에서 45사이의 숫자입니다.'); + } +} +export const validateBonusNumberDecimal = (inputValue) => { + const decimalNumber = new RegExp('[.]+'); + if(decimalNumber.test(inputValue)){ + throw new Error('[ERROR]보너스 번호 에러, 보너스 번호는 정수의 숫자만 입력해주세요.'); + } +} \ No newline at end of file diff --git a/src/winningNumberValidatePipe.js b/src/winningNumberValidatePipe.js new file mode 100644 index 000000000..8365e5c6a --- /dev/null +++ b/src/winningNumberValidatePipe.js @@ -0,0 +1,9 @@ +import {validateWinningNumberOutOfBounds, + validateWinningNumberAmount, + validateWinningNumberDecimal} from './validate.js' + +export const winningNumberValidatePipe = (winningNumbers) => { + validateWinningNumberOutOfBounds(winningNumbers); + validateWinningNumberAmount(winningNumbers); + validateWinningNumberDecimal(winningNumbers); +} \ No newline at end of file From f1e72f88efbbdacc57735d64335714c6c614e98b Mon Sep 17 00:00:00 2001 From: Kim_Yjoo Date: Sun, 3 Nov 2024 23:50:27 +0900 Subject: [PATCH 23/37] =?UTF-8?q?feat(randomNumber)=20:=20=EB=AC=B4?= =?UTF-8?q?=EC=9E=91=EC=9C=84=20=EC=88=AB=EC=9E=90=20=EC=83=9D=EC=84=B1=20?= =?UTF-8?q?=EA=B8=B0=EB=8A=A5=20=EC=B6=94=EA=B0=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - getUniqueRandomNumbers : 설정한 범위 내 무작위 숫자를 중복 없이 설정한 개수 만큼 생성 - getRandomNumber : 설정한 범위 내 무작위 숫자를 생성 --- src/LottoGameController.js | 4 ++-- src/LottoGameService.js | 2 +- src/{ => utils}/parser.js | 0 src/utils/randomNumber.js | 14 ++++++++++++++ 4 files changed, 17 insertions(+), 3 deletions(-) rename src/{ => utils}/parser.js (100%) create mode 100644 src/utils/randomNumber.js diff --git a/src/LottoGameController.js b/src/LottoGameController.js index b51c6b98d..8e452cf05 100644 --- a/src/LottoGameController.js +++ b/src/LottoGameController.js @@ -2,7 +2,7 @@ import {validateWinningNumberForm} from './validate.js' import {purchaseValidatePipe} from './purchaseValidatePipe.js' import {winningNumberValidatePipe} from './winningNumberValidatePipe.js' import {bonusNumberValidatePipe} from './bonusNumberValidatePipe.js' -import parser from './parser.js' +import parser from './utils/parser.js' class LottoGameController{ constructor(view, service){ @@ -23,7 +23,7 @@ class LottoGameController{ static onGetBonusNumber(bonusNumber){ bonusNumberValidatePipe(bonusNumber); } - + async run(){ const purchaseAmount = await this.view.getPurchaseAmount(); const winningNumbers = await this.view.getWinningNumber(); diff --git a/src/LottoGameService.js b/src/LottoGameService.js index bd4f34a78..9a41228dc 100644 --- a/src/LottoGameService.js +++ b/src/LottoGameService.js @@ -1,5 +1,5 @@ class LottoGameService{ - + } export default LottoGameService \ No newline at end of file diff --git a/src/parser.js b/src/utils/parser.js similarity index 100% rename from src/parser.js rename to src/utils/parser.js diff --git a/src/utils/randomNumber.js b/src/utils/randomNumber.js new file mode 100644 index 000000000..6642a4475 --- /dev/null +++ b/src/utils/randomNumber.js @@ -0,0 +1,14 @@ +import {MissionUtils} from '@woowacourse/mission-utils' + +const getUniqueRandomNumbers = (minNumber, maxNumber, amount) => { + return MissionUtils.Random.pickUniqueNumbersInRange(minNumber, maxNumber, amount); +}; + +const getRandomNumber = (minNumber, maxNumber) => { + return MissionUtils.Random.pickNumberInRange(minNumber, maxNumber); +}; + +export const randomNumber = { + getRandomNumber, + getUniqueRandomNumbers, +}; From 3dbfabfdf9a4dd3f494371e5ceacd14af72e13b6 Mon Sep 17 00:00:00 2001 From: Kim_Yjoo Date: Sun, 3 Nov 2024 23:57:43 +0900 Subject: [PATCH 24/37] =?UTF-8?q?feat=20:=20=EA=B5=AC=EC=9E=85=ED=95=9C=20?= =?UTF-8?q?=20=EA=B0=9C=EC=88=98=20=EB=A7=8C=ED=81=BC=20=EB=A1=9C=EB=98=90?= =?UTF-8?q?=EB=A5=BC=20=EC=83=9D=EC=84=B1=ED=95=98=EB=8A=94=20=EA=B8=B0?= =?UTF-8?q?=EB=8A=A5=20=EC=B6=94=EA=B0=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- README.md | 4 ++-- src/LottoGameService.js | 6 +++++- 2 files changed, 7 insertions(+), 3 deletions(-) diff --git a/README.md b/README.md index 69724288b..c671bbaee 100644 --- a/README.md +++ b/README.md @@ -62,8 +62,8 @@ ### 로또 게임 진행 - #### 당첨 로또 번호 생성 - - [ ] 랜덤한 당첨 번호를 생성한다. - - [ ] 랜덤한 보너스 번호를 생성한다. + - [x] 랜덤한 당첨 번호를 생성한다. + - [x] 랜덤한 보너스 번호를 생성한다. - #### 사용자의 로또 당첨 여부 확인 - [ ] 사용자의 당첨 번호와 비교했을 때 일치하는 개수를 구한다. - [ ] 사용자의 보너스 번호와 비교했을 때 일치하는지 확인한다. diff --git a/src/LottoGameService.js b/src/LottoGameService.js index 9a41228dc..26a9412b4 100644 --- a/src/LottoGameService.js +++ b/src/LottoGameService.js @@ -1,5 +1,9 @@ +import { randomNumber } from "./utils/randomNumber" + class LottoGameService{ - + makeLottos(amount) { + return Array.from({length: amount}, () => randomNumber.getUniqueRandomNumbers(1, 45, amount)); + } } export default LottoGameService \ No newline at end of file From 5032c891f5edb9ed1700efbd7bd4d6df67c6b4d3 Mon Sep 17 00:00:00 2001 From: Kim_Yjoo Date: Mon, 4 Nov 2024 00:02:37 +0900 Subject: [PATCH 25/37] =?UTF-8?q?chore=20:=20=EB=A1=9C=EB=98=90=20?= =?UTF-8?q?=EC=83=9D=EC=84=B1=20=EA=B3=BC=EC=A0=95=EC=97=90=EC=84=9C=20?= =?UTF-8?q?=EB=9E=9C=EB=8D=A4=ED=95=9C=20=EB=B3=B4=EB=84=88=EC=8A=A4=20?= =?UTF-8?q?=EB=B2=88=ED=98=B8=EB=A5=BC=20=EC=83=9D=EC=84=B1=ED=95=9C?= =?UTF-8?q?=EB=8B=A4=EB=8A=94=20=EC=98=A4=ED=95=B4=EA=B0=80=20=EC=9E=88?= =?UTF-8?q?=EC=97=88=EA=B8=B0=EC=97=90,=20=EC=9D=B4=EB=A5=BC=20=EC=A0=9C?= =?UTF-8?q?=EA=B1=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- README.md | 1 - src/LottoGameService.js | 4 ++-- src/utils/random.js | 10 ++++++++++ src/utils/randomNumber.js | 14 -------------- 4 files changed, 12 insertions(+), 17 deletions(-) create mode 100644 src/utils/random.js delete mode 100644 src/utils/randomNumber.js diff --git a/README.md b/README.md index c671bbaee..a1e7ec566 100644 --- a/README.md +++ b/README.md @@ -63,7 +63,6 @@ ### 로또 게임 진행 - #### 당첨 로또 번호 생성 - [x] 랜덤한 당첨 번호를 생성한다. - - [x] 랜덤한 보너스 번호를 생성한다. - #### 사용자의 로또 당첨 여부 확인 - [ ] 사용자의 당첨 번호와 비교했을 때 일치하는 개수를 구한다. - [ ] 사용자의 보너스 번호와 비교했을 때 일치하는지 확인한다. diff --git a/src/LottoGameService.js b/src/LottoGameService.js index 26a9412b4..972cfc10e 100644 --- a/src/LottoGameService.js +++ b/src/LottoGameService.js @@ -1,8 +1,8 @@ -import { randomNumber } from "./utils/randomNumber" +import { random } from "./utils/random" class LottoGameService{ makeLottos(amount) { - return Array.from({length: amount}, () => randomNumber.getUniqueRandomNumbers(1, 45, amount)); + return Array.from({length: amount}, () => random.makeUniqueNumbers(1, 45, amount)); } } diff --git a/src/utils/random.js b/src/utils/random.js new file mode 100644 index 000000000..83f98edfd --- /dev/null +++ b/src/utils/random.js @@ -0,0 +1,10 @@ +import {MissionUtils} from '@woowacourse/mission-utils' + +const makeUniqueNumbers = (minNumber, maxNumber, amount) => { + return MissionUtils.Random.pickUniqueNumbersInRange(minNumber, maxNumber, amount); +}; + + +export const random = { + makeUniqueNumbers, +}; diff --git a/src/utils/randomNumber.js b/src/utils/randomNumber.js deleted file mode 100644 index 6642a4475..000000000 --- a/src/utils/randomNumber.js +++ /dev/null @@ -1,14 +0,0 @@ -import {MissionUtils} from '@woowacourse/mission-utils' - -const getUniqueRandomNumbers = (minNumber, maxNumber, amount) => { - return MissionUtils.Random.pickUniqueNumbersInRange(minNumber, maxNumber, amount); -}; - -const getRandomNumber = (minNumber, maxNumber) => { - return MissionUtils.Random.pickNumberInRange(minNumber, maxNumber); -}; - -export const randomNumber = { - getRandomNumber, - getUniqueRandomNumbers, -}; From 4714cd24ad442504447338bcdb0a1bf7dc46a626 Mon Sep 17 00:00:00 2001 From: Kim_Yjoo Date: Mon, 4 Nov 2024 02:07:35 +0900 Subject: [PATCH 26/37] =?UTF-8?q?docs=20:=20=EB=A1=9C=EB=98=90=20=EB=8B=B9?= =?UTF-8?q?=EC=B2=A8=20=EC=97=AC=EB=B6=80=20=ED=99=95=EC=9D=B8=20=EA=B3=BC?= =?UTF-8?q?=EC=A0=95=20=EC=88=98=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- README.md | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/README.md b/README.md index a1e7ec566..d5b7112b1 100644 --- a/README.md +++ b/README.md @@ -64,8 +64,7 @@ - #### 당첨 로또 번호 생성 - [x] 랜덤한 당첨 번호를 생성한다. - #### 사용자의 로또 당첨 여부 확인 - - [ ] 사용자의 당첨 번호와 비교했을 때 일치하는 개수를 구한다. - - [ ] 사용자의 보너스 번호와 비교했을 때 일치하는지 확인한다. + - [ ] 사용자의 당첨 번호와 보너스 번호를 비교했을 때 일치하는 개수를 구한다. - #### 사용자의 로또 게임 결과 판단 - [ ] 사용자의 로또가 몇 등 당첨인지 판단한다. - [ ] 당첨 금액 및 투입 금액에 따른 사용자의 수익률을 계산한다. From fbaa233ec2464a23c88b8814fe3c509ead57a61f Mon Sep 17 00:00:00 2001 From: Kim_Yjoo Date: Mon, 4 Nov 2024 03:49:57 +0900 Subject: [PATCH 27/37] =?UTF-8?q?feat=20:=20=EB=A1=9C=EB=98=90=20=ED=81=B4?= =?UTF-8?q?=EB=9E=98=EC=8A=A4=20=EB=B0=8F=20=EB=A1=9C=EB=98=90=20=EC=83=81?= =?UTF-8?q?=EC=86=8D=20=ED=81=B4=EB=9E=98=EC=8A=A4=20=EC=83=9D=EC=84=B1?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - lotto : 로또 부모 클래스, 로또 숫자들과 로또 개수의 예외를 확인 - IssuedLotto : 발행된 로또, 사용자의 구매에 따라 생성된 로또 - AnswerLotto : 사용자의 입력에 따라 정해진 정답 로또 --- src/App.js | 1 + src/Lotto.js | 18 ------------------ src/Lotto/AnswerLotto.js | 17 +++++++++++++++++ src/Lotto/Lotto.js | 19 +++++++++++++++++++ src/LottoGameController.js | 2 +- src/LottoGameService.js | 6 +----- src/lottoNumberValidatePipe.js | 7 +++++++ src/validate.js | 6 +++--- src/winningNumberValidatePipe.js | 9 --------- 9 files changed, 49 insertions(+), 36 deletions(-) delete mode 100644 src/Lotto.js create mode 100644 src/Lotto/AnswerLotto.js create mode 100644 src/Lotto/Lotto.js create mode 100644 src/lottoNumberValidatePipe.js delete mode 100644 src/winningNumberValidatePipe.js diff --git a/src/App.js b/src/App.js index 1fd77ccf2..7b17e0513 100644 --- a/src/App.js +++ b/src/App.js @@ -1,3 +1,4 @@ +import {Console} from '@woowacourse/mission-utils' import LottoGameController from './LottoGameController.js' import LottoGameView from './LottoGameView.js' import LottoGameService from './LottoGameService.js' diff --git a/src/Lotto.js b/src/Lotto.js deleted file mode 100644 index cb0b1527e..000000000 --- a/src/Lotto.js +++ /dev/null @@ -1,18 +0,0 @@ -class Lotto { - #numbers; - - constructor(numbers) { - this.#validate(numbers); - this.#numbers = numbers; - } - - #validate(numbers) { - if (numbers.length !== 6) { - throw new Error("[ERROR] 로또 번호는 6개여야 합니다."); - } - } - - // TODO: 추가 기능 구현 -} - -export default Lotto; diff --git a/src/Lotto/AnswerLotto.js b/src/Lotto/AnswerLotto.js new file mode 100644 index 000000000..f20b051c0 --- /dev/null +++ b/src/Lotto/AnswerLotto.js @@ -0,0 +1,17 @@ +import lottoNumberValidatePipe from '../lottoNumberValidatePipe.js' +import bonusNumberValidatePipe from '../bonusNumberValidatePipe.js' +class AnswerLotto extends Lotto { + #bonus; + + constructor(numbers, bonus){ + super(numbers); + this.#validateAnswerLotto(numbers, bonus); + this.#bonus = bonus; + } + + #validateAnswerLotto(numbers, bonus){ + lottoNumberValidatePipe(numbers); + bonusNumberValidatePipe(bonus); + } + +} \ No newline at end of file diff --git a/src/Lotto/Lotto.js b/src/Lotto/Lotto.js new file mode 100644 index 000000000..40951d0a2 --- /dev/null +++ b/src/Lotto/Lotto.js @@ -0,0 +1,19 @@ +import { validateLottoNumberAmount } from "../validate.js" + +class Lotto { + #numbers; + + constructor(numbers) { + this.#validate(numbers); + this.#numbers = numbers.sort(); + } + + #validate(numbers) { + validateLottoNumberAmount(numbers); + } + getNumbers() { + return this.#numbers; + } +} + +export default Lotto; diff --git a/src/LottoGameController.js b/src/LottoGameController.js index 8e452cf05..6c2d37b5b 100644 --- a/src/LottoGameController.js +++ b/src/LottoGameController.js @@ -1,6 +1,6 @@ import {validateWinningNumberForm} from './validate.js' import {purchaseValidatePipe} from './purchaseValidatePipe.js' -import {winningNumberValidatePipe} from './winningNumberValidatePipe.js' +import {winningNumberValidatePipe} from './lottoNumberValidatePipe.js' import {bonusNumberValidatePipe} from './bonusNumberValidatePipe.js' import parser from './utils/parser.js' diff --git a/src/LottoGameService.js b/src/LottoGameService.js index 972cfc10e..9a41228dc 100644 --- a/src/LottoGameService.js +++ b/src/LottoGameService.js @@ -1,9 +1,5 @@ -import { random } from "./utils/random" - class LottoGameService{ - makeLottos(amount) { - return Array.from({length: amount}, () => random.makeUniqueNumbers(1, 45, amount)); - } + } export default LottoGameService \ No newline at end of file diff --git a/src/lottoNumberValidatePipe.js b/src/lottoNumberValidatePipe.js new file mode 100644 index 000000000..fd9ed5181 --- /dev/null +++ b/src/lottoNumberValidatePipe.js @@ -0,0 +1,7 @@ +import {validateLottoNumberOutOfBounds, + validateLottoNumberDecimal} from './validate.js' + +export const lottoNumberValidatePipe = (winningNumbers) => { + validateLottoNumberOutOfBounds(winningNumbers); + validateLottoNumberDecimal(winningNumbers); +} \ No newline at end of file diff --git a/src/validate.js b/src/validate.js index cae44bd4e..57a9d1610 100644 --- a/src/validate.js +++ b/src/validate.js @@ -22,19 +22,19 @@ export const validateWinningNumberForm = (inputValue) => { throw new Error('[ERROR]당첨 번호 에러, 입력한 당첨번호의 형식이 맞지 않습니다.'); } } -export const validateWinningNumberOutOfBounds = (inputValue) => { +export const validateLottoNumberOutOfBounds = (inputValue) => { inputValue.forEach((element) => { if(element > 45 || element < 1){ throw new Error('[ERROR]당첨 번호 에러, 로또 번호는 1에서 45사이의 숫자입니다.'); } }); } -export const validateWinningNumberAmount = (inputValue) => { +export const validateLottoNumberAmount = (inputValue) => { if(inputValue.length > 6 || inputValue.length < 6){ throw new Error('[ERROR]당첨 번호 에러, 로또 번호는 6개의 숫자를 입력해야합니다.'); } } -export const validateWinningNumberDecimal = (inputValue) => { +export const validateLottoNumberDecimal = (inputValue) => { const decimalNumber = new RegExp('[.]+'); inputValue.forEach((element) =>{ if(decimalNumber.test(element)){ diff --git a/src/winningNumberValidatePipe.js b/src/winningNumberValidatePipe.js deleted file mode 100644 index 8365e5c6a..000000000 --- a/src/winningNumberValidatePipe.js +++ /dev/null @@ -1,9 +0,0 @@ -import {validateWinningNumberOutOfBounds, - validateWinningNumberAmount, - validateWinningNumberDecimal} from './validate.js' - -export const winningNumberValidatePipe = (winningNumbers) => { - validateWinningNumberOutOfBounds(winningNumbers); - validateWinningNumberAmount(winningNumbers); - validateWinningNumberDecimal(winningNumbers); -} \ No newline at end of file From 38d8b8eacb452b874ffa7d8e9ed06bf6c5e15e58 Mon Sep 17 00:00:00 2001 From: Kim_Yjoo Date: Mon, 4 Nov 2024 03:50:46 +0900 Subject: [PATCH 28/37] =?UTF-8?q?feat=20:=20=EB=8B=B9=EC=B2=A8=20=EB=B2=88?= =?UTF-8?q?=ED=98=B8=EC=99=80=20=EB=B0=9C=ED=96=89=EB=90=9C=20=EB=B2=88?= =?UTF-8?q?=ED=98=B8=EB=A5=BC=20=EB=B9=84=EA=B5=90=ED=95=98=EB=8A=94=20?= =?UTF-8?q?=ED=95=A8=EC=88=98=20=EC=B6=94=EA=B0=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/Lotto/IssuedLotto.js | 34 ++++++++++++++++++++++++++++++++++ 1 file changed, 34 insertions(+) create mode 100644 src/Lotto/IssuedLotto.js diff --git a/src/Lotto/IssuedLotto.js b/src/Lotto/IssuedLotto.js new file mode 100644 index 000000000..9b19f5429 --- /dev/null +++ b/src/Lotto/IssuedLotto.js @@ -0,0 +1,34 @@ +class IssuedLotto extends Lotto { + #lottoTable; + + constructor(numbers) { + super(numbers); + this.#lottoTable = this.applyLottoToTable(numbers); + } + + static makeIssuedLotto() { + return new IssuedLotto(random.makeUniqueNumbers(1, 45, 6)); + } + // makeLottoTable(numbers) { + // let lottoTables = [] + // numbers.forEach((oneLotto) => { + // tables.push(this.applyLottoToTable(oneLotto)); + // }); + // return lottoTables; + // } + applyLottoToTable(numbers) { + let lottoTable = Array.from({ length: 45 }, () => 0); + numbers.forEach((element) => { + lottoTable[element - 1] += 1; + }); + return lottoTable; + } + + getNumberOfMatches(answer) { + let matchNumber = 0; + answer.forEach((element) => { + matchNumber += this.#lottoTable[element]; + }); + return matchNumber; + } +} \ No newline at end of file From 262c56c7b8f7ab07d2b036d680fbf7e406598836 Mon Sep 17 00:00:00 2001 From: Kim_Yjoo Date: Mon, 4 Nov 2024 04:00:13 +0900 Subject: [PATCH 29/37] =?UTF-8?q?chore=20:=20=ED=99=98=EA=B2=BD=20?= =?UTF-8?q?=EC=9D=B4=EB=8F=99=EC=9D=84=20=EC=9C=84=ED=95=9C=20commit?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- README.md | 2 +- src/Lotto/IssuedLotto.js | 8 +++++++- 2 files changed, 8 insertions(+), 2 deletions(-) diff --git a/README.md b/README.md index d5b7112b1..9d96abdd5 100644 --- a/README.md +++ b/README.md @@ -64,7 +64,7 @@ - #### 당첨 로또 번호 생성 - [x] 랜덤한 당첨 번호를 생성한다. - #### 사용자의 로또 당첨 여부 확인 - - [ ] 사용자의 당첨 번호와 보너스 번호를 비교했을 때 일치하는 개수를 구한다. + - [x] 사용자의 당첨 번호와 보너스 번호를 비교했을 때 일치하는 개수를 구한다. - #### 사용자의 로또 게임 결과 판단 - [ ] 사용자의 로또가 몇 등 당첨인지 판단한다. - [ ] 당첨 금액 및 투입 금액에 따른 사용자의 수익률을 계산한다. diff --git a/src/Lotto/IssuedLotto.js b/src/Lotto/IssuedLotto.js index 9b19f5429..8a2a1b5eb 100644 --- a/src/Lotto/IssuedLotto.js +++ b/src/Lotto/IssuedLotto.js @@ -23,12 +23,18 @@ class IssuedLotto extends Lotto { }); return lottoTable; } + getWinningGrade(answer) { + const matchAmount = getNumberOfMatches(answer.getNumbers()); + } getNumberOfMatches(answer) { let matchNumber = 0; - answer.forEach((element) => { + answer.getNumbers().forEach((element) => { matchNumber += this.#lottoTable[element]; }); return matchNumber; } + isMatchedBonus(bonus){ + return this.#lottoTable[bonus] === 1; + } } \ No newline at end of file From 9c18f1241c64116b82c255f8e1fdd01bbc640c2a Mon Sep 17 00:00:00 2001 From: odeg2ya Date: Mon, 4 Nov 2024 13:23:50 +0900 Subject: [PATCH 30/37] =?UTF-8?q?feat=20:=20=EC=82=AC=EC=9A=A9=EC=9E=90?= =?UTF-8?q?=EC=9D=98=20=EB=A1=9C=EB=98=90=EC=9D=98=20=EB=8B=B9=EC=B2=A8=20?= =?UTF-8?q?=EB=93=B1=EC=88=98=20=EA=B8=B0=EB=8A=A5=20=EC=B6=94=EA=B0=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- README.md | 2 +- src/Lotto/AnswerLotto.js | 17 +++++++++-- src/Lotto/IssuedLotto.js | 60 +++++++++++++++++++++++++++++--------- src/LottoGameController.js | 5 ++-- src/LottoGameService.js | 29 +++++++++++++++++- 5 files changed, 92 insertions(+), 21 deletions(-) diff --git a/README.md b/README.md index 9d96abdd5..c5058ae5b 100644 --- a/README.md +++ b/README.md @@ -66,7 +66,7 @@ - #### 사용자의 로또 당첨 여부 확인 - [x] 사용자의 당첨 번호와 보너스 번호를 비교했을 때 일치하는 개수를 구한다. - #### 사용자의 로또 게임 결과 판단 - - [ ] 사용자의 로또가 몇 등 당첨인지 판단한다. + - [x] 사용자의 로또가 몇 등 당첨인지 판단한다. - [ ] 당첨 금액 및 투입 금액에 따른 사용자의 수익률을 계산한다. ### 출력 diff --git a/src/Lotto/AnswerLotto.js b/src/Lotto/AnswerLotto.js index f20b051c0..4666a6fab 100644 --- a/src/Lotto/AnswerLotto.js +++ b/src/Lotto/AnswerLotto.js @@ -1,5 +1,8 @@ -import lottoNumberValidatePipe from '../lottoNumberValidatePipe.js' -import bonusNumberValidatePipe from '../bonusNumberValidatePipe.js' +import Lotto from './Lotto.js' + +import {lottoNumberValidatePipe} from '../lottoNumberValidatePipe.js' +import {bonusNumberValidatePipe} from '../bonusNumberValidatePipe.js' + class AnswerLotto extends Lotto { #bonus; @@ -9,9 +12,17 @@ class AnswerLotto extends Lotto { this.#bonus = bonus; } + static create(numbers, bonus) { + return new AnswerLotto(numbers, bonus); + } #validateAnswerLotto(numbers, bonus){ lottoNumberValidatePipe(numbers); bonusNumberValidatePipe(bonus); } + getBonusNumber(){ + return this.#bonus; + } + +} -} \ No newline at end of file +export default AnswerLotto \ No newline at end of file diff --git a/src/Lotto/IssuedLotto.js b/src/Lotto/IssuedLotto.js index 8a2a1b5eb..488e72b0d 100644 --- a/src/Lotto/IssuedLotto.js +++ b/src/Lotto/IssuedLotto.js @@ -1,13 +1,19 @@ +import Lotto from './Lotto.js' + class IssuedLotto extends Lotto { #lottoTable; + #matchNumber; + #winningGrade; constructor(numbers) { super(numbers); this.#lottoTable = this.applyLottoToTable(numbers); + this.#winningGrade = '꼴등'; + this.#matchNumber = 0; } - static makeIssuedLotto() { - return new IssuedLotto(random.makeUniqueNumbers(1, 45, 6)); + static create(amount) { + return Array.from({length: amount}, () => new IssuedLotto(randomNumber.getUniqueRandomNumbers(1, 45, 6))); } // makeLottoTable(numbers) { // let lottoTables = [] @@ -16,25 +22,51 @@ class IssuedLotto extends Lotto { // }); // return lottoTables; // } + getWinningGrade(){ + return this.#winningGrade; + } + #setInitialStateLottoTable(){ + this.#lottoTable = Array.from({ length: 45 }, () => 0); + } applyLottoToTable(numbers) { - let lottoTable = Array.from({ length: 45 }, () => 0); + this.#setInitialStateLottoTable(); numbers.forEach((element) => { - lottoTable[element - 1] += 1; + this.#lottoTable[element - 1] += 1; }); - return lottoTable; } - getWinningGrade(answer) { - const matchAmount = getNumberOfMatches(answer.getNumbers()); - - } - getNumberOfMatches(answer) { - let matchNumber = 0; + #setMatchNumber(answer) { answer.getNumbers().forEach((element) => { - matchNumber += this.#lottoTable[element]; + this.#matchNumber += this.#lottoTable[element]; }); - return matchNumber; + } + setWinningGrade(answer) { + this.#setMatchNumber(answer); + if(this.#matchNumber === 6){ + this.#winningGrade = '1등'; + return; + } + if(this.#matchNumber === 5){ + this.#winningGrade = '2등'; + return; + } + if(this.#matchNumber === 5 && isMatchedBonus){ + this.#winningGrade = '보너스'; + return; + } + if(this.#matchNumber === 4){ + this.#winningGrade = '3등'; + return; + } + if(this.#matchNumber === 3){ + this.#winningGrade = '4등'; + return; + } + this.#winningGrade = '꼴등'; + return; } isMatchedBonus(bonus){ return this.#lottoTable[bonus] === 1; } -} \ No newline at end of file +} + +export default IssuedLotto \ No newline at end of file diff --git a/src/LottoGameController.js b/src/LottoGameController.js index 6c2d37b5b..f8f2ec5e4 100644 --- a/src/LottoGameController.js +++ b/src/LottoGameController.js @@ -1,6 +1,6 @@ import {validateWinningNumberForm} from './validate.js' import {purchaseValidatePipe} from './purchaseValidatePipe.js' -import {winningNumberValidatePipe} from './lottoNumberValidatePipe.js' +import {lottoNumberValidatePipe} from './lottoNumberValidatePipe.js' import {bonusNumberValidatePipe} from './bonusNumberValidatePipe.js' import parser from './utils/parser.js' @@ -17,7 +17,7 @@ class LottoGameController{ static onGetWinningNumber(winningNumberString){ validateWinningNumberForm(winningNumberString); const winningNumbers = parser.separateString(winningNumberString, ','); - winningNumberValidatePipe(winningNumbers); + lottoNumberValidatePipe(winningNumbers); return winningNumbers; } static onGetBonusNumber(bonusNumber){ @@ -28,6 +28,7 @@ class LottoGameController{ const purchaseAmount = await this.view.getPurchaseAmount(); const winningNumbers = await this.view.getWinningNumber(); const bonusNumber = await this.view.getBonusNumber(); + this.service.ready(); } } diff --git a/src/LottoGameService.js b/src/LottoGameService.js index 9a41228dc..e0ed1f625 100644 --- a/src/LottoGameService.js +++ b/src/LottoGameService.js @@ -1,5 +1,32 @@ +import IssuedLotto from './Lotto/IssuedLotto.js' +import AnswerLotto from './Lotto/AnswerLotto.js' + + class LottoGameService{ - + #issuedLottos; + #answerLotto; + #winningGrade; + + constructor(){ + this.#winningGrade = {'1등': 0, + '2등': 0, + '3등': 0, + '4등': 0, + '보너스': 0}; + } + + ready(purchaseAmount, winningNumbers, bonusNumber){ + this.#issuedLottos = IssuedLotto.create(purchaseAmount); + this.#answerLotto = AnswerLotto.create(winningNumbers, bonusNumber); + } + start(){ + this.#setEachLottoWinngGrade(); + } + #setEachLottoWinngGrade(){ + this.#issuedLottos.forEach((issuedLotto) => { + issuedLotto.setWinningGrade(this.#answerLotto) + }) + } } export default LottoGameService \ No newline at end of file From eb4c4d308677911d5474908fd08f13442e7da7ea Mon Sep 17 00:00:00 2001 From: odeg2ya Date: Mon, 4 Nov 2024 14:12:43 +0900 Subject: [PATCH 31/37] =?UTF-8?q?feat=20:=20=EC=82=AC=EC=9A=A9=EC=9E=90?= =?UTF-8?q?=EC=9D=98=20=EB=A1=9C=EB=98=90=20=EC=88=98=EC=9E=85=EB=A5=A0=20?= =?UTF-8?q?=EA=B3=84=EC=82=B0=20=EA=B8=B0=EB=8A=A5=20=EC=B6=94=EA=B0=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/LottoGameController.js | 18 +++++++------- src/LottoGameService.js | 48 ++++++++++++++++++++++++++++++++------ src/LottoGameView.js | 8 +++---- src/validate.js | 2 +- 4 files changed, 55 insertions(+), 21 deletions(-) diff --git a/src/LottoGameController.js b/src/LottoGameController.js index f8f2ec5e4..abccd6b58 100644 --- a/src/LottoGameController.js +++ b/src/LottoGameController.js @@ -1,4 +1,4 @@ -import {validateWinningNumberForm} from './validate.js' +import {validateAnswerNumberForm} from './validate.js' import {purchaseValidatePipe} from './purchaseValidatePipe.js' import {lottoNumberValidatePipe} from './lottoNumberValidatePipe.js' import {bonusNumberValidatePipe} from './bonusNumberValidatePipe.js' @@ -10,23 +10,23 @@ class LottoGameController{ this.service = service } - static onGetPurchaseAmount(purchaseAmount){ + static onGetPurchaseQuantity(purchaseAmount){ purchaseValidatePipe(purchaseAmount); return parser.divideThousands(purchaseAmount); } - static onGetWinningNumber(winningNumberString){ - validateWinningNumberForm(winningNumberString); - const winningNumbers = parser.separateString(winningNumberString, ','); - lottoNumberValidatePipe(winningNumbers); - return winningNumbers; + static onGetAnswerNumber(answerNumberString){ + validateAnswerNumberForm(winningNumberString); + const answerNumbers = parser.separateString(answerNumberString, ','); + lottoNumberValidatePipe(answerNumbers); + return answerNumbers; } static onGetBonusNumber(bonusNumber){ bonusNumberValidatePipe(bonusNumber); } async run(){ - const purchaseAmount = await this.view.getPurchaseAmount(); - const winningNumbers = await this.view.getWinningNumber(); + const purchaseQuantity = await this.view.getPurchaseQuantity(); + const answerNumbers = await this.view.getAnswerNumber(); const bonusNumber = await this.view.getBonusNumber(); this.service.ready(); } diff --git a/src/LottoGameService.js b/src/LottoGameService.js index e0ed1f625..1b95b4cf4 100644 --- a/src/LottoGameService.js +++ b/src/LottoGameService.js @@ -1,32 +1,66 @@ import IssuedLotto from './Lotto/IssuedLotto.js' import AnswerLotto from './Lotto/AnswerLotto.js' +const WINNING_GRADE_PRIZE = { + '1등': 2000000000, + '2등': 1500000, + '3등': 50000, + '4등': 5000, + '보너스': 30000000 +}; class LottoGameService{ #issuedLottos; #answerLotto; - #winningGrade; + #winningGradeQuantity; + #purchaseAmount; + #totalIncome; + #incomeRate; constructor(){ - this.#winningGrade = {'1등': 0, + this.#winningGradeQuantity = { + '1등': 0, '2등': 0, '3등': 0, '4등': 0, '보너스': 0}; + this.#purchaseAmount = 0; + this.#totalIncome = 0; } - ready(purchaseAmount, winningNumbers, bonusNumber){ - this.#issuedLottos = IssuedLotto.create(purchaseAmount); + ready(purchaseAmount, purchaseQuantity, winningNumbers, bonusNumber){ + this.#purchaseAmount = purchaseAmount; + this.#issuedLottos = IssuedLotto.create(purchaseQuantity); this.#answerLotto = AnswerLotto.create(winningNumbers, bonusNumber); } start(){ - this.#setEachLottoWinngGrade(); + this.#checkIssuedLotto(); + this.#getTotalIncome(); + this.#calculateIncomeRate(); } - #setEachLottoWinngGrade(){ + #checkIssuedLotto(){ this.#issuedLottos.forEach((issuedLotto) => { - issuedLotto.setWinningGrade(this.#answerLotto) + this.#checkIssuedLottoWinngGrade(issuedLotto); + this.#countWinningLotto(issuedLotto); }) } + #checkIssuedLottoWinngGrade(issuedLotto){ + issuedLotto.setWinningGrade(this.#answerLotto); + } + #countWinningLotto(issuedLotto){ + this.#winningGradeQuantity[issuedLotto.getWinningGrade()]++; + } + #calculateIncomeRate(){ + this.#incomeRate = this.#totalIncome / this.#purchaseAmount * 100; + } + #getTotalIncome(){ + Object.keys(this.#winningGradeQuantity).forEach((key) => { + const gradePrize = WINNING_GRADE_PRIZE[key]; + const gradeQuantity = this.#winningGradeQuantity[key]; + + this.#totalIncome += gradePrize * gradeQuantity; + }); + } } export default LottoGameService \ No newline at end of file diff --git a/src/LottoGameView.js b/src/LottoGameView.js index 207f65084..78b20805b 100644 --- a/src/LottoGameView.js +++ b/src/LottoGameView.js @@ -2,14 +2,14 @@ import {Console} from '@woowacourse/mission-utils' import LottoGameController from './LottoGameController.js' class LottoGameView{ - async getPurchaseAmount(){ + async getPurchaseQuantity(){ const input = await Console.readLineAsync('구입금액을 입력해 주세요.'); - return LottoGameController.onGetPurchaseAmount(input); + return LottoGameController.onGetPurchaseQuantity(input); } - async getWinningNumber(){ + async getAnswerNumber(){ const input = await Console.readLineAsync('당첨 번호를 입력해 주세요.'); - return LottoGameController.onGetWinningNumber(input); + return LottoGameController.onGetAnswerNumber(input); } async getBonusNumber(){ diff --git a/src/validate.js b/src/validate.js index 57a9d1610..4b6053e96 100644 --- a/src/validate.js +++ b/src/validate.js @@ -16,7 +16,7 @@ export const validateNotThousandUnits = (inputValue) => { throw new Error('[ERROR]구입 금액 에러, 1000원 단위 금액을 입력해주세요.') } } -export const validateWinningNumberForm = (inputValue) => { +export const validateAnswerNumberForm = (inputValue) => { const matchWinningNumberFormat = new RegExp('/[^\d],{1,1}|[a-zA-Z]|[\s]/g'); if(matchWinningNumberFormat.test(inputValue)){ throw new Error('[ERROR]당첨 번호 에러, 입력한 당첨번호의 형식이 맞지 않습니다.'); From 2f83685905f75bd3a48e696f3a5889a5b491df35 Mon Sep 17 00:00:00 2001 From: odeg2ya Date: Mon, 4 Nov 2024 17:33:48 +0900 Subject: [PATCH 32/37] =?UTF-8?q?feat=20:=20=EB=A1=9C=EB=98=90=20=EA=B2=8C?= =?UTF-8?q?=EC=9E=84=20=EC=B6=9C=EB=A0=A5=20=EA=B8=B0=EB=8A=A5=20=EC=B6=94?= =?UTF-8?q?=EA=B0=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- README.md | 10 ++++----- src/Lotto/IssuedLotto.js | 14 ++++++++++--- src/LottoGameController.js | 17 +++++++++++++-- src/LottoGameService.js | 43 +++++++++++++++++++++----------------- src/LottoGameView.js | 20 +++++++++++++++++- 5 files changed, 74 insertions(+), 30 deletions(-) diff --git a/README.md b/README.md index c5058ae5b..6ef74e6ed 100644 --- a/README.md +++ b/README.md @@ -67,12 +67,12 @@ - [x] 사용자의 당첨 번호와 보너스 번호를 비교했을 때 일치하는 개수를 구한다. - #### 사용자의 로또 게임 결과 판단 - [x] 사용자의 로또가 몇 등 당첨인지 판단한다. - - [ ] 당첨 금액 및 투입 금액에 따른 사용자의 수익률을 계산한다. + - [x] 당첨 금액 및 투입 금액에 따른 사용자의 수익률을 계산한다. ### 출력 - #### 안내 메시지 - - [ ] 구매한 로또의 개수를 출력한다. - - [ ] 당첨 통계 안내 메시지를 출력한다. + - [x] 구매한 로또의 개수를 출력한다. + - [x] 당첨 통계 안내 메시지를 출력한다. - #### 로또 결과 출력 - - [ ] 정해진 당첨 등수를 모두 출력한다. 그와 함께 사용자가 각 등수에 당첨된 개수를 출력한다. - - [ ] 사용자의 수익률을 출력한다. \ No newline at end of file + - [x] 정해진 당첨 등수를 모두 출력한다. 그와 함께 사용자가 각 등수에 당첨된 개수를 출력한다. + - [x] 사용자의 수익률을 출력한다. \ No newline at end of file diff --git a/src/Lotto/IssuedLotto.js b/src/Lotto/IssuedLotto.js index 488e72b0d..2cda925ed 100644 --- a/src/Lotto/IssuedLotto.js +++ b/src/Lotto/IssuedLotto.js @@ -1,4 +1,5 @@ import Lotto from './Lotto.js' +import {random} from '../utils/random.js' class IssuedLotto extends Lotto { #lottoTable; @@ -7,13 +8,12 @@ class IssuedLotto extends Lotto { constructor(numbers) { super(numbers); - this.#lottoTable = this.applyLottoToTable(numbers); this.#winningGrade = '꼴등'; this.#matchNumber = 0; } static create(amount) { - return Array.from({length: amount}, () => new IssuedLotto(randomNumber.getUniqueRandomNumbers(1, 45, 6))); + return Array.from({length: amount}, () => new IssuedLotto(random.makeUniqueNumbers(1, 45, 6))); } // makeLottoTable(numbers) { // let lottoTables = [] @@ -35,10 +35,14 @@ class IssuedLotto extends Lotto { }); } #setMatchNumber(answer) { + this.applyLottoToTable(super.getNumbers()); answer.getNumbers().forEach((element) => { - this.#matchNumber += this.#lottoTable[element]; + this.#matchNumber += this.#lottoTable[element-1]; }); } + checkWinningIssuedLotto(answer){ + this.setWinningGrade(answer); + } setWinningGrade(answer) { this.#setMatchNumber(answer); if(this.#matchNumber === 6){ @@ -64,9 +68,13 @@ class IssuedLotto extends Lotto { this.#winningGrade = '꼴등'; return; } + isMatchedBonus(bonus){ return this.#lottoTable[bonus] === 1; } + getLottoTable(){ + return this.#lottoTable; + } } export default IssuedLotto \ No newline at end of file diff --git a/src/LottoGameController.js b/src/LottoGameController.js index abccd6b58..7d9c59bd0 100644 --- a/src/LottoGameController.js +++ b/src/LottoGameController.js @@ -2,6 +2,9 @@ import {validateAnswerNumberForm} from './validate.js' import {purchaseValidatePipe} from './purchaseValidatePipe.js' import {lottoNumberValidatePipe} from './lottoNumberValidatePipe.js' import {bonusNumberValidatePipe} from './bonusNumberValidatePipe.js' +import IssuedLotto from './Lotto/IssuedLotto.js' +import AnswerLotto from './Lotto/AnswerLotto.js' + import parser from './utils/parser.js' class LottoGameController{ @@ -15,7 +18,7 @@ class LottoGameController{ return parser.divideThousands(purchaseAmount); } static onGetAnswerNumber(answerNumberString){ - validateAnswerNumberForm(winningNumberString); + validateAnswerNumberForm(answerNumberString); const answerNumbers = parser.separateString(answerNumberString, ','); lottoNumberValidatePipe(answerNumbers); return answerNumbers; @@ -26,10 +29,20 @@ class LottoGameController{ async run(){ const purchaseQuantity = await this.view.getPurchaseQuantity(); + const purchaseAmount = purchaseQuantity * 1000; + const issuedLottos = IssuedLotto.create(purchaseQuantity); + this.view.showPurchaseResult(purchaseQuantity, issuedLottos); const answerNumbers = await this.view.getAnswerNumber(); const bonusNumber = await this.view.getBonusNumber(); - this.service.ready(); + const answerLotto = AnswerLotto.create(answerNumbers, bonusNumber); + + this.service.start(purchaseAmount, issuedLottos, answerLotto); + const result = this.service.getResult(); + this.view.showLottoGameResult(result); + // const gradeQuantity = result.gradeQuantity; + // const incomeRate = result.incomeRate; } + } export default LottoGameController \ No newline at end of file diff --git a/src/LottoGameService.js b/src/LottoGameService.js index 1b95b4cf4..2ee607d6c 100644 --- a/src/LottoGameService.js +++ b/src/LottoGameService.js @@ -6,7 +6,8 @@ const WINNING_GRADE_PRIZE = { '2등': 1500000, '3등': 50000, '4등': 5000, - '보너스': 30000000 + '보너스': 30000000, + '꼴등': 0, }; class LottoGameService{ @@ -23,30 +24,28 @@ class LottoGameService{ '2등': 0, '3등': 0, '4등': 0, - '보너스': 0}; + '보너스': 0, + '꼴등': 0, + }; this.#purchaseAmount = 0; - this.#totalIncome = 0; + } - ready(purchaseAmount, purchaseQuantity, winningNumbers, bonusNumber){ + start(purchaseAmount, issuedLottos, answerLotto){ + const lottos = issuedLottos.map((issuedlotto) => new IssuedLotto(issuedlotto.getNumbers())); + const lotto = new AnswerLotto(answerLotto.getNumbers(), answerLotto.getBonusNumber()); this.#purchaseAmount = purchaseAmount; - this.#issuedLottos = IssuedLotto.create(purchaseQuantity); - this.#answerLotto = AnswerLotto.create(winningNumbers, bonusNumber); - } - start(){ - this.#checkIssuedLotto(); + this.#issuedLottos = lottos; + this.#answerLotto = lotto; + + this.#issuedLottos.forEach((lotto) => { + lotto.checkWinningIssuedLotto(this.#answerLotto); + this.#countWinningLotto(lotto); + }); this.#getTotalIncome(); this.#calculateIncomeRate(); } - #checkIssuedLotto(){ - this.#issuedLottos.forEach((issuedLotto) => { - this.#checkIssuedLottoWinngGrade(issuedLotto); - this.#countWinningLotto(issuedLotto); - }) - } - #checkIssuedLottoWinngGrade(issuedLotto){ - issuedLotto.setWinningGrade(this.#answerLotto); - } + #countWinningLotto(issuedLotto){ this.#winningGradeQuantity[issuedLotto.getWinningGrade()]++; } @@ -54,13 +53,19 @@ class LottoGameService{ this.#incomeRate = this.#totalIncome / this.#purchaseAmount * 100; } #getTotalIncome(){ + this.#totalIncome = 0; Object.keys(this.#winningGradeQuantity).forEach((key) => { const gradePrize = WINNING_GRADE_PRIZE[key]; const gradeQuantity = this.#winningGradeQuantity[key]; - this.#totalIncome += gradePrize * gradeQuantity; }); } + getResult(){ + return { + gradeQuantity : this.#winningGradeQuantity, + incomeRate : this.#incomeRate + }; + } } export default LottoGameService \ No newline at end of file diff --git a/src/LottoGameView.js b/src/LottoGameView.js index 78b20805b..1018e8a4a 100644 --- a/src/LottoGameView.js +++ b/src/LottoGameView.js @@ -16,5 +16,23 @@ class LottoGameView{ const input = await Console.readLineAsync('보너스 번호를 입력해 주세요.'); return LottoGameController.onGetBonusNumber(input); } + showPurchaseResult(purchaseQuantity, issuedLottos){ + Console.print(`${purchaseQuantity}개를 구매했습니다.`); + issuedLottos.forEach((lotto) => { + Console.print(lotto.getNumbers()); + }); + } + showLottoGameResult(result){ + let outputMessages = []; + outputMessages.push('당첨 통계\n---\n'); + outputMessages.push(`3개 일치 (5,000원) - ${result.gradeQuantity['4등']}개\n`); + outputMessages.push(`4개 일치 (50,000원) - ${result.gradeQuantity['3등']}개\n`); + outputMessages.push(`5개 일치 (1,500,000원) - ${result.gradeQuantity['2등']}개]\n`); + outputMessages.push(`5개 일치, 보너스 볼 일치 (30,000,000원) - ${result.gradeQuantity['보너스']}개\n`); + outputMessages.push(`6개 일치 (2,000,000,000원) - ${result.gradeQuantity['1등']}개\n`); + outputMessages.push(`총 수익률은 ${result.incomeRate}%입니다.\n`); + const output = outputMessages.join(''); + Console.print(output); + } } -export default LottoGameView \ No newline at end of file +export default LottoGameView From a1d3bcad695e51942d8aa4638085cb0ed473098e Mon Sep 17 00:00:00 2001 From: odeg2ya Date: Mon, 4 Nov 2024 17:36:37 +0900 Subject: [PATCH 33/37] =?UTF-8?q?chore=20:=20=EB=B3=B4=EB=84=88=EC=8A=A4?= =?UTF-8?q?=20=EB=8B=B9=EC=B2=A8=20=EC=97=AC=EB=B6=80=20=EA=B3=BC=EC=A0=95?= =?UTF-8?q?=20=EC=98=A4=EB=A5=98=20=EC=88=98=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/Lotto/IssuedLotto.js | 8 ++++---- src/LottoGameView.js | 2 +- 2 files changed, 5 insertions(+), 5 deletions(-) diff --git a/src/Lotto/IssuedLotto.js b/src/Lotto/IssuedLotto.js index 2cda925ed..9272049ba 100644 --- a/src/Lotto/IssuedLotto.js +++ b/src/Lotto/IssuedLotto.js @@ -49,12 +49,12 @@ class IssuedLotto extends Lotto { this.#winningGrade = '1등'; return; } - if(this.#matchNumber === 5){ - this.#winningGrade = '2등'; + if(this.#matchNumber === 5 && this.isMatchedBonus){ + this.#winningGrade = '보너스'; return; } - if(this.#matchNumber === 5 && isMatchedBonus){ - this.#winningGrade = '보너스'; + if(this.#matchNumber === 5){ + this.#winningGrade = '2등'; return; } if(this.#matchNumber === 4){ diff --git a/src/LottoGameView.js b/src/LottoGameView.js index 1018e8a4a..d9ed948ed 100644 --- a/src/LottoGameView.js +++ b/src/LottoGameView.js @@ -27,7 +27,7 @@ class LottoGameView{ outputMessages.push('당첨 통계\n---\n'); outputMessages.push(`3개 일치 (5,000원) - ${result.gradeQuantity['4등']}개\n`); outputMessages.push(`4개 일치 (50,000원) - ${result.gradeQuantity['3등']}개\n`); - outputMessages.push(`5개 일치 (1,500,000원) - ${result.gradeQuantity['2등']}개]\n`); + outputMessages.push(`5개 일치 (1,500,000원) - ${result.gradeQuantity['2등']}개\n`); outputMessages.push(`5개 일치, 보너스 볼 일치 (30,000,000원) - ${result.gradeQuantity['보너스']}개\n`); outputMessages.push(`6개 일치 (2,000,000,000원) - ${result.gradeQuantity['1등']}개\n`); outputMessages.push(`총 수익률은 ${result.incomeRate}%입니다.\n`); From 0959eafee59b2e3f42bd10ee82c2077a92f9ed72 Mon Sep 17 00:00:00 2001 From: odeg2ya Date: Mon, 4 Nov 2024 18:01:23 +0900 Subject: [PATCH 34/37] =?UTF-8?q?chore=20:=20=ED=95=84=EC=9A=94=EC=97=86?= =?UTF-8?q?=EB=8A=94=20=EC=A3=BC=EC=84=9D=20=EC=A0=9C=EA=B1=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/Lotto/AnswerLotto.js | 7 +++---- src/Lotto/IssuedLotto.js | 7 ------- src/Lotto/Lotto.js | 2 ++ src/LottoGameController.js | 3 --- src/LottoGameService.js | 7 ++----- 5 files changed, 7 insertions(+), 19 deletions(-) diff --git a/src/Lotto/AnswerLotto.js b/src/Lotto/AnswerLotto.js index 4666a6fab..8855b3cc3 100644 --- a/src/Lotto/AnswerLotto.js +++ b/src/Lotto/AnswerLotto.js @@ -1,6 +1,5 @@ import Lotto from './Lotto.js' -import {lottoNumberValidatePipe} from '../lottoNumberValidatePipe.js' import {bonusNumberValidatePipe} from '../bonusNumberValidatePipe.js' class AnswerLotto extends Lotto { @@ -8,15 +7,15 @@ class AnswerLotto extends Lotto { constructor(numbers, bonus){ super(numbers); - this.#validateAnswerLotto(numbers, bonus); + + this.#validateAnswerLotto(bonus); this.#bonus = bonus; } static create(numbers, bonus) { return new AnswerLotto(numbers, bonus); } - #validateAnswerLotto(numbers, bonus){ - lottoNumberValidatePipe(numbers); + #validateAnswerLotto(bonus){ bonusNumberValidatePipe(bonus); } getBonusNumber(){ diff --git a/src/Lotto/IssuedLotto.js b/src/Lotto/IssuedLotto.js index 9272049ba..dd399d250 100644 --- a/src/Lotto/IssuedLotto.js +++ b/src/Lotto/IssuedLotto.js @@ -15,13 +15,6 @@ class IssuedLotto extends Lotto { static create(amount) { return Array.from({length: amount}, () => new IssuedLotto(random.makeUniqueNumbers(1, 45, 6))); } - // makeLottoTable(numbers) { - // let lottoTables = [] - // numbers.forEach((oneLotto) => { - // tables.push(this.applyLottoToTable(oneLotto)); - // }); - // return lottoTables; - // } getWinningGrade(){ return this.#winningGrade; } diff --git a/src/Lotto/Lotto.js b/src/Lotto/Lotto.js index 40951d0a2..bd4fe5e1a 100644 --- a/src/Lotto/Lotto.js +++ b/src/Lotto/Lotto.js @@ -1,3 +1,4 @@ +import {lottoNumberValidatePipe} from '../lottoNumberValidatePipe.js' import { validateLottoNumberAmount } from "../validate.js" class Lotto { @@ -10,6 +11,7 @@ class Lotto { #validate(numbers) { validateLottoNumberAmount(numbers); + lottoNumberValidatePipe(numbers); } getNumbers() { return this.#numbers; diff --git a/src/LottoGameController.js b/src/LottoGameController.js index 7d9c59bd0..2ff7eacdf 100644 --- a/src/LottoGameController.js +++ b/src/LottoGameController.js @@ -20,7 +20,6 @@ class LottoGameController{ static onGetAnswerNumber(answerNumberString){ validateAnswerNumberForm(answerNumberString); const answerNumbers = parser.separateString(answerNumberString, ','); - lottoNumberValidatePipe(answerNumbers); return answerNumbers; } static onGetBonusNumber(bonusNumber){ @@ -39,8 +38,6 @@ class LottoGameController{ this.service.start(purchaseAmount, issuedLottos, answerLotto); const result = this.service.getResult(); this.view.showLottoGameResult(result); - // const gradeQuantity = result.gradeQuantity; - // const incomeRate = result.incomeRate; } } diff --git a/src/LottoGameService.js b/src/LottoGameService.js index 2ee607d6c..6c7f8f169 100644 --- a/src/LottoGameService.js +++ b/src/LottoGameService.js @@ -32,12 +32,9 @@ class LottoGameService{ } start(purchaseAmount, issuedLottos, answerLotto){ - const lottos = issuedLottos.map((issuedlotto) => new IssuedLotto(issuedlotto.getNumbers())); - const lotto = new AnswerLotto(answerLotto.getNumbers(), answerLotto.getBonusNumber()); this.#purchaseAmount = purchaseAmount; - this.#issuedLottos = lottos; - this.#answerLotto = lotto; - + this.#issuedLottos = issuedLottos; + this.#answerLotto = answerLotto; this.#issuedLottos.forEach((lotto) => { lotto.checkWinningIssuedLotto(this.#answerLotto); this.#countWinningLotto(lotto); From 58d9c261daf98d7e5e0b5a82a005549821b63ddd Mon Sep 17 00:00:00 2001 From: Kim_Yjoo Date: Mon, 4 Nov 2024 20:20:43 +0900 Subject: [PATCH 35/37] =?UTF-8?q?chore=20:=20=EC=9E=85=EB=A0=A5=ED=98=95?= =?UTF-8?q?=EC=8B=9D=20=EC=A0=95=EA=B7=9C=ED=91=9C=ED=98=84=EC=8B=9D=20?= =?UTF-8?q?=EC=88=98=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/validate.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/validate.js b/src/validate.js index 4b6053e96..cf680183c 100644 --- a/src/validate.js +++ b/src/validate.js @@ -17,7 +17,7 @@ export const validateNotThousandUnits = (inputValue) => { } } export const validateAnswerNumberForm = (inputValue) => { - const matchWinningNumberFormat = new RegExp('/[^\d],{1,1}|[a-zA-Z]|[\s]/g'); + const matchWinningNumberFormat = new RegExp('(\\d,,\\d|,,|,$|[^\\d,])'); if(matchWinningNumberFormat.test(inputValue)){ throw new Error('[ERROR]당첨 번호 에러, 입력한 당첨번호의 형식이 맞지 않습니다.'); } From 6ecf392cff5f6597096d669e7f0bfb5d577696bf Mon Sep 17 00:00:00 2001 From: Kim_Yjoo Date: Mon, 4 Nov 2024 23:14:14 +0900 Subject: [PATCH 36/37] =?UTF-8?q?fix=20:=20=EC=97=90=EB=9F=AC=EB=A9=94?= =?UTF-8?q?=EC=8B=9C=EC=A7=80=20=EC=B6=9C=EB=A0=A5=EB=B0=A9=EC=8B=9D=20?= =?UTF-8?q?=EC=88=98=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- README.md | 2 +- src/App.js | 1 + src/{Lotto => }/Lotto.js | 7 ++-- src/Lotto/AnswerLotto.js | 17 +++++++-- src/Lotto/IssuedLotto.js | 14 ++++---- src/LottoGameController.js | 63 ++++++++++++++++++++++++++-------- src/LottoGameService.js | 18 ++++++---- src/LottoGameView.js | 4 +-- src/bonusNumberValidatePipe.js | 3 +- src/validate.js | 26 ++++++++++++-- 10 files changed, 115 insertions(+), 40 deletions(-) rename src/{Lotto => }/Lotto.js (51%) diff --git a/README.md b/README.md index 6ef74e6ed..fdeffbcba 100644 --- a/README.md +++ b/README.md @@ -51,7 +51,7 @@ - 로또 번호 - [x] 로또 번호 중 숫자가 아닌 특수문자가 있을 경우. 로또 번호 입력형식에 맞지 않은 경우. - [x] 로또 번호가 1에서 45사이의 숫자가 아닐 경우. - - [ ] 로또 번호에 중복이 있을 경우. + 보너스 번호 포함. + - [x] 로또 번호에 중복이 있을 경우. + 보너스 번호 포함. - [x] 로또 번호가 보너스 제외하고 6자리가 아닐 경우. - [x] 로또 번호가 소수일 경우 - 보너스 번호 diff --git a/src/App.js b/src/App.js index 7b17e0513..f166398af 100644 --- a/src/App.js +++ b/src/App.js @@ -2,6 +2,7 @@ import {Console} from '@woowacourse/mission-utils' import LottoGameController from './LottoGameController.js' import LottoGameView from './LottoGameView.js' import LottoGameService from './LottoGameService.js' +import Lotto from './Lotto.js' class App { controller; diff --git a/src/Lotto/Lotto.js b/src/Lotto.js similarity index 51% rename from src/Lotto/Lotto.js rename to src/Lotto.js index bd4fe5e1a..8b83b122a 100644 --- a/src/Lotto/Lotto.js +++ b/src/Lotto.js @@ -1,16 +1,17 @@ -import {lottoNumberValidatePipe} from '../lottoNumberValidatePipe.js' -import { validateLottoNumberAmount } from "../validate.js" +import {lottoNumberValidatePipe} from './lottoNumberValidatePipe.js' +import { validateLottoNumberAmount, validateLottoOverlap } from "./validate.js" class Lotto { #numbers; constructor(numbers) { this.#validate(numbers); - this.#numbers = numbers.sort(); + this.#numbers = numbers.map(Number).sort((a, b) => a - b); } #validate(numbers) { validateLottoNumberAmount(numbers); + validateLottoOverlap(numbers); lottoNumberValidatePipe(numbers); } getNumbers() { diff --git a/src/Lotto/AnswerLotto.js b/src/Lotto/AnswerLotto.js index 8855b3cc3..b1d6de183 100644 --- a/src/Lotto/AnswerLotto.js +++ b/src/Lotto/AnswerLotto.js @@ -1,15 +1,18 @@ -import Lotto from './Lotto.js' +import Lotto from '../Lotto.js' import {bonusNumberValidatePipe} from '../bonusNumberValidatePipe.js' +import {validateBonusOverlap} from '../validate.js' class AnswerLotto extends Lotto { #bonus; + #lottoTable; constructor(numbers, bonus){ super(numbers); - this.#validateAnswerLotto(bonus); this.#bonus = bonus; + this.applyLottoToTable(numbers); + this.#validateAnswerLotto(bonus); } static create(numbers, bonus) { @@ -17,10 +20,20 @@ class AnswerLotto extends Lotto { } #validateAnswerLotto(bonus){ bonusNumberValidatePipe(bonus); + validateBonusOverlap(this.#lottoTable, bonus); } getBonusNumber(){ return this.#bonus; } + #setInitialStateLottoTable(){ + this.#lottoTable = Array.from({ length: 45 }, () => 0); + } + applyLottoToTable(numbers) { + this.#setInitialStateLottoTable(); + numbers.forEach((element) => { + this.#lottoTable[element - 1] += 1; + }); + } } diff --git a/src/Lotto/IssuedLotto.js b/src/Lotto/IssuedLotto.js index dd399d250..eac534d24 100644 --- a/src/Lotto/IssuedLotto.js +++ b/src/Lotto/IssuedLotto.js @@ -1,4 +1,4 @@ -import Lotto from './Lotto.js' +import Lotto from '../Lotto.js' import {random} from '../utils/random.js' class IssuedLotto extends Lotto { @@ -27,22 +27,22 @@ class IssuedLotto extends Lotto { this.#lottoTable[element - 1] += 1; }); } + checkWinningIssuedLotto(answer){ + this.#setWinningGrade(answer); + } #setMatchNumber(answer) { this.applyLottoToTable(super.getNumbers()); answer.getNumbers().forEach((element) => { this.#matchNumber += this.#lottoTable[element-1]; }); } - checkWinningIssuedLotto(answer){ - this.setWinningGrade(answer); - } - setWinningGrade(answer) { + #setWinningGrade(answer) { this.#setMatchNumber(answer); if(this.#matchNumber === 6){ this.#winningGrade = '1등'; return; } - if(this.#matchNumber === 5 && this.isMatchedBonus){ + if(this.#matchNumber === 5 && this.isMatchedBonus(answer.getBonusNumber())){ this.#winningGrade = '보너스'; return; } @@ -63,7 +63,7 @@ class IssuedLotto extends Lotto { } isMatchedBonus(bonus){ - return this.#lottoTable[bonus] === 1; + return this.#lottoTable[bonus-1] === 1; } getLottoTable(){ return this.#lottoTable; diff --git a/src/LottoGameController.js b/src/LottoGameController.js index 2ff7eacdf..87024db54 100644 --- a/src/LottoGameController.js +++ b/src/LottoGameController.js @@ -1,9 +1,5 @@ import {validateAnswerNumberForm} from './validate.js' import {purchaseValidatePipe} from './purchaseValidatePipe.js' -import {lottoNumberValidatePipe} from './lottoNumberValidatePipe.js' -import {bonusNumberValidatePipe} from './bonusNumberValidatePipe.js' -import IssuedLotto from './Lotto/IssuedLotto.js' -import AnswerLotto from './Lotto/AnswerLotto.js' import parser from './utils/parser.js' @@ -22,24 +18,61 @@ class LottoGameController{ const answerNumbers = parser.separateString(answerNumberString, ','); return answerNumbers; } - static onGetBonusNumber(bonusNumber){ - bonusNumberValidatePipe(bonusNumber); - } async run(){ - const purchaseQuantity = await this.view.getPurchaseQuantity(); + let purchaseQuantity; + let answerNumbers; + let bonusNumber; + + while (true) { + purchaseQuantity = await this.getPurchaseQuantitySafely(); + if (purchaseQuantity !== null) break; + } + while (true) { + answerNumbers = await this.getAnswerNumberSafely(); + if (answerNumbers !== null) break; + } + while (true) { + bonusNumber = await this.getBonusNumberSafely(); + if (bonusNumber !== null) break; + } + const purchaseAmount = purchaseQuantity * 1000; - const issuedLottos = IssuedLotto.create(purchaseQuantity); - this.view.showPurchaseResult(purchaseQuantity, issuedLottos); - const answerNumbers = await this.view.getAnswerNumber(); - const bonusNumber = await this.view.getBonusNumber(); - const answerLotto = AnswerLotto.create(answerNumbers, bonusNumber); + this.service.inSetting( + purchaseAmount, + purchaseQuantity, + this.onMakeIssuedLotto.bind(this) + ); + - this.service.start(purchaseAmount, issuedLottos, answerLotto); + this.service.start(answerNumbers, bonusNumber); const result = this.service.getResult(); this.view.showLottoGameResult(result); } - + async getPurchaseQuantitySafely() { + try { + return await this.view.getPurchaseQuantity(); + } catch (error) { + return null; + } + } + async getAnswerNumberSafely() { + try { + return await this.view.getAnswerNumber(); + } catch (error) { + return null; + } + } + async getBonusNumberSafely() { + try { + return await this.view.getBonusNumber(); + } catch (error) { + return null; + } + } + onMakeIssuedLotto(purchaseQuantity, issuedLottos){ + this.view.showPurchaseResult(purchaseQuantity, issuedLottos); + } } export default LottoGameController \ No newline at end of file diff --git a/src/LottoGameService.js b/src/LottoGameService.js index 6c7f8f169..080e3b283 100644 --- a/src/LottoGameService.js +++ b/src/LottoGameService.js @@ -15,6 +15,7 @@ class LottoGameService{ #answerLotto; #winningGradeQuantity; #purchaseAmount; + #purchaseQuantity; #totalIncome; #incomeRate; @@ -30,14 +31,17 @@ class LottoGameService{ this.#purchaseAmount = 0; } - - start(purchaseAmount, issuedLottos, answerLotto){ + inSetting(purchaseAmount, purchaseQuantity, onMakeIssuedLotto){ this.#purchaseAmount = purchaseAmount; - this.#issuedLottos = issuedLottos; - this.#answerLotto = answerLotto; - this.#issuedLottos.forEach((lotto) => { - lotto.checkWinningIssuedLotto(this.#answerLotto); - this.#countWinningLotto(lotto); + this.#purchaseQuantity= purchaseQuantity; + this.#issuedLottos = IssuedLotto.create(purchaseQuantity); + onMakeIssuedLotto(this.#purchaseQuantity, this.#issuedLottos); + } + start(answerNumbers, bonusNumber){ + this.#answerLotto = AnswerLotto.create(answerNumbers, bonusNumber); + this.#issuedLottos.forEach((issuedLotto) => { + issuedLotto.checkWinningIssuedLotto(this.#answerLotto); + this.#countWinningLotto(issuedLotto); }); this.#getTotalIncome(); this.#calculateIncomeRate(); diff --git a/src/LottoGameView.js b/src/LottoGameView.js index d9ed948ed..043c905cb 100644 --- a/src/LottoGameView.js +++ b/src/LottoGameView.js @@ -14,12 +14,12 @@ class LottoGameView{ async getBonusNumber(){ const input = await Console.readLineAsync('보너스 번호를 입력해 주세요.'); - return LottoGameController.onGetBonusNumber(input); + return input; } showPurchaseResult(purchaseQuantity, issuedLottos){ Console.print(`${purchaseQuantity}개를 구매했습니다.`); issuedLottos.forEach((lotto) => { - Console.print(lotto.getNumbers()); + Console.print(`[${lotto.getNumbers().join(', ')}]`); }); } showLottoGameResult(result){ diff --git a/src/bonusNumberValidatePipe.js b/src/bonusNumberValidatePipe.js index 1514f4053..753beefab 100644 --- a/src/bonusNumberValidatePipe.js +++ b/src/bonusNumberValidatePipe.js @@ -1,5 +1,6 @@ import {validateBonusNumberOutOfBounds, - validateBonusNumberDecimal} from './validate.js' + validateBonusNumberDecimal, + validateLottoOverlap} from './validate.js' export const bonusNumberValidatePipe = (bonusNumber) => { validateBonusNumberOutOfBounds(bonusNumber); diff --git a/src/validate.js b/src/validate.js index cf680183c..1241a62c3 100644 --- a/src/validate.js +++ b/src/validate.js @@ -1,36 +1,55 @@ +import {Console} from '@woowacourse/mission-utils' export const validateNotNumber = (inputValue) => { const notNumber = new RegExp('[^0-9]+'); if(notNumber.test(inputValue)){ - throw new Error('[ERROR]입력 에러, 금액 및 번호 입력 시 숫자만 입력해주세요.'); + Console.print('[ERROR]'); + throw new Error('[ERROR]'); } } export const validatePayDecimalNumber = (inputValue) => { const decimalNumber = new RegExp('[.]+'); if(decimalNumber.test(inputValue)){ + Console.print('[ERROR]'); throw new Error('[ERROR]입력 에러, 금액 입력 시 정수의 숫자만 입력해주세요.'); } } export const validateNotThousandUnits = (inputValue) => { if(inputValue%1000 !== 0){ + Console.print('[ERROR]'); throw new Error('[ERROR]구입 금액 에러, 1000원 단위 금액을 입력해주세요.') } } export const validateAnswerNumberForm = (inputValue) => { - const matchWinningNumberFormat = new RegExp('(\\d,,\\d|,,|,$|[^\\d,])'); + const matchWinningNumberFormat = new RegExp('(\\d\\s*,\\s*,\\s*\\d|,\\s*,|,\\s*$|[^\\d,\\s])'); if(matchWinningNumberFormat.test(inputValue)){ + Console.print('[ERROR]'); throw new Error('[ERROR]당첨 번호 에러, 입력한 당첨번호의 형식이 맞지 않습니다.'); } } export const validateLottoNumberOutOfBounds = (inputValue) => { inputValue.forEach((element) => { if(element > 45 || element < 1){ + Console.print('[ERROR]'); throw new Error('[ERROR]당첨 번호 에러, 로또 번호는 1에서 45사이의 숫자입니다.'); } }); } +export const validateLottoOverlap = (numbers) => { + if(new Set(numbers).size !== numbers.length){ + Console.print('[ERROR]'); + throw new Error('[ERROR]'); + } +} +export const validateBonusOverlap = (lottoTable, bonus) => { + if(lottoTable[bonus-1] === 1){ + Console.print('[ERROR]'); + throw new Error('[ERROR]보너스 번호 에러, 보너스 번호에 중복이 있습니다.'); + } +} export const validateLottoNumberAmount = (inputValue) => { if(inputValue.length > 6 || inputValue.length < 6){ + Console.print('[ERROR]'); throw new Error('[ERROR]당첨 번호 에러, 로또 번호는 6개의 숫자를 입력해야합니다.'); } } @@ -38,18 +57,21 @@ export const validateLottoNumberDecimal = (inputValue) => { const decimalNumber = new RegExp('[.]+'); inputValue.forEach((element) =>{ if(decimalNumber.test(element)){ + Console.print('[ERROR]'); throw new Error('[ERROR]당첨 번호 에러, 당첨 번호는 정수의 숫자만 입력해주세요.'); } }); } export const validateBonusNumberOutOfBounds = (inputValue) => { if(inputValue > 45 || inputValue < 1){ + Console.print('[ERROR]'); throw new Error('[ERROR]보너스 번호 에러, 보너스 번호는 1에서 45사이의 숫자입니다.'); } } export const validateBonusNumberDecimal = (inputValue) => { const decimalNumber = new RegExp('[.]+'); if(decimalNumber.test(inputValue)){ + Console.print('[ERROR]'); throw new Error('[ERROR]보너스 번호 에러, 보너스 번호는 정수의 숫자만 입력해주세요.'); } } \ No newline at end of file From 2c16ddeb2234bde248567a5e4d4d1711ade47aeb Mon Sep 17 00:00:00 2001 From: Kim_Yjoo <90447858+KimYjoo@users.noreply.github.com> Date: Tue, 5 Nov 2024 16:14:19 +0900 Subject: [PATCH 37/37] =?UTF-8?q?=EA=B3=BC=EC=A0=9C=20=EC=A0=9C=EB=AA=A9?= =?UTF-8?q?=20=EC=88=98=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 자동차 게임으로 오기입 되어있던 제목을 로또로 알맞게 수정 --- README.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/README.md b/README.md index fdeffbcba..0daf7b9c5 100644 --- a/README.md +++ b/README.md @@ -1,4 +1,4 @@ -# 우테코 프리코스 3주차 [자동차 게임] +# 우테코 프리코스 3주차 [로또] ## 과제 수행 체크리스트 #### 개발 과정 준수 사항 - [ ] 코드 포매팅 사용 @@ -75,4 +75,4 @@ - [x] 당첨 통계 안내 메시지를 출력한다. - #### 로또 결과 출력 - [x] 정해진 당첨 등수를 모두 출력한다. 그와 함께 사용자가 각 등수에 당첨된 개수를 출력한다. - - [x] 사용자의 수익률을 출력한다. \ No newline at end of file + - [x] 사용자의 수익률을 출력한다.