From 73ca8741a3c58d6fefe11103bb32adf557c40755 Mon Sep 17 00:00:00 2001 From: yoon Date: Mon, 6 Nov 2023 15:40:57 +0900 Subject: [PATCH 01/44] =?UTF-8?q?[docs]=20=EA=B8=B0=EB=8A=A5=EB=AA=85?= =?UTF-8?q?=EC=84=B8=20=EC=B6=94=EA=B0=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- docs/README.md | 82 ++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 82 insertions(+) diff --git a/docs/README.md b/docs/README.md index e69de29bb..f1876ea94 100644 --- a/docs/README.md +++ b/docs/README.md @@ -0,0 +1,82 @@ +## 공통 피드백 + +- readme를 상세하게 적는다 - readme는 언제든 바뀌어도 된다. 계속 수정하며 작업하라. + + 해당 프로젝트에 대한 설명, 기능명세 + +- 기능명세에는 구현해야 할 기능 목록을 정리하는데 초점을 맞춘다. + + 예외적인 상황도 기능 목록에 정리한다. (구현을 하면서 계속 추가한다) + +- 값을 하드 코딩하지 않는다. + + 상수화 해라 + +- 구현 순서도 코딩 컨벤션이다. +- 변수명에 자료형 쓰지 마라 carList → cars +- 하나의 함수는 한 가지 기능만 담당해라.(15줄을 넘지 않도록 한다.) +- 작은 단위의 테스트부터 만든다. + +## 추가된 요구사항 + +- 함수(또는 메서드)의 길이가 15라인을 넘어가지 않도록 구현한다. + - 함수(또는 메서드)가 한 가지 일만 잘 하도록 구현한다. +- else를 지양한다. + - 힌트: if 조건절에서 값을 return하는 방식으로 구현하면 else를 사용하지 않아도 된다. + - 때로는 if/else, when문을 사용하는 것이 더 깔끔해 보일 수 있다. 어느 경우에 쓰는 것이 적절할지 스스로 고민해 본다. +- Enum 클래스를 적용해 프로그래밍을 구현한다. +- 도메인 로직에 단위 테스트를 구현해야 한다. 단, UI(System.out, System.in, Scanner) 로직은 제외한다. + - 핵심 로직을 구현하는 코드와 UI를 담당하는 로직을 분리해 구현한다. + - 단위 테스트 작성이 익숙하지 않다면 `test/kotlin/lotto/LottoTest`를 참고하여 학습한 후 테스트를 구현한다. + +# 기능명세 + +쉽게 풀어쓰는 로또 이야기 +## 로또 이야기 + +- 1등을 오백만명 배출한 로또지점에 오신걸 환영합니다~ +- 나는 오늘 로또를 10장 구매해야지!! 나 꼭 1등 당첨될거야! +- 나 로또 10장 사야겠다. 음 그럼 얼마 필요하지? +- 로또 한장에 1000원이네? 그러면 10000원 필요하겠다! +- 아주머니~ 로또 10장 주세요! +- 10000원 지불하고 로또 10장 받기 성공~! +- 나는 당첨번호가 {x,x,x,x,x,x}이렇게랑 보너스는 Y가 나올거 같아! + 내가 받은 로또 10장을 한번 긁어볼까? + 어? 당첨번호가?̊̈-?̊̈ + - 1등 → 헉? 당첨번호가 다 맞잖아? + - 2등 → 헉? 당첨번호 5개랑 보너스 번호가 맞잖아? + - 3등 → 헉? 당첨번호 5개가 맞잖아? + - 4등 → 힝 ㅠ 당첨번호 4개가 맞네 + - 5등 → 그래도 당첨번호 3개나 맞았네! +- 10장의 당첨이 어떻게 되었지? 한번 나열해볼까? +- 음 당첨 수익률이 어캐되징? 오오~! + +## User + +- [ ] 로또 번호를 입력받는다. - InputNumber() + - [ ] 당첨번호를 입력한다.- inputUserNumbers() + - [ ] 당첨번호는 6개이다. + - [ ] 1~45 사이의 숫자여야 한다. + - [ ] 중복 숫자는 없어야 한다. + - [ ] ,으로 구별한다. + - [ ] 보너스 번호를 입력한다. - inputBonusNum() + - [ ] 보너스 번호는 1개이며 1~45 사이의 숫자여야한다. + - [ ] 먼저 입력한 당첨 번호와 중복되면 안된다. + +### Compare + +- [ ] 손님과 랜덤 로또 번호를 비교할 수 있다. compare() + - [ ] 로또가 같은 숫자를 포함하고 있으면 당첨이다. checkSameNumber() + - [ ] 3개번호 일치 - 5000원 + - [ ] 4개 번호 일치 - 50000원 + - [ ] 5개 번호 일치 - 1500000 + - [ ] 5개번호+ 보너스 번호 일치 - 3000000 + - [ ] 6개 번호 일치 1등 - 2000000000 + +## WinningNumberChecker + +- [ ] 몇개가 당첨 되었는지 알 수 있다. + +## **YieldCalculator** + +- [ ] 수익률을 계산할 수 있다. \ No newline at end of file From c9c2b32352882fac5a8b6bc79721910a882c88c9 Mon Sep 17 00:00:00 2001 From: yoon Date: Mon, 6 Nov 2023 18:10:14 +0900 Subject: [PATCH 02/44] =?UTF-8?q?[docs]=20=EA=B8=B0=EB=8A=A5=EB=AA=85?= =?UTF-8?q?=EC=84=B8=20=EC=B6=94=EA=B0=80=20=EB=B0=8F=20=EC=88=98=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- docs/README.md | 31 ++++++++++++++++++++++++------- 1 file changed, 24 insertions(+), 7 deletions(-) diff --git a/docs/README.md b/docs/README.md index f1876ea94..6e9d1e45a 100644 --- a/docs/README.md +++ b/docs/README.md @@ -27,11 +27,13 @@ - Enum 클래스를 적용해 프로그래밍을 구현한다. - 도메인 로직에 단위 테스트를 구현해야 한다. 단, UI(System.out, System.in, Scanner) 로직은 제외한다. - 핵심 로직을 구현하는 코드와 UI를 담당하는 로직을 분리해 구현한다. - - 단위 테스트 작성이 익숙하지 않다면 `test/kotlin/lotto/LottoTest`를 참고하여 학습한 후 테스트를 구현한다. + - 단위 테스트 작성이 익숙하지 않다면 `test/kotlin/lotto/LottoTest`를 참고하여 학습한 후 테스트를 구현한다. +- 에러 문구는 "[ERROR]"로 시작해야 한다. # 기능명세 쉽게 풀어쓰는 로또 이야기 + ## 로또 이야기 - 1등을 오백만명 배출한 로또지점에 오신걸 환영합니다~ @@ -49,20 +51,35 @@ - 4등 → 힝 ㅠ 당첨번호 4개가 맞네 - 5등 → 그래도 당첨번호 3개나 맞았네! - 10장의 당첨이 어떻게 되었지? 한번 나열해볼까? -- 음 당첨 수익률이 어캐되징? 오오~! +- 음 당첨 수익률이 어캐되징 함 보여줘바! 오오~! -## User +로또구입 -> 구입한 로또 개수 조회 -> 구입한 로또 조회 -> 종료 +## User +- [ ] 몇개의 로또를 살 것 인지 로또 판매 아줌씨한테 알려준다. + - [ ] 구입 금액은 1,000원 단위이며, 1,000원으로 나누어 떨어지지 않는 경우 예외 처리한다. - [ ] 로또 번호를 입력받는다. - InputNumber() - [ ] 당첨번호를 입력한다.- inputUserNumbers() - - [ ] 당첨번호는 6개이다. - - [ ] 1~45 사이의 숫자여야 한다. - - [ ] 중복 숫자는 없어야 한다. - - [ ] ,으로 구별한다. + - [ ] 보너스 번호를 입력한다. - inputBonusNum() - [ ] 보너스 번호는 1개이며 1~45 사이의 숫자여야한다. - [ ] 먼저 입력한 당첨 번호와 중복되면 안된다. +## 로또를 판매하는 아주머니 +- [ ] 로또 수량을 체크한다. +- [ ] 로또 공장에서 고객이 요구한 로또만큼 가져와서 준다. + +## Lotto + +- [ ] 당첨번호는 6개이다. +- [ ] 1~45 사이의 숫자여야 한다. +- [ ] 중복 숫자는 없어야 한다. +- [ ] ,으로 구별한다. +- [ ] 위의 조건을 지키지 않은 경우 예외를 발생시킨 후 다시 당첨번호를 입력받게 한다. + +## LottoFactory +- [ ] 1~45개 사이의 중복되지 않은 6개의 숫자를 생성한다. + ### Compare - [ ] 손님과 랜덤 로또 번호를 비교할 수 있다. compare() From fe34565829f24f9a076f0144a4951aedfc925209 Mon Sep 17 00:00:00 2001 From: yoon Date: Mon, 6 Nov 2023 21:30:26 +0900 Subject: [PATCH 03/44] =?UTF-8?q?[Feat]=201~45=EA=B0=9C=20=EC=82=AC?= =?UTF-8?q?=EC=9D=B4=EC=9D=98=206=EA=B0=9C=EC=9D=98=20=EC=88=AB=EC=9E=90?= =?UTF-8?q?=EB=A5=BC=20=EC=83=9D=EC=84=B1=ED=95=9C=EB=8B=A4.?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit interface로 랜덤 숫자 생성 주입 --- docs/README.md | 3 ++- src/main/kotlin/lotto/LottoGenerator.kt | 16 ++++++++++++++++ src/main/kotlin/lotto/NumberGenerator.kt | 5 +++++ 3 files changed, 23 insertions(+), 1 deletion(-) create mode 100644 src/main/kotlin/lotto/LottoGenerator.kt create mode 100644 src/main/kotlin/lotto/NumberGenerator.kt diff --git a/docs/README.md b/docs/README.md index 6e9d1e45a..a62175995 100644 --- a/docs/README.md +++ b/docs/README.md @@ -78,7 +78,8 @@ - [ ] 위의 조건을 지키지 않은 경우 예외를 발생시킨 후 다시 당첨번호를 입력받게 한다. ## LottoFactory -- [ ] 1~45개 사이의 중복되지 않은 6개의 숫자를 생성한다. +- [x] 1~45개 사이의 6개의 숫자를 생성한다. + - [ ] 중복되지 않은 6개의 숫자여야 한다. ### Compare diff --git a/src/main/kotlin/lotto/LottoGenerator.kt b/src/main/kotlin/lotto/LottoGenerator.kt new file mode 100644 index 000000000..13e229863 --- /dev/null +++ b/src/main/kotlin/lotto/LottoGenerator.kt @@ -0,0 +1,16 @@ +package lotto + +import camp.nextstep.edu.missionutils.Randoms + +class LottoGenerator : NumberGenerator { + + override fun generate(): List { + return Randoms.pickUniqueNumbersInRange(MIN_NUMBER, MAX_NUMBER, PICK_NUMBER) + } + + companion object { + const val MIN_NUMBER = 1 + const val MAX_NUMBER = 45 + const val PICK_NUMBER = 6 + } +} diff --git a/src/main/kotlin/lotto/NumberGenerator.kt b/src/main/kotlin/lotto/NumberGenerator.kt new file mode 100644 index 000000000..096673bb8 --- /dev/null +++ b/src/main/kotlin/lotto/NumberGenerator.kt @@ -0,0 +1,5 @@ +package lotto + +interface NumberGenerator { + fun generate(): List +} \ No newline at end of file From 39606867da3bd717c07a7e229bd0c6a7fdef3cac Mon Sep 17 00:00:00 2001 From: yoon Date: Tue, 7 Nov 2023 03:06:27 +0900 Subject: [PATCH 04/44] =?UTF-8?q?[docs]=20=EA=B8=B0=EB=8A=A5=EB=AA=85?= =?UTF-8?q?=EC=84=B8=20=EC=88=98=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- docs/README.md | 2 ++ 1 file changed, 2 insertions(+) diff --git a/docs/README.md b/docs/README.md index a62175995..7383e2c52 100644 --- a/docs/README.md +++ b/docs/README.md @@ -60,6 +60,7 @@ - [ ] 구입 금액은 1,000원 단위이며, 1,000원으로 나누어 떨어지지 않는 경우 예외 처리한다. - [ ] 로또 번호를 입력받는다. - InputNumber() - [ ] 당첨번호를 입력한다.- inputUserNumbers() + - [] 당첨번호는 ,를 기준으로 나눈다 - [ ] 보너스 번호를 입력한다. - inputBonusNum() - [ ] 보너스 번호는 1개이며 1~45 사이의 숫자여야한다. @@ -80,6 +81,7 @@ ## LottoFactory - [x] 1~45개 사이의 6개의 숫자를 생성한다. - [ ] 중복되지 않은 6개의 숫자여야 한다. + - [] 로또 번호는 오름차순으로 정리되어야 한다. ### Compare From 9455d025c6d0da840102e4d26197bb4a5602d887 Mon Sep 17 00:00:00 2001 From: yoon Date: Tue, 7 Nov 2023 15:15:44 +0900 Subject: [PATCH 05/44] =?UTF-8?q?[docs]=20=EB=A1=9C=EB=98=90=20=ED=8C=90?= =?UTF-8?q?=EB=A7=A4=20=EC=95=84=EC=A3=BC=EB=A8=B8=EB=8B=88=20check?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 로또 공장에서 고객이 요구한 로또만큼 가져와서 준다. --- docs/README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/README.md b/docs/README.md index 7383e2c52..b3886c50e 100644 --- a/docs/README.md +++ b/docs/README.md @@ -68,7 +68,7 @@ ## 로또를 판매하는 아주머니 - [ ] 로또 수량을 체크한다. -- [ ] 로또 공장에서 고객이 요구한 로또만큼 가져와서 준다. +- [x] 로또 공장에서 고객이 요구한 로또만큼 가져와서 준다. ## Lotto From d800a7d3dd77c6f94febc2498fac08fb9576785e Mon Sep 17 00:00:00 2001 From: yoon Date: Tue, 7 Nov 2023 15:16:07 +0900 Subject: [PATCH 06/44] =?UTF-8?q?[Feat]=20=EB=A1=9C=EB=98=90=20=ED=8C=90?= =?UTF-8?q?=EB=A7=A4=20=EC=95=84=EC=A3=BC=EB=A8=B8=EB=8B=88=20check?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/main/kotlin/lotto/LottoSeller.kt | 17 +++++++++++++++++ 1 file changed, 17 insertions(+) create mode 100644 src/main/kotlin/lotto/LottoSeller.kt diff --git a/src/main/kotlin/lotto/LottoSeller.kt b/src/main/kotlin/lotto/LottoSeller.kt new file mode 100644 index 000000000..ebf5d53d6 --- /dev/null +++ b/src/main/kotlin/lotto/LottoSeller.kt @@ -0,0 +1,17 @@ +package lotto + +class LottoSeller(private val lottoCount: Int) { +//랜덤수에 맞게 로또를 판매하는 곳, 돈을 받은 만큼 줬지? + //what/who 계속 생각하기! + //어떤 행위가 필요한가! 이 행위를 수행할 객체는 어디인가! + + fun generateLottoNumbers(): List { + //고객이 요구한 만큼 받아서 한번에 주는 거 + val result = mutableListOf() + repeat(lottoCount) { + result.add(LottoGenerator()) + } + return result + } + +} From f7f0de5f892053e43fbcb80e68ed942d946c6d1e Mon Sep 17 00:00:00 2001 From: yoon Date: Tue, 7 Nov 2023 15:36:04 +0900 Subject: [PATCH 07/44] =?UTF-8?q?[Feat/Docs]=20=EB=A1=9C=EB=98=90=20?= =?UTF-8?q?=ED=8C=90=EB=A7=A4=20=EC=95=84=EC=A3=BC=EB=A8=B8=EB=8B=88=20che?= =?UTF-8?q?ck?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 로또 수량을 체크하고 구입 금액의 조건을 처리함 --- docs/README.md | 4 ++-- src/main/kotlin/lotto/LottoSeller.kt | 15 +++++++++++++-- 2 files changed, 15 insertions(+), 4 deletions(-) diff --git a/docs/README.md b/docs/README.md index b3886c50e..a4cd7c24c 100644 --- a/docs/README.md +++ b/docs/README.md @@ -57,7 +57,6 @@ ## User - [ ] 몇개의 로또를 살 것 인지 로또 판매 아줌씨한테 알려준다. - - [ ] 구입 금액은 1,000원 단위이며, 1,000원으로 나누어 떨어지지 않는 경우 예외 처리한다. - [ ] 로또 번호를 입력받는다. - InputNumber() - [ ] 당첨번호를 입력한다.- inputUserNumbers() - [] 당첨번호는 ,를 기준으로 나눈다 @@ -67,7 +66,8 @@ - [ ] 먼저 입력한 당첨 번호와 중복되면 안된다. ## 로또를 판매하는 아주머니 -- [ ] 로또 수량을 체크한다. +- [x] 로또 수량을 체크한다. + - [x] 구입 금액은 1,000원 단위이며, 1,000원으로 나누어 떨어지지 않는 경우 예외 처리한다. - [x] 로또 공장에서 고객이 요구한 로또만큼 가져와서 준다. ## Lotto diff --git a/src/main/kotlin/lotto/LottoSeller.kt b/src/main/kotlin/lotto/LottoSeller.kt index ebf5d53d6..8fa0b2b4b 100644 --- a/src/main/kotlin/lotto/LottoSeller.kt +++ b/src/main/kotlin/lotto/LottoSeller.kt @@ -1,6 +1,10 @@ package lotto -class LottoSeller(private val lottoCount: Int) { +private const val LOTTO_TICKET_PRICE = 1000 +private const val LOTTO_TICKET_REMAINDER = 0 +private const val EROOR_INPUT_MONEY = "로또 한장은 1,000원 입니다. 다시 입력해주세요" + +class LottoSeller(private val lottoMoney: Int) { //랜덤수에 맞게 로또를 판매하는 곳, 돈을 받은 만큼 줬지? //what/who 계속 생각하기! //어떤 행위가 필요한가! 이 행위를 수행할 객체는 어디인가! @@ -8,10 +12,17 @@ class LottoSeller(private val lottoCount: Int) { fun generateLottoNumbers(): List { //고객이 요구한 만큼 받아서 한번에 주는 거 val result = mutableListOf() - repeat(lottoCount) { + repeat(checkLottoTicketCount()) { result.add(LottoGenerator()) } return result } + private fun checkLottoTicketCount(): Int { //x원 받았는데 로또 몇장이냐?에 대한 대답 + //가격을 파는 사람이 알지 사는 사람이 우째 안대유 + if (lottoMoney % LOTTO_TICKET_PRICE != LOTTO_TICKET_REMAINDER) { + return throw IllegalArgumentException(EROOR_INPUT_MONEY + "돈을 입력받는 곳으로 다시 가야됨") + } + return lottoMoney / LOTTO_TICKET_PRICE + } } From 419add9c3b352192b66f675df22011ccfb4c44ab Mon Sep 17 00:00:00 2001 From: yoon Date: Wed, 8 Nov 2023 01:57:27 +0900 Subject: [PATCH 08/44] =?UTF-8?q?[Feat]=20=EC=A0=9C=EB=8C=80=EB=A1=9C=20?= =?UTF-8?q?=EB=90=9C=20=EB=A1=9C=EB=98=90=20=ED=95=9C=EC=9E=A5=20=EB=A7=8C?= =?UTF-8?q?=EB=93=A4=EA=B8=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 로또에 중복이 있을 경우와 중복이 없는 경우 오름차순으로 정리 된 제대로 된 예쁜 로또를 만들 수 있다. --- src/main/kotlin/lotto/LottoGenerator.kt | 16 ---------- src/main/kotlin/lotto/LottoNumberGenerator.kt | 31 +++++++++++++++++++ src/main/kotlin/lotto/NumberGenerator.kt | 2 +- 3 files changed, 32 insertions(+), 17 deletions(-) delete mode 100644 src/main/kotlin/lotto/LottoGenerator.kt create mode 100644 src/main/kotlin/lotto/LottoNumberGenerator.kt diff --git a/src/main/kotlin/lotto/LottoGenerator.kt b/src/main/kotlin/lotto/LottoGenerator.kt deleted file mode 100644 index 13e229863..000000000 --- a/src/main/kotlin/lotto/LottoGenerator.kt +++ /dev/null @@ -1,16 +0,0 @@ -package lotto - -import camp.nextstep.edu.missionutils.Randoms - -class LottoGenerator : NumberGenerator { - - override fun generate(): List { - return Randoms.pickUniqueNumbersInRange(MIN_NUMBER, MAX_NUMBER, PICK_NUMBER) - } - - companion object { - const val MIN_NUMBER = 1 - const val MAX_NUMBER = 45 - const val PICK_NUMBER = 6 - } -} diff --git a/src/main/kotlin/lotto/LottoNumberGenerator.kt b/src/main/kotlin/lotto/LottoNumberGenerator.kt new file mode 100644 index 000000000..0eb4f7dcc --- /dev/null +++ b/src/main/kotlin/lotto/LottoNumberGenerator.kt @@ -0,0 +1,31 @@ +package lotto + +import camp.nextstep.edu.missionutils.Randoms + +class LottoNumberGenerator : NumberGenerator { + //제대로 된 랜덤로또 한장을 만들어 내는 + + override fun generate(): List { + //제대로 된 로또 내놔!에 대한 응답임 + val randomLottoNumber = Randoms.pickUniqueNumbersInRange(MIN_NUMBER, MAX_NUMBER, PICK_NUMBER) + //제대로된 로또 주려면 중복체크 해야되고 정렬해서 줘야 되자넝! + return checkRandomLottoNumber(randomLottoNumber) + } + + private fun checkRandomLottoNumber(randomNum: List): List { +//나 중복체크 할 수 있어!! + if (randomNum.distinct().size > 6) generate() + return isSortedLottoNumber(randomNum) + } + + private fun isSortedLottoNumber(randomNum: List): List { + //중복체크는 되어 있는거니까 정렬해서 보내주자! + return randomNum.sorted() + } + + companion object { + const val MIN_NUMBER = 1 + const val MAX_NUMBER = 45 + const val PICK_NUMBER = 6 + } +} diff --git a/src/main/kotlin/lotto/NumberGenerator.kt b/src/main/kotlin/lotto/NumberGenerator.kt index 096673bb8..582bcaf18 100644 --- a/src/main/kotlin/lotto/NumberGenerator.kt +++ b/src/main/kotlin/lotto/NumberGenerator.kt @@ -2,4 +2,4 @@ package lotto interface NumberGenerator { fun generate(): List -} \ No newline at end of file +} From 427df8111be2fbc76d1c16887a92e0da3817d429 Mon Sep 17 00:00:00 2001 From: yoon Date: Wed, 8 Nov 2023 01:58:06 +0900 Subject: [PATCH 09/44] =?UTF-8?q?[docs]=20=EC=A0=9C=EB=8C=80=EB=A1=9C=20?= =?UTF-8?q?=EB=90=9C=20=EB=A1=9C=EB=98=90=EB=A5=BC=20=EB=A7=8C=EB=93=9C?= =?UTF-8?q?=EB=8A=94=20=EC=A1=B0=EA=B1=B4=20check?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 로또에 중복이 있을 경우와 중복이 없는 경우 오름차순으로 정리 된 제대로 된 예쁜 로또를 만들 수 있다. --- docs/README.md | 13 +++++++++---- 1 file changed, 9 insertions(+), 4 deletions(-) diff --git a/docs/README.md b/docs/README.md index a4cd7c24c..9c5d0c041 100644 --- a/docs/README.md +++ b/docs/README.md @@ -56,18 +56,20 @@ 로또구입 -> 구입한 로또 개수 조회 -> 구입한 로또 조회 -> 종료 ## User + - [ ] 몇개의 로또를 살 것 인지 로또 판매 아줌씨한테 알려준다. - [ ] 로또 번호를 입력받는다. - InputNumber() - [ ] 당첨번호를 입력한다.- inputUserNumbers() - - [] 당첨번호는 ,를 기준으로 나눈다 + - [] 당첨번호는 ,를 기준으로 나눈다 - [ ] 보너스 번호를 입력한다. - inputBonusNum() - [ ] 보너스 번호는 1개이며 1~45 사이의 숫자여야한다. - [ ] 먼저 입력한 당첨 번호와 중복되면 안된다. ## 로또를 판매하는 아주머니 + - [x] 로또 수량을 체크한다. - - [x] 구입 금액은 1,000원 단위이며, 1,000원으로 나누어 떨어지지 않는 경우 예외 처리한다. + - [x] 구입 금액은 1,000원 단위이며, 1,000원으로 나누어 떨어지지 않는 경우 예외 처리한다. - [x] 로또 공장에서 고객이 요구한 로또만큼 가져와서 준다. ## Lotto @@ -75,13 +77,16 @@ - [ ] 당첨번호는 6개이다. - [ ] 1~45 사이의 숫자여야 한다. - [ ] 중복 숫자는 없어야 한다. +- [] 로또 번호는 오름차순으로 정리되어야 한다. - [ ] ,으로 구별한다. - [ ] 위의 조건을 지키지 않은 경우 예외를 발생시킨 후 다시 당첨번호를 입력받게 한다. ## LottoFactory + - [x] 1~45개 사이의 6개의 숫자를 생성한다. - - [ ] 중복되지 않은 6개의 숫자여야 한다. - - [] 로또 번호는 오름차순으로 정리되어야 한다. +- [x] 중복 숫자는 없어야 한다. + - [x] 중복 발생시 다시 숫자 랜덤뽑게 하기 +- [x] 로또 번호는 오름차순으로 정리되어야 한다. ### Compare From 7ed81546686c722e3555870b224f25b4fa3f913f Mon Sep 17 00:00:00 2001 From: yoon Date: Wed, 8 Nov 2023 02:21:55 +0900 Subject: [PATCH 10/44] =?UTF-8?q?[Feat]=20=EB=A1=9C=EB=98=90=20=EC=95=84?= =?UTF-8?q?=EC=A3=BC=EB=A8=B8=EB=8B=88=EA=B0=80=20=EC=9B=90=ED=95=98?= =?UTF-8?q?=EB=8A=94=20=EB=A1=9C=EB=98=90=EB=A7=8C=ED=81=BC=20=EC=A0=9C?= =?UTF-8?q?=EA=B3=B5=ED=95=B4=EC=A4=8C?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 로또에 중복이 있을 경우와 중복이 없는 경우 오름차순으로 정리 된 제대로 된 예쁜 로또를 만들 수 있다. --- src/main/kotlin/lotto/LottoSeller.kt | 12 ++++++++---- 1 file changed, 8 insertions(+), 4 deletions(-) diff --git a/src/main/kotlin/lotto/LottoSeller.kt b/src/main/kotlin/lotto/LottoSeller.kt index 8fa0b2b4b..c51ecc086 100644 --- a/src/main/kotlin/lotto/LottoSeller.kt +++ b/src/main/kotlin/lotto/LottoSeller.kt @@ -9,19 +9,23 @@ class LottoSeller(private val lottoMoney: Int) { //what/who 계속 생각하기! //어떤 행위가 필요한가! 이 행위를 수행할 객체는 어디인가! - fun generateLottoNumbers(): List { + fun generateLottoNumbers(): List { //고객이 요구한 만큼 받아서 한번에 주는 거 - val result = mutableListOf() + val result = mutableListOf() repeat(checkLottoTicketCount()) { - result.add(LottoGenerator()) + result.add(LottoNumberGenerator()) } return result } + private fun createLotto(): List { + return LottoNumberGenerator().generate() + } + private fun checkLottoTicketCount(): Int { //x원 받았는데 로또 몇장이냐?에 대한 대답 //가격을 파는 사람이 알지 사는 사람이 우째 안대유 if (lottoMoney % LOTTO_TICKET_PRICE != LOTTO_TICKET_REMAINDER) { - return throw IllegalArgumentException(EROOR_INPUT_MONEY + "돈을 입력받는 곳으로 다시 가야됨") + throw IllegalArgumentException(EROOR_INPUT_MONEY + "돈을 입력받는 곳으로 다시 가야됨") } return lottoMoney / LOTTO_TICKET_PRICE } From e98a048db9a2ea4b6dc32ca5c0f965048de3ed14 Mon Sep 17 00:00:00 2001 From: yoon Date: Wed, 8 Nov 2023 02:28:36 +0900 Subject: [PATCH 11/44] =?UTF-8?q?[Feat/docs]=20=EB=AA=87=EA=B0=9C=EC=9D=98?= =?UTF-8?q?=20=EB=A1=9C=EB=98=90=EB=A5=BC=20=EC=82=B4=EA=B1=B4=EC=A7=80=20?= =?UTF-8?q?=EA=B8=88=EC=95=A1=20=EB=82=B4=EA=B8=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- docs/README.md | 6 +++--- src/main/kotlin/lotto/LottoNumberGenerator.kt | 2 +- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/docs/README.md b/docs/README.md index 9c5d0c041..f2c5f5a6b 100644 --- a/docs/README.md +++ b/docs/README.md @@ -57,9 +57,9 @@ ## User -- [ ] 몇개의 로또를 살 것 인지 로또 판매 아줌씨한테 알려준다. -- [ ] 로또 번호를 입력받는다. - InputNumber() - - [ ] 당첨번호를 입력한다.- inputUserNumbers() +- [x] 몇개의 로또를 살 것 인지 로또 판매 아줌씨한테 알려준다. +- [] 로또 번호를 입력받는다. - inputMoney() + - [ ] 당첨번호를 입력한다.- inputLottoNumber() - [] 당첨번호는 ,를 기준으로 나눈다 - [ ] 보너스 번호를 입력한다. - inputBonusNum() diff --git a/src/main/kotlin/lotto/LottoNumberGenerator.kt b/src/main/kotlin/lotto/LottoNumberGenerator.kt index 0eb4f7dcc..15f69eab7 100644 --- a/src/main/kotlin/lotto/LottoNumberGenerator.kt +++ b/src/main/kotlin/lotto/LottoNumberGenerator.kt @@ -3,7 +3,7 @@ package lotto import camp.nextstep.edu.missionutils.Randoms class LottoNumberGenerator : NumberGenerator { - //제대로 된 랜덤로또 한장을 만들어 내는 + //랜덤로또생성 후 제대로 된 로또 한장을 만들어 내는 override fun generate(): List { //제대로 된 로또 내놔!에 대한 응답임 From 743c79a5b99ad5e92950ad0c848580cdf5148b7e Mon Sep 17 00:00:00 2001 From: yoon Date: Wed, 8 Nov 2023 02:30:42 +0900 Subject: [PATCH 12/44] =?UTF-8?q?[Feat/docs]=20=EB=B3=B4=EB=84=88=EC=8A=A4?= =?UTF-8?q?=20=EC=88=AB=EC=9E=90=20=EC=9E=85=EB=A0=A5=EB=B0=9B=EA=B8=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- docs/README.md | 8 ++++---- src/main/kotlin/lotto/User.kt | 19 +++++++++++++++++++ 2 files changed, 23 insertions(+), 4 deletions(-) create mode 100644 src/main/kotlin/lotto/User.kt diff --git a/docs/README.md b/docs/README.md index f2c5f5a6b..3ee1711d1 100644 --- a/docs/README.md +++ b/docs/README.md @@ -58,11 +58,11 @@ ## User - [x] 몇개의 로또를 살 것 인지 로또 판매 아줌씨한테 알려준다. -- [] 로또 번호를 입력받는다. - inputMoney() - - [ ] 당첨번호를 입력한다.- inputLottoNumber() - - [] 당첨번호는 ,를 기준으로 나눈다 +- [x] 로또 번호를 입력받는다. - inputMoney() + - [x] 당첨번호를 입력한다.- inputLottoNumber() + - [x] 당첨번호는 ,를 기준으로 나눈다 - - [ ] 보너스 번호를 입력한다. - inputBonusNum() + - [x] 보너스 번호를 입력한다. - inputBonusNum() - [ ] 보너스 번호는 1개이며 1~45 사이의 숫자여야한다. - [ ] 먼저 입력한 당첨 번호와 중복되면 안된다. diff --git a/src/main/kotlin/lotto/User.kt b/src/main/kotlin/lotto/User.kt new file mode 100644 index 000000000..1a31fc329 --- /dev/null +++ b/src/main/kotlin/lotto/User.kt @@ -0,0 +1,19 @@ +package lotto + +import camp.nextstep.edu.missionutils.Console + +class User { + + fun inputLottoNumber(): List { + val inputString = Console.readLine() + return inputString.split(",").map { it.toInt() } + } + + fun inputBonusNum(): Int { + return Console.readLine().toInt() + } + + fun inputMoney(): Int { + return Console.readLine().toInt() + } +} From a08cadcad75579a0300390f5cb9ddca845827616 Mon Sep 17 00:00:00 2001 From: yoon Date: Wed, 8 Nov 2023 02:36:26 +0900 Subject: [PATCH 13/44] =?UTF-8?q?[Feat]=20=EB=A1=9C=EB=98=90=20=ED=8C=90?= =?UTF-8?q?=EB=A7=A4=ED=95=98=EB=8A=94=20=EA=B0=80=EA=B2=8C=20=EC=83=9D?= =?UTF-8?q?=EC=84=B1=20=EB=B0=8F=20=EC=8B=9C=EC=9E=91=EC=A7=80=EC=A0=90=20?= =?UTF-8?q?=EC=84=A4=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/main/kotlin/lotto/Application.kt | 2 +- src/main/kotlin/lotto/LottoStore.kt | 23 +++++++++++++++++++++++ 2 files changed, 24 insertions(+), 1 deletion(-) create mode 100644 src/main/kotlin/lotto/LottoStore.kt diff --git a/src/main/kotlin/lotto/Application.kt b/src/main/kotlin/lotto/Application.kt index d7168761c..0e0dfa1c6 100644 --- a/src/main/kotlin/lotto/Application.kt +++ b/src/main/kotlin/lotto/Application.kt @@ -1,5 +1,5 @@ package lotto fun main() { - TODO("프로그램 구현") + LottoStore().startSellLotto() } diff --git a/src/main/kotlin/lotto/LottoStore.kt b/src/main/kotlin/lotto/LottoStore.kt new file mode 100644 index 000000000..8f6e916ac --- /dev/null +++ b/src/main/kotlin/lotto/LottoStore.kt @@ -0,0 +1,23 @@ +package lotto + +class LottoStore { + + fun startSellLotto() { + val seller = LottoSeller(2000).generateLottoNumbers() + + for (lotto in seller) { + val lottoNumbers = lotto.generate() + println(lottoNumbers) + } + } +} + + +/* +val seller = LottoSeller(2).generateLottoNumbers() + + for (lottoGenerator in seller) { + val lottoNumbers = lottoGenerator.generate() + println(lottoNumbers) + } + */ \ No newline at end of file From 1cf4da023d8da871288df90e6fed66fb0fb6f06d Mon Sep 17 00:00:00 2001 From: yoon Date: Wed, 8 Nov 2023 13:28:49 +0900 Subject: [PATCH 14/44] =?UTF-8?q?[Feat]=20=EB=A1=9C=EB=98=90=20=EC=83=9D?= =?UTF-8?q?=EC=84=B1=20=EC=A1=B0=EA=B1=B4=20=EC=B2=B4=ED=81=AC?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 당첨번호가 6개 일때, 중복숫자가 없을 때, 로또번호 오름차순 정렬, 조건을 지키지 못했을 때 다시 입력받을 수 있도록 --- docs/README.md | 8 ++--- src/main/kotlin/lotto/Lotto.kt | 24 +++++++++++-- src/main/kotlin/lotto/LottoSeller.kt | 50 ++++++++++++++++++++++------ 3 files changed, 66 insertions(+), 16 deletions(-) diff --git a/docs/README.md b/docs/README.md index 3ee1711d1..e43aa0f6e 100644 --- a/docs/README.md +++ b/docs/README.md @@ -74,11 +74,11 @@ ## Lotto -- [ ] 당첨번호는 6개이다. +- [x] 당첨번호는 6개이다. - [ ] 1~45 사이의 숫자여야 한다. -- [ ] 중복 숫자는 없어야 한다. -- [] 로또 번호는 오름차순으로 정리되어야 한다. -- [ ] ,으로 구별한다. +- [x] 중복 숫자는 없어야 한다. +- [X] 로또 번호는 오름차순으로 정리되어야 한다. +- [x] ,으로 구별한다. - [ ] 위의 조건을 지키지 않은 경우 예외를 발생시킨 후 다시 당첨번호를 입력받게 한다. ## LottoFactory diff --git a/src/main/kotlin/lotto/Lotto.kt b/src/main/kotlin/lotto/Lotto.kt index 5ca00b4e4..0e6a020d3 100644 --- a/src/main/kotlin/lotto/Lotto.kt +++ b/src/main/kotlin/lotto/Lotto.kt @@ -2,8 +2,28 @@ package lotto class Lotto(private val numbers: List) { init { - require(numbers.size == 6) + require(numbers.size == DEFAULT_LOTTO_SIZE) } - // TODO: 추가 기능 구현 + fun checkLottoNumberException(): List { +//중복숫자 체크 및 6자리 확인 + if (numbers.size != 6) throw IllegalArgumentException(ERROR_INPUT_NUMBER_LENGTH) + if (numbers.distinct().size != 6) throw IllegalArgumentException(ERROR_INPUT_NUMBER_DISTINCT) + return numbers.sorted() + } + private fun isAllNumbersInRange(list: List): Boolean { + for (number in list) { + if (number < 1 || number > 45) { + return false + } + } + return true + } + + + companion object { + private const val DEFAULT_LOTTO_SIZE = 6 + private const val ERROR_INPUT_NUMBER_LENGTH = "[ERROR] 6개의 숫자만 입력 가능합니다" + private const val ERROR_INPUT_NUMBER_DISTINCT = "수 중에 중복이 있습니다." + } } diff --git a/src/main/kotlin/lotto/LottoSeller.kt b/src/main/kotlin/lotto/LottoSeller.kt index c51ecc086..f07f1be1f 100644 --- a/src/main/kotlin/lotto/LottoSeller.kt +++ b/src/main/kotlin/lotto/LottoSeller.kt @@ -2,31 +2,61 @@ package lotto private const val LOTTO_TICKET_PRICE = 1000 private const val LOTTO_TICKET_REMAINDER = 0 -private const val EROOR_INPUT_MONEY = "로또 한장은 1,000원 입니다. 다시 입력해주세요" +private const val ERROR_INPUT_MONEY = "로또 한장은 1,000원 입니다. 다시 입력해주세요" -class LottoSeller(private val lottoMoney: Int) { -//랜덤수에 맞게 로또를 판매하는 곳, 돈을 받은 만큼 줬지? +class LottoSeller() { + //랜덤수에 맞게 로또를 판매하는 곳, 돈을 받은 만큼 줬지? //what/who 계속 생각하기! //어떤 행위가 필요한가! 이 행위를 수행할 객체는 어디인가! - - fun generateLottoNumbers(): List { + private var inputLottoMoney = 0 + fun generateLottoNumbers(lottoMoney: Int): List { //고객이 요구한 만큼 받아서 한번에 주는 거 val result = mutableListOf() + inputLottoMoney = lottoMoney repeat(checkLottoTicketCount()) { result.add(LottoNumberGenerator()) } return result } - private fun createLotto(): List { - return LottoNumberGenerator().generate() + //야 이거 잘못된 당첨번호 로또잖아! + //다시 적어서 내렴 + fun isValidateLotto() { + try { + Lotto(User().inputLottoNumber()).checkLottoNumberException() + } catch (e: Exception) { + checkExceptionStatement(e) + LottoSeller().isValidateLotto() + } + } + + private fun checkExceptionStatement(e: Exception) { + when (e.message) { + ERROR_INPUT_NUM_LENGTH -> println(ERROR_INPUT_NUM_LENGTH_PRINT) + ERROR_INPUT_NUM -> println(ERROR_INPUT_NUM_PRINT) + else -> println(ERROR_TRY_AGAIN_NUM_PRINT) + } + } + + //미쳐버려 이거 잘못된 보너스 번호잖아! + //당첨번호랑 안겹치는 걸로 다시 적어서 내렴 + fun checkLottoHasBonusNum() { + } private fun checkLottoTicketCount(): Int { //x원 받았는데 로또 몇장이냐?에 대한 대답 //가격을 파는 사람이 알지 사는 사람이 우째 안대유 - if (lottoMoney % LOTTO_TICKET_PRICE != LOTTO_TICKET_REMAINDER) { - throw IllegalArgumentException(EROOR_INPUT_MONEY + "돈을 입력받는 곳으로 다시 가야됨") + if (inputLottoMoney % LOTTO_TICKET_PRICE != LOTTO_TICKET_REMAINDER) { + throw IllegalArgumentException(ERROR_INPUT_MONEY) } - return lottoMoney / LOTTO_TICKET_PRICE + return inputLottoMoney / LOTTO_TICKET_PRICE + } + + companion object { + const val ERROR_INPUT_NUM_LENGTH = "For input string: \"\"" + const val ERROR_INPUT_NUM_LENGTH_PRINT = "[ERROR]번호 개수를 체크해주세요" + const val ERROR_INPUT_NUM = "Failed requirement." + const val ERROR_INPUT_NUM_PRINT = "[ERROR]잘못된 번호를 입력했습니다." + const val ERROR_TRY_AGAIN_NUM_PRINT = "[ERROR]당첨번호를 다시 입력해주세요" } } From a0957ed5dd7ac8f56ee8705576d38f7b4b2beb36 Mon Sep 17 00:00:00 2001 From: yoon Date: Wed, 8 Nov 2023 13:40:40 +0900 Subject: [PATCH 15/44] =?UTF-8?q?[Feat/docs]=20=EB=A1=9C=EB=98=90=20?= =?UTF-8?q?=EC=83=9D=EC=84=B1=20=EC=A1=B0=EA=B1=B4=20=EC=B2=B4=ED=81=AC?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 1~45 사이의 숫자 --- docs/README.md | 2 +- src/main/kotlin/lotto/Lotto.kt | 11 +++++++---- 2 files changed, 8 insertions(+), 5 deletions(-) diff --git a/docs/README.md b/docs/README.md index e43aa0f6e..9015671e0 100644 --- a/docs/README.md +++ b/docs/README.md @@ -75,7 +75,7 @@ ## Lotto - [x] 당첨번호는 6개이다. -- [ ] 1~45 사이의 숫자여야 한다. +- [x] 1~45 사이의 숫자여야 한다. - [x] 중복 숫자는 없어야 한다. - [X] 로또 번호는 오름차순으로 정리되어야 한다. - [x] ,으로 구별한다. diff --git a/src/main/kotlin/lotto/Lotto.kt b/src/main/kotlin/lotto/Lotto.kt index 0e6a020d3..7bd0f426f 100644 --- a/src/main/kotlin/lotto/Lotto.kt +++ b/src/main/kotlin/lotto/Lotto.kt @@ -7,14 +7,16 @@ class Lotto(private val numbers: List) { fun checkLottoNumberException(): List { //중복숫자 체크 및 6자리 확인 - if (numbers.size != 6) throw IllegalArgumentException(ERROR_INPUT_NUMBER_LENGTH) + if (numbers.size != 6) throw IllegalArgumentException(ERROR_INPUT_NUMBER_LENGTH) if (numbers.distinct().size != 6) throw IllegalArgumentException(ERROR_INPUT_NUMBER_DISTINCT) + isAllNumbersInRange(numbers) return numbers.sorted() } - private fun isAllNumbersInRange(list: List): Boolean { + + private fun isAllNumbersInRange(list: List): Boolean { for (number in list) { if (number < 1 || number > 45) { - return false + throw IllegalArgumentException(ERROR_INPUT_NUMBER_RANGE) } } return true @@ -24,6 +26,7 @@ class Lotto(private val numbers: List) { companion object { private const val DEFAULT_LOTTO_SIZE = 6 private const val ERROR_INPUT_NUMBER_LENGTH = "[ERROR] 6개의 숫자만 입력 가능합니다" - private const val ERROR_INPUT_NUMBER_DISTINCT = "수 중에 중복이 있습니다." + private const val ERROR_INPUT_NUMBER_DISTINCT = "[ERROR]수 중에 중복이 있습니다." + private const val ERROR_INPUT_NUMBER_RANGE = "[ERROR]1~45사이의 수가 아닙니다" } } From dda081b4cf1b6a9370b1e13d5f64f7ca5e820482 Mon Sep 17 00:00:00 2001 From: yoon Date: Wed, 8 Nov 2023 14:18:18 +0900 Subject: [PATCH 16/44] =?UTF-8?q?[Feat/docs]=20=EB=B3=B4=EB=84=88=EC=8A=A4?= =?UTF-8?q?=20=EC=83=9D=EC=84=B1=20=EC=A1=B0=EA=B1=B4=20=EC=B2=B4=ED=81=AC?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 1~45 사이의 숫자, 중복체크 --- docs/README.md | 4 ++-- src/main/kotlin/lotto/LottoSeller.kt | 36 +++++++++++++++++----------- 2 files changed, 24 insertions(+), 16 deletions(-) diff --git a/docs/README.md b/docs/README.md index 9015671e0..9c6371ca6 100644 --- a/docs/README.md +++ b/docs/README.md @@ -63,8 +63,8 @@ - [x] 당첨번호는 ,를 기준으로 나눈다 - [x] 보너스 번호를 입력한다. - inputBonusNum() - - [ ] 보너스 번호는 1개이며 1~45 사이의 숫자여야한다. - - [ ] 먼저 입력한 당첨 번호와 중복되면 안된다. + - [x] 보너스 번호는 1개이며 1~45 사이의 숫자여야한다. + - [x] 먼저 입력한 당첨 번호와 중복되면 안된다. ## 로또를 판매하는 아주머니 diff --git a/src/main/kotlin/lotto/LottoSeller.kt b/src/main/kotlin/lotto/LottoSeller.kt index f07f1be1f..1d57b4477 100644 --- a/src/main/kotlin/lotto/LottoSeller.kt +++ b/src/main/kotlin/lotto/LottoSeller.kt @@ -21,9 +21,9 @@ class LottoSeller() { //야 이거 잘못된 당첨번호 로또잖아! //다시 적어서 내렴 - fun isValidateLotto() { - try { - Lotto(User().inputLottoNumber()).checkLottoNumberException() + fun isValidateLotto(): List { + return try { + return Lotto(User().inputLottoNumber()).checkLottoNumberException() } catch (e: Exception) { checkExceptionStatement(e) LottoSeller().isValidateLotto() @@ -38,12 +38,6 @@ class LottoSeller() { } } - //미쳐버려 이거 잘못된 보너스 번호잖아! - //당첨번호랑 안겹치는 걸로 다시 적어서 내렴 - fun checkLottoHasBonusNum() { - - } - private fun checkLottoTicketCount(): Int { //x원 받았는데 로또 몇장이냐?에 대한 대답 //가격을 파는 사람이 알지 사는 사람이 우째 안대유 if (inputLottoMoney % LOTTO_TICKET_PRICE != LOTTO_TICKET_REMAINDER) { @@ -52,11 +46,25 @@ class LottoSeller() { return inputLottoMoney / LOTTO_TICKET_PRICE } + //미쳐버려 이거 잘못된 보너스 번호잖아! + //당첨번호랑 안겹치는 걸로 다시 적어서 내렴 + fun checkLottoHasBonusNum(lottoList: List, bonusNum: Int) { + try { + if (lottoList.contains(bonusNum)) throw IllegalArgumentException(ERROR_INPUT_NUMBER_DISTINCT) + if (bonusNum !in 1..45) throw IllegalArgumentException(ERROR_INPUT_NUMBER_RANGE) + } catch (e: IllegalArgumentException) { + println(e.message) + LottoSeller().checkLottoHasBonusNum(lottoList, User().inputBonusNum()) + } + } + companion object { - const val ERROR_INPUT_NUM_LENGTH = "For input string: \"\"" - const val ERROR_INPUT_NUM_LENGTH_PRINT = "[ERROR]번호 개수를 체크해주세요" - const val ERROR_INPUT_NUM = "Failed requirement." - const val ERROR_INPUT_NUM_PRINT = "[ERROR]잘못된 번호를 입력했습니다." - const val ERROR_TRY_AGAIN_NUM_PRINT = "[ERROR]당첨번호를 다시 입력해주세요" + private const val ERROR_INPUT_NUM_LENGTH = "For input string: \"\"" + private const val ERROR_INPUT_NUM_LENGTH_PRINT = "[ERROR]번호 개수를 체크해주세요" + private const val ERROR_INPUT_NUM = "Failed requirement." + private const val ERROR_INPUT_NUM_PRINT = "[ERROR]잘못된 번호를 입력했습니다." + private const val ERROR_TRY_AGAIN_NUM_PRINT = "[ERROR]당첨번호를 다시 입력해주세요" + private const val ERROR_INPUT_NUMBER_RANGE = "[ERROR]1~45사이의 수가 아닙니다" + private const val ERROR_INPUT_NUMBER_DISTINCT = "[ERROR] 이미 입력한 번호 입니다." } } From 8fa4a4fbd4c7ac5abe84fc90b838e77cbe12a53d Mon Sep 17 00:00:00 2001 From: yoon Date: Wed, 8 Nov 2023 14:59:02 +0900 Subject: [PATCH 17/44] =?UTF-8?q?[style/Refactor]=20=EC=97=90=EB=9F=AC=20?= =?UTF-8?q?=EC=88=98=EC=A0=95=20=EB=B0=8F=20=ED=95=A8=EC=88=98=20=ED=98=B8?= =?UTF-8?q?=EC=B6=9C=20=EC=88=9C=EC=84=9C=20=EC=88=98=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/main/kotlin/lotto/Lotto.kt | 3 ++- src/main/kotlin/lotto/LottoSeller.kt | 6 +++--- 2 files changed, 5 insertions(+), 4 deletions(-) diff --git a/src/main/kotlin/lotto/Lotto.kt b/src/main/kotlin/lotto/Lotto.kt index 7bd0f426f..081049662 100644 --- a/src/main/kotlin/lotto/Lotto.kt +++ b/src/main/kotlin/lotto/Lotto.kt @@ -3,6 +3,7 @@ package lotto class Lotto(private val numbers: List) { init { require(numbers.size == DEFAULT_LOTTO_SIZE) + checkLottoNumberException() } fun checkLottoNumberException(): List { @@ -26,7 +27,7 @@ class Lotto(private val numbers: List) { companion object { private const val DEFAULT_LOTTO_SIZE = 6 private const val ERROR_INPUT_NUMBER_LENGTH = "[ERROR] 6개의 숫자만 입력 가능합니다" - private const val ERROR_INPUT_NUMBER_DISTINCT = "[ERROR]수 중에 중복이 있습니다." + private const val ERROR_INPUT_NUMBER_DISTINCT = "1[ERROR]수 중에 중복이 있습니다." private const val ERROR_INPUT_NUMBER_RANGE = "[ERROR]1~45사이의 수가 아닙니다" } } diff --git a/src/main/kotlin/lotto/LottoSeller.kt b/src/main/kotlin/lotto/LottoSeller.kt index 1d57b4477..611398ad0 100644 --- a/src/main/kotlin/lotto/LottoSeller.kt +++ b/src/main/kotlin/lotto/LottoSeller.kt @@ -23,14 +23,14 @@ class LottoSeller() { //다시 적어서 내렴 fun isValidateLotto(): List { return try { - return Lotto(User().inputLottoNumber()).checkLottoNumberException() - } catch (e: Exception) { + Lotto(User().inputLottoNumber()).checkLottoNumberException() + } catch (e: IllegalArgumentException) { checkExceptionStatement(e) LottoSeller().isValidateLotto() } } - private fun checkExceptionStatement(e: Exception) { + private fun checkExceptionStatement(e: IllegalArgumentException) { when (e.message) { ERROR_INPUT_NUM_LENGTH -> println(ERROR_INPUT_NUM_LENGTH_PRINT) ERROR_INPUT_NUM -> println(ERROR_INPUT_NUM_PRINT) From e84a2f50fab10075755ae96cad37a75aeae7a202 Mon Sep 17 00:00:00 2001 From: yoon Date: Wed, 8 Nov 2023 14:59:22 +0900 Subject: [PATCH 18/44] =?UTF-8?q?[docs]=20=EA=B8=B0=EB=8A=A5=EB=AA=85?= =?UTF-8?q?=EC=84=B8=20=EC=B2=B4=ED=81=AC?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- docs/README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/README.md b/docs/README.md index 9c6371ca6..362a5116b 100644 --- a/docs/README.md +++ b/docs/README.md @@ -79,7 +79,7 @@ - [x] 중복 숫자는 없어야 한다. - [X] 로또 번호는 오름차순으로 정리되어야 한다. - [x] ,으로 구별한다. -- [ ] 위의 조건을 지키지 않은 경우 예외를 발생시킨 후 다시 당첨번호를 입력받게 한다. +- [x] 위의 조건을 지키지 않은 경우 예외를 발생시킨 후 다시 당첨번호를 입력받게 한다. ## LottoFactory From 3f077a5a92078e80131bc5524443a309cc3ee0e1 Mon Sep 17 00:00:00 2001 From: yoon Date: Wed, 8 Nov 2023 16:12:52 +0900 Subject: [PATCH 19/44] =?UTF-8?q?[Feat]=20=EB=A1=9C=EB=98=90=20=EA=B8=88?= =?UTF-8?q?=EC=95=A1=20=EC=9E=85=EB=A0=A5=EB=B0=9B=EA=B8=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 제대로 입력하지 않았을 경우 예외처리 --- src/main/kotlin/lotto/LottoSeller.kt | 25 ++++++++++++++++--------- src/main/kotlin/lotto/LottoStore.kt | 18 ++++++++++++++++-- src/main/kotlin/lotto/User.kt | 17 ++++++++++------- 3 files changed, 42 insertions(+), 18 deletions(-) diff --git a/src/main/kotlin/lotto/LottoSeller.kt b/src/main/kotlin/lotto/LottoSeller.kt index 611398ad0..bbba4f4b0 100644 --- a/src/main/kotlin/lotto/LottoSeller.kt +++ b/src/main/kotlin/lotto/LottoSeller.kt @@ -1,19 +1,14 @@ package lotto -private const val LOTTO_TICKET_PRICE = 1000 -private const val LOTTO_TICKET_REMAINDER = 0 -private const val ERROR_INPUT_MONEY = "로또 한장은 1,000원 입니다. 다시 입력해주세요" class LottoSeller() { //랜덤수에 맞게 로또를 판매하는 곳, 돈을 받은 만큼 줬지? //what/who 계속 생각하기! //어떤 행위가 필요한가! 이 행위를 수행할 객체는 어디인가! - private var inputLottoMoney = 0 fun generateLottoNumbers(lottoMoney: Int): List { //고객이 요구한 만큼 받아서 한번에 주는 거 val result = mutableListOf() - inputLottoMoney = lottoMoney - repeat(checkLottoTicketCount()) { + repeat(lottoMoney) { result.add(LottoNumberGenerator()) } return result @@ -38,14 +33,22 @@ class LottoSeller() { } } - private fun checkLottoTicketCount(): Int { //x원 받았는데 로또 몇장이냐?에 대한 대답 + fun checkLottoTicketCount(lottoMoney: String): Int { //x원 받았는데 로또 몇장이냐?에 대한 대답 //가격을 파는 사람이 알지 사는 사람이 우째 안대유 - if (inputLottoMoney % LOTTO_TICKET_PRICE != LOTTO_TICKET_REMAINDER) { + lottoMoney.forEach { char -> + val charConvertedToCode = char.code + if ((charConvertedToCode > 57) or (charConvertedToCode < 48)) { + throw IllegalArgumentException(ERROR_ONLY_INPUT_INT) + } + } + if (lottoMoney.toInt() % LOTTO_TICKET_PRICE != LOTTO_TICKET_REMAINDER) { throw IllegalArgumentException(ERROR_INPUT_MONEY) } - return inputLottoMoney / LOTTO_TICKET_PRICE + + return lottoMoney.toInt() / LOTTO_TICKET_PRICE } + //미쳐버려 이거 잘못된 보너스 번호잖아! //당첨번호랑 안겹치는 걸로 다시 적어서 내렴 fun checkLottoHasBonusNum(lottoList: List, bonusNum: Int) { @@ -59,6 +62,10 @@ class LottoSeller() { } companion object { + private const val LOTTO_TICKET_PRICE = 1000 + private const val LOTTO_TICKET_REMAINDER = 0 + private const val ERROR_INPUT_MONEY = "[ERROR]로또 한장은 1,000원 입니다. 다시 입력해주세요" + private const val ERROR_ONLY_INPUT_INT = "[ERROR] 정수만 입력 가능합니다" private const val ERROR_INPUT_NUM_LENGTH = "For input string: \"\"" private const val ERROR_INPUT_NUM_LENGTH_PRINT = "[ERROR]번호 개수를 체크해주세요" private const val ERROR_INPUT_NUM = "Failed requirement." diff --git a/src/main/kotlin/lotto/LottoStore.kt b/src/main/kotlin/lotto/LottoStore.kt index 8f6e916ac..d15fa9824 100644 --- a/src/main/kotlin/lotto/LottoStore.kt +++ b/src/main/kotlin/lotto/LottoStore.kt @@ -3,8 +3,13 @@ package lotto class LottoStore { fun startSellLotto() { - val seller = LottoSeller(2000).generateLottoNumbers() - + println("구입 금액을 입력해주세요") + val seller = LottoSeller().generateLottoNumbers(userInput(User().inputMoney())) + println("당첨번호를 입력해주세요") + val validLotto = LottoSeller().isValidateLotto() + println("보너스 번호를 입력해주세요") + LottoSeller().checkLottoHasBonusNum(validLotto, User().inputBonusNum()) + println("발행한 로또 번호 및 수량 출력") for (lotto in seller) { val lottoNumbers = lotto.generate() println(lottoNumbers) @@ -12,6 +17,15 @@ class LottoStore { } } +private fun userInput(money: String): Int { + return try { + LottoSeller().checkLottoTicketCount(money) + } catch (e: IllegalArgumentException) { + println(e.message) + userInput(User().inputMoney()) + } +} + /* val seller = LottoSeller(2).generateLottoNumbers() diff --git a/src/main/kotlin/lotto/User.kt b/src/main/kotlin/lotto/User.kt index 1a31fc329..5dc417043 100644 --- a/src/main/kotlin/lotto/User.kt +++ b/src/main/kotlin/lotto/User.kt @@ -2,18 +2,21 @@ package lotto import camp.nextstep.edu.missionutils.Console -class User { +private const val COMMA = "," - fun inputLottoNumber(): List { - val inputString = Console.readLine() - return inputString.split(",").map { it.toInt() } - } +class User { + private val _purchasedLotto = mutableListOf() fun inputBonusNum(): Int { return Console.readLine().toInt() } - fun inputMoney(): Int { - return Console.readLine().toInt() + fun inputMoney(): String { + return Console.readLine() + } + + fun inputLottoNumber(): List { + val inputString = Console.readLine() + return inputString.split(COMMA).map { it.toInt() } } } From 10f87f442d6f0bb864abb009539cb9a472ea672b Mon Sep 17 00:00:00 2001 From: yoon Date: Wed, 8 Nov 2023 17:43:41 +0900 Subject: [PATCH 20/44] =?UTF-8?q?[Feat]=20=EB=B3=B4=EB=84=88=EC=8A=A4=20?= =?UTF-8?q?=EA=B0=92=20=EC=B6=9C=EB=A0=A5?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/main/kotlin/lotto/LottoSeller.kt | 18 ++++++++++++++---- 1 file changed, 14 insertions(+), 4 deletions(-) diff --git a/src/main/kotlin/lotto/LottoSeller.kt b/src/main/kotlin/lotto/LottoSeller.kt index bbba4f4b0..aa3cc9494 100644 --- a/src/main/kotlin/lotto/LottoSeller.kt +++ b/src/main/kotlin/lotto/LottoSeller.kt @@ -51,16 +51,26 @@ class LottoSeller() { //미쳐버려 이거 잘못된 보너스 번호잖아! //당첨번호랑 안겹치는 걸로 다시 적어서 내렴 - fun checkLottoHasBonusNum(lottoList: List, bonusNum: Int) { - try { - if (lottoList.contains(bonusNum)) throw IllegalArgumentException(ERROR_INPUT_NUMBER_DISTINCT) - if (bonusNum !in 1..45) throw IllegalArgumentException(ERROR_INPUT_NUMBER_RANGE) + fun checkLottoHasBonusNum(lottoList: List, bonusNum: Int): Int { + return try { + checkContainNum(lottoList, bonusNum) + checkBonuslength(bonusNum) } catch (e: IllegalArgumentException) { println(e.message) LottoSeller().checkLottoHasBonusNum(lottoList, User().inputBonusNum()) } } + private fun checkContainNum(lottoList: List, bonusNum: Int): Int { + if (lottoList.contains(bonusNum)) throw IllegalArgumentException(ERROR_INPUT_NUMBER_DISTINCT) + return bonusNum + } + + private fun checkBonuslength(bonusNum: Int): Int { + if (bonusNum !in 1..45) throw IllegalArgumentException(ERROR_INPUT_NUMBER_RANGE) + return bonusNum + } + companion object { private const val LOTTO_TICKET_PRICE = 1000 private const val LOTTO_TICKET_REMAINDER = 0 From 2dc93af255700a83d2cecb274ec200d116377677 Mon Sep 17 00:00:00 2001 From: yoon Date: Wed, 8 Nov 2023 18:33:52 +0900 Subject: [PATCH 21/44] =?UTF-8?q?[Feat]=20=EB=A1=9C=EB=98=90=EC=9D=98=20?= =?UTF-8?q?=EB=8B=B9=EC=B2=A8=20=EC=88=98=EB=A5=BC=20=EC=95=8C=20=EC=88=98?= =?UTF-8?q?=20=EC=9E=88=EA=B2=8C=20=EC=83=9D=EC=84=B1?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit enum class 이용 --- src/main/kotlin/lotto/MatchedCount.kt | 23 +++++++++++++++++++++++ 1 file changed, 23 insertions(+) create mode 100644 src/main/kotlin/lotto/MatchedCount.kt diff --git a/src/main/kotlin/lotto/MatchedCount.kt b/src/main/kotlin/lotto/MatchedCount.kt new file mode 100644 index 000000000..ea7dbb721 --- /dev/null +++ b/src/main/kotlin/lotto/MatchedCount.kt @@ -0,0 +1,23 @@ +package lotto + +enum class MatchedCount(val title: String, val prize: Long, val description: String) { + FIFTH("5등", 5_000, "3개 일치"), + FOURTH("4등", 50_000, "4개 일치"), + THIRD("3등", 1_500_000, "5개 일치"), + SECOND("2등", 30_000_000, "5개 일치, 보너스 볼 일치"), + FIRST("1등", 2_000_000_000, "6개 일치"), + + NONE("낙첨", 0, "2개 이하 일치"); + + companion object { + fun fromMatchedNumbers(matchedNumbers: Int, isBonusNumberMatched: Boolean): MatchedCount { + return when (matchedNumbers) { + 6 -> FIRST + 5 -> if (isBonusNumberMatched) SECOND else THIRD + 4 -> FOURTH + 3 -> FIFTH + else -> NONE + } + } + } +} \ No newline at end of file From 039a4e15364699507ccf4133beebe0229f04ec3f Mon Sep 17 00:00:00 2001 From: yoon Date: Wed, 8 Nov 2023 18:34:24 +0900 Subject: [PATCH 22/44] =?UTF-8?q?[Feat]=20lotto=EC=9D=98=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?=EA=B3=B3?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/main/kotlin/lotto/Calculator.kt | 38 +++++++++++++++++++++++++++++ 1 file changed, 38 insertions(+) create mode 100644 src/main/kotlin/lotto/Calculator.kt diff --git a/src/main/kotlin/lotto/Calculator.kt b/src/main/kotlin/lotto/Calculator.kt new file mode 100644 index 000000000..754a85727 --- /dev/null +++ b/src/main/kotlin/lotto/Calculator.kt @@ -0,0 +1,38 @@ +package lotto + +class Calculator( + private val userLotto: List, + private val bonusNum: Int, + private val lottoMachine: MutableList> +) { +//비교하는 곳 , 나 이거 비교해줘! 라는 곳에 대한 대답 +//그러려면 사용자가 입력한 값과 로또 리스트를 비교하는자가 가지고 있어야겠지? + + val lottoResult = mutableMapOf( + MatchedCount.FIFTH to 0, + MatchedCount.FOURTH to 0, + MatchedCount.THIRD to 0, + MatchedCount.SECOND to 0, + MatchedCount.FIRST to 0, + ) + + private fun compareNum() { + for (lotto in lottoMachine) { + val matchedNumbers = lotto.count { it in userLotto } + val isBonusNumberMatched = userLotto.contains(lotto.last()) // 보너스 볼 확인 + + val matchedCount = MatchedCount.fromMatchedNumbers(matchedNumbers, isBonusNumberMatched) + val currentCount = lottoResult[matchedCount] ?: 0 + lottoResult[matchedCount] = currentCount + 1 + } + } + + + + + //사용자의 로또와 컴터 한장 로또가 포함되어 있는지 + //포함되어이씅면 count++ + //보너스도 확인 + + +} \ No newline at end of file From 6bd095fa7b0131114156eac088c0d21c15850f3c Mon Sep 17 00:00:00 2001 From: yoon Date: Wed, 8 Nov 2023 19:22:00 +0900 Subject: [PATCH 23/44] =?UTF-8?q?[Refactor]=20=EB=B3=80=EC=88=98=EB=AA=85?= =?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 --- src/main/kotlin/lotto/MatchedCount.kt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/main/kotlin/lotto/MatchedCount.kt b/src/main/kotlin/lotto/MatchedCount.kt index ea7dbb721..bfddadea0 100644 --- a/src/main/kotlin/lotto/MatchedCount.kt +++ b/src/main/kotlin/lotto/MatchedCount.kt @@ -1,6 +1,6 @@ package lotto -enum class MatchedCount(val title: String, val prize: Long, val description: String) { +enum class MatchedCount(val title: String, val prize: Long, val statement: String) { FIFTH("5등", 5_000, "3개 일치"), FOURTH("4등", 50_000, "4개 일치"), THIRD("3등", 1_500_000, "5개 일치"), From 12ab40f650071a5f9716a479adc536adeae78871 Mon Sep 17 00:00:00 2001 From: yoon Date: Wed, 8 Nov 2023 19:23:11 +0900 Subject: [PATCH 24/44] =?UTF-8?q?[Feat]=20=EB=A1=9C=EB=98=90=20=EB=A6=AC?= =?UTF-8?q?=EC=8A=A4=ED=8A=B8=EC=99=80=20=EC=82=AC=EC=9A=A9=EC=9E=90?= =?UTF-8?q?=EA=B0=80=20=EC=9E=85=EB=A0=A5=ED=95=9C=20=EA=B0=92=20=EB=B9=84?= =?UTF-8?q?=EA=B5=90=20=EB=AA=87=EB=93=B1=EC=9D=B8=EC=A7=80=20=EC=B9=B4?= =?UTF-8?q?=EC=9A=B4=ED=8A=B8?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 만들어낸 로또랑 사용자가 입력한 로또랑 비교해서 몇개가 맞았는지 기록하는 함수 생성 --- src/main/kotlin/lotto/Calculator.kt | 14 +++++------ src/main/kotlin/lotto/LottoStore.kt | 37 +++++++++++++++++------------ 2 files changed, 28 insertions(+), 23 deletions(-) diff --git a/src/main/kotlin/lotto/Calculator.kt b/src/main/kotlin/lotto/Calculator.kt index 754a85727..22436108d 100644 --- a/src/main/kotlin/lotto/Calculator.kt +++ b/src/main/kotlin/lotto/Calculator.kt @@ -17,19 +17,17 @@ class Calculator( ) private fun compareNum() { + //로또속 번호와 사용자가 입력한 번호를 비교해서 몇개가 당첨인지를 알수 있다. for (lotto in lottoMachine) { - val matchedNumbers = lotto.count { it in userLotto } - val isBonusNumberMatched = userLotto.contains(lotto.last()) // 보너스 볼 확인 - val matchedCount = MatchedCount.fromMatchedNumbers(matchedNumbers, isBonusNumberMatched) - val currentCount = lottoResult[matchedCount] ?: 0 - lottoResult[matchedCount] = currentCount + 1 + val matchedNumbers = lotto.intersect(userLotto).size + val isBonusMatched = userLotto.contains(bonusNum) //보너스 볼이 포함 되어 있는지 확인 + + val lottoRank = MatchedCount.fromMatchedNumbers(matchedNumbers, isBonusMatched) + if (lottoRank != MatchedCount.NONE) lottoResult[lottoRank] = lottoResult.getOrDefault(lottoRank, 0) + 1 } } - - - //사용자의 로또와 컴터 한장 로또가 포함되어 있는지 //포함되어이씅면 count++ //보너스도 확인 diff --git a/src/main/kotlin/lotto/LottoStore.kt b/src/main/kotlin/lotto/LottoStore.kt index d15fa9824..e358fae9f 100644 --- a/src/main/kotlin/lotto/LottoStore.kt +++ b/src/main/kotlin/lotto/LottoStore.kt @@ -1,32 +1,39 @@ package lotto class LottoStore { - + private val randomLottos = mutableListOf>() fun startSellLotto() { println("구입 금액을 입력해주세요") val seller = LottoSeller().generateLottoNumbers(userInput(User().inputMoney())) + showRandomLotto(seller) + println("당첨번호를 입력해주세요") - val validLotto = LottoSeller().isValidateLotto() + val lottoNumbers = LottoSeller().isValidateLotto() println("보너스 번호를 입력해주세요") - LottoSeller().checkLottoHasBonusNum(validLotto, User().inputBonusNum()) - println("발행한 로또 번호 및 수량 출력") - for (lotto in seller) { - val lottoNumbers = lotto.generate() - println(lottoNumbers) + val isBonusValid = LottoSeller().checkLottoHasBonusNum(lottoNumbers, User().inputBonusNum()) + Calculator(lottoNumbers, isBonusValid, randomLottos) + } + + + private fun userInput(money: String): Int { + return try { + LottoSeller().checkLottoTicketCount(money) + } catch (e: IllegalArgumentException) { + println(e.message) + userInput(User().inputMoney()) } } -} -private fun userInput(money: String): Int { - return try { - LottoSeller().checkLottoTicketCount(money) - } catch (e: IllegalArgumentException) { - println(e.message) - userInput(User().inputMoney()) + private fun showRandomLotto(randomLotto: List) { + println("${randomLotto.size}개를 구매했습니다.") + for (lotto in randomLotto) { + val machineLottoNumbers = lotto.generate() + println(machineLottoNumbers) + randomLottos.add(machineLottoNumbers) + } } } - /* val seller = LottoSeller(2).generateLottoNumbers() From 64546681f124f64658933ce1b5abd7dd787f8600 Mon Sep 17 00:00:00 2001 From: yoon Date: Wed, 8 Nov 2023 19:27:52 +0900 Subject: [PATCH 25/44] =?UTF-8?q?[docs]=20=EB=A1=9C=EB=98=90=EB=A5=BC=20?= =?UTF-8?q?=EB=B9=84=EA=B5=90=ED=95=A0=20=EC=88=98=20=EC=9E=88=EB=8A=94=20?= =?UTF-8?q?=EA=B8=B0=EB=8A=A5=20check?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- docs/README.md | 2 +- src/main/kotlin/lotto/Calculator.kt | 7 +------ 2 files changed, 2 insertions(+), 7 deletions(-) diff --git a/docs/README.md b/docs/README.md index 362a5116b..2aeae6c67 100644 --- a/docs/README.md +++ b/docs/README.md @@ -90,7 +90,7 @@ ### Compare -- [ ] 손님과 랜덤 로또 번호를 비교할 수 있다. compare() +- [x] 손님과 랜덤 로또 번호를 비교할 수 있다. compare() - [ ] 로또가 같은 숫자를 포함하고 있으면 당첨이다. checkSameNumber() - [ ] 3개번호 일치 - 5000원 - [ ] 4개 번호 일치 - 50000원 diff --git a/src/main/kotlin/lotto/Calculator.kt b/src/main/kotlin/lotto/Calculator.kt index 22436108d..8eb4bd3b1 100644 --- a/src/main/kotlin/lotto/Calculator.kt +++ b/src/main/kotlin/lotto/Calculator.kt @@ -16,7 +16,7 @@ class Calculator( MatchedCount.FIRST to 0, ) - private fun compareNum() { + fun compareNum() { //로또속 번호와 사용자가 입력한 번호를 비교해서 몇개가 당첨인지를 알수 있다. for (lotto in lottoMachine) { @@ -28,9 +28,4 @@ class Calculator( } } - //사용자의 로또와 컴터 한장 로또가 포함되어 있는지 - //포함되어이씅면 count++ - //보너스도 확인 - - } \ No newline at end of file From 3ac315df7d01d473c209bb39890ba4011fa4216e Mon Sep 17 00:00:00 2001 From: yoon Date: Wed, 8 Nov 2023 19:47:46 +0900 Subject: [PATCH 26/44] =?UTF-8?q?[Feat]=20=EC=B6=9C=EB=A0=A5=EB=AC=B8=20?= =?UTF-8?q?=EB=B3=B4=EC=97=AC=EC=A3=BC=EB=8A=94=20view=20=EB=B6=84?= =?UTF-8?q?=EB=A6=AC?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 출력 문구 class로 모아두기 --- src/main/kotlin/lotto/LottoGameView.kt | 22 ++++++++++++++++++++++ src/main/kotlin/lotto/LottoSeller.kt | 4 ++-- src/main/kotlin/lotto/LottoStore.kt | 25 +++++++++++-------------- 3 files changed, 35 insertions(+), 16 deletions(-) create mode 100644 src/main/kotlin/lotto/LottoGameView.kt diff --git a/src/main/kotlin/lotto/LottoGameView.kt b/src/main/kotlin/lotto/LottoGameView.kt new file mode 100644 index 000000000..862e75ef1 --- /dev/null +++ b/src/main/kotlin/lotto/LottoGameView.kt @@ -0,0 +1,22 @@ +package lotto + +class LottoGameView { + + fun startInputLottoMoney() { + println(INPUT_MONEY) + } + + fun inputUserLottoNumber() { + println(INPUT_LOTTO_NUMBERS) + } + + fun inputBonusNumber() { + println(INPUT_BONUS) + } + + companion object { + private const val INPUT_MONEY = "구입 금액을 입력해주세요" + private const val INPUT_LOTTO_NUMBERS = "당첨번호를 입력해주세요" + private const val INPUT_BONUS = "보너스 번호를 입력해주세요" + } +} \ No newline at end of file diff --git a/src/main/kotlin/lotto/LottoSeller.kt b/src/main/kotlin/lotto/LottoSeller.kt index aa3cc9494..dc90edb28 100644 --- a/src/main/kotlin/lotto/LottoSeller.kt +++ b/src/main/kotlin/lotto/LottoSeller.kt @@ -72,8 +72,8 @@ class LottoSeller() { } companion object { - private const val LOTTO_TICKET_PRICE = 1000 - private const val LOTTO_TICKET_REMAINDER = 0 + const val LOTTO_TICKET_PRICE = 1000 + const val LOTTO_TICKET_REMAINDER = 0 private const val ERROR_INPUT_MONEY = "[ERROR]로또 한장은 1,000원 입니다. 다시 입력해주세요" private const val ERROR_ONLY_INPUT_INT = "[ERROR] 정수만 입력 가능합니다" private const val ERROR_INPUT_NUM_LENGTH = "For input string: \"\"" diff --git a/src/main/kotlin/lotto/LottoStore.kt b/src/main/kotlin/lotto/LottoStore.kt index e358fae9f..bb41bdcb0 100644 --- a/src/main/kotlin/lotto/LottoStore.kt +++ b/src/main/kotlin/lotto/LottoStore.kt @@ -2,16 +2,22 @@ package lotto class LottoStore { private val randomLottos = mutableListOf>() + private val lottoGameView = LottoGameView() fun startSellLotto() { - println("구입 금액을 입력해주세요") + lottoGameView.startInputLottoMoney() val seller = LottoSeller().generateLottoNumbers(userInput(User().inputMoney())) showRandomLotto(seller) - - println("당첨번호를 입력해주세요") + lottoGameView.inputUserLottoNumber() val lottoNumbers = LottoSeller().isValidateLotto() - println("보너스 번호를 입력해주세요") + lottoGameView.inputBonusNumber() val isBonusValid = LottoSeller().checkLottoHasBonusNum(lottoNumbers, User().inputBonusNum()) - Calculator(lottoNumbers, isBonusValid, randomLottos) + resultLotto(lottoNumbers, isBonusValid) + } + + private fun resultLotto(lottoNumbers: List, isBonusValid: Int) { + val lottoResult = Calculator(lottoNumbers, isBonusValid, randomLottos) + lottoResult.compareNum() + lottoResult.calculateProfitRate() } @@ -33,12 +39,3 @@ class LottoStore { } } } - -/* -val seller = LottoSeller(2).generateLottoNumbers() - - for (lottoGenerator in seller) { - val lottoNumbers = lottoGenerator.generate() - println(lottoNumbers) - } - */ \ No newline at end of file From d6f5faa86a72dc1a49e8243884e70a750116b488 Mon Sep 17 00:00:00 2001 From: yoon Date: Wed, 8 Nov 2023 19:47:58 +0900 Subject: [PATCH 27/44] =?UTF-8?q?[Feat]=20=EC=88=98=EC=9D=B5=EB=A5=A0=20?= =?UTF-8?q?=EA=B3=84=EC=82=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/main/kotlin/lotto/Calculator.kt | 18 ++++++++++++++++-- 1 file changed, 16 insertions(+), 2 deletions(-) diff --git a/src/main/kotlin/lotto/Calculator.kt b/src/main/kotlin/lotto/Calculator.kt index 8eb4bd3b1..338dbeffd 100644 --- a/src/main/kotlin/lotto/Calculator.kt +++ b/src/main/kotlin/lotto/Calculator.kt @@ -1,5 +1,7 @@ package lotto +import lotto.LottoSeller.Companion.LOTTO_TICKET_PRICE + class Calculator( private val userLotto: List, private val bonusNum: Int, @@ -15,8 +17,8 @@ class Calculator( MatchedCount.SECOND to 0, MatchedCount.FIRST to 0, ) - - fun compareNum() { + private var profitability = 0L + fun compareNum() { //로또속 번호와 사용자가 입력한 번호를 비교해서 몇개가 당첨인지를 알수 있다. for (lotto in lottoMachine) { @@ -28,4 +30,16 @@ class Calculator( } } + fun calculateProfitRate(): Float { + calculateProfit() + val moneySpent = lottoMachine.size * LOTTO_TICKET_PRICE + return (profitability * 100f) / moneySpent + } + + private fun calculateProfit() { + lottoResult.forEach { (rank, count) -> + profitability += rank.prize * count + } + } + } \ No newline at end of file From 6543ea862b7d325bc499578a94e176628650239f Mon Sep 17 00:00:00 2001 From: yoon Date: Wed, 8 Nov 2023 20:30:02 +0900 Subject: [PATCH 28/44] =?UTF-8?q?[Refactor]=20=EC=83=9D=EC=84=B1=EC=9E=90?= =?UTF-8?q?=20=ED=8C=8C=EB=9D=BC=EB=AF=B8=ED=84=B0=20=EC=9C=84=EC=B9=98=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/main/kotlin/lotto/Calculator.kt | 19 +++++++++++++------ 1 file changed, 13 insertions(+), 6 deletions(-) diff --git a/src/main/kotlin/lotto/Calculator.kt b/src/main/kotlin/lotto/Calculator.kt index 338dbeffd..5df48be87 100644 --- a/src/main/kotlin/lotto/Calculator.kt +++ b/src/main/kotlin/lotto/Calculator.kt @@ -3,9 +3,7 @@ package lotto import lotto.LottoSeller.Companion.LOTTO_TICKET_PRICE class Calculator( - private val userLotto: List, - private val bonusNum: Int, - private val lottoMachine: MutableList> + ) { //비교하는 곳 , 나 이거 비교해줘! 라는 곳에 대한 대답 //그러려면 사용자가 입력한 값과 로또 리스트를 비교하는자가 가지고 있어야겠지? @@ -18,13 +16,19 @@ class Calculator( MatchedCount.FIRST to 0, ) private var profitability = 0L - fun compareNum() { + private var lottoTicketCount = 0 + fun compareNum( + userLotto: List, + bonusNum: Int, + lottoMachine: MutableList> + ) { //로또속 번호와 사용자가 입력한 번호를 비교해서 몇개가 당첨인지를 알수 있다. + lottoTicketCount = lottoMachine.size for (lotto in lottoMachine) { val matchedNumbers = lotto.intersect(userLotto).size val isBonusMatched = userLotto.contains(bonusNum) //보너스 볼이 포함 되어 있는지 확인 - +// println("matchedNumbers $matchedNumbers") val lottoRank = MatchedCount.fromMatchedNumbers(matchedNumbers, isBonusMatched) if (lottoRank != MatchedCount.NONE) lottoResult[lottoRank] = lottoResult.getOrDefault(lottoRank, 0) + 1 } @@ -32,12 +36,15 @@ class Calculator( fun calculateProfitRate(): Float { calculateProfit() - val moneySpent = lottoMachine.size * LOTTO_TICKET_PRICE + val moneySpent = lottoTicketCount * LOTTO_TICKET_PRICE +// println("수익률 계산하는 곳 $moneySpent") +// println("수익률 $profitability") return (profitability * 100f) / moneySpent } private fun calculateProfit() { lottoResult.forEach { (rank, count) -> +// println("lottoResult $lottoResult") profitability += rank.prize * count } } From 906af98c753fb07e79bc7f2788f9bcd9d8a7a03f Mon Sep 17 00:00:00 2001 From: yoon Date: Wed, 8 Nov 2023 20:30:58 +0900 Subject: [PATCH 29/44] =?UTF-8?q?[Feat/docs]=20=EC=88=98=EC=9D=B5=EB=A5=A0?= =?UTF-8?q?=20=EA=B3=84=EC=82=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- docs/README.md | 2 +- src/main/kotlin/lotto/LottoGameView.kt | 22 ++++++++++++++++++++++ 2 files changed, 23 insertions(+), 1 deletion(-) diff --git a/docs/README.md b/docs/README.md index 2aeae6c67..639f311af 100644 --- a/docs/README.md +++ b/docs/README.md @@ -104,4 +104,4 @@ ## **YieldCalculator** -- [ ] 수익률을 계산할 수 있다. \ No newline at end of file +- [x] 수익률을 계산할 수 있다. \ No newline at end of file diff --git a/src/main/kotlin/lotto/LottoGameView.kt b/src/main/kotlin/lotto/LottoGameView.kt index 862e75ef1..2ed72eb5e 100644 --- a/src/main/kotlin/lotto/LottoGameView.kt +++ b/src/main/kotlin/lotto/LottoGameView.kt @@ -14,9 +14,31 @@ class LottoGameView { println(INPUT_BONUS) } + fun printMatchedNumbersCount() { + println(SHOW_MATCH_PROFIT) + println(SHOW_PROFIT_LINE) + Calculator().lottoResult.forEach { (rank, count) -> + val prize = rank.prize + println("${rank.statement} (${prize.toDecimalFormat()}$MONEY_WON) - ${count}$COUNT") + } + } + + fun Long.toDecimalFormat(): String { + return String.format("%,d", this) + } + + fun printProfitRate(profitRate: Float) { + println("$ALL_PRICE_RATE ${"%.1f".format(profitRate)}%입니다.") + } + companion object { private const val INPUT_MONEY = "구입 금액을 입력해주세요" private const val INPUT_LOTTO_NUMBERS = "당첨번호를 입력해주세요" private const val INPUT_BONUS = "보너스 번호를 입력해주세요" + private const val SHOW_MATCH_PROFIT = "당첨 통계" + private const val SHOW_PROFIT_LINE = "---" + private const val MONEY_WON = "원" + private const val COUNT = "개" + private const val ALL_PRICE_RATE = "총 수익률은" } } \ No newline at end of file From f7dc8a837f3aac0837198b4b4f8c970dd676433b Mon Sep 17 00:00:00 2001 From: yoon Date: Wed, 8 Nov 2023 20:31:12 +0900 Subject: [PATCH 30/44] =?UTF-8?q?[Feat]=20=EC=B6=9C=EB=A0=A5=ED=95=A8?= =?UTF-8?q?=EC=88=98=20=EC=83=9D=EC=84=B1?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/main/kotlin/lotto/LottoStore.kt | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/src/main/kotlin/lotto/LottoStore.kt b/src/main/kotlin/lotto/LottoStore.kt index bb41bdcb0..e2e4597a2 100644 --- a/src/main/kotlin/lotto/LottoStore.kt +++ b/src/main/kotlin/lotto/LottoStore.kt @@ -15,9 +15,10 @@ class LottoStore { } private fun resultLotto(lottoNumbers: List, isBonusValid: Int) { - val lottoResult = Calculator(lottoNumbers, isBonusValid, randomLottos) - lottoResult.compareNum() - lottoResult.calculateProfitRate() + val lottoResult = Calculator() + lottoResult.compareNum(lottoNumbers, isBonusValid, randomLottos) + LottoGameView().printMatchedNumbersCount() + LottoGameView().printProfitRate(lottoResult.calculateProfitRate()) } From f7d851d397e272587c747a70f1ff1db185007d87 Mon Sep 17 00:00:00 2001 From: yoon Date: Wed, 8 Nov 2023 20:43:52 +0900 Subject: [PATCH 31/44] =?UTF-8?q?[Test]=20LottoTest=20=EB=B2=94=EC=9C=84?= =?UTF-8?q?=20=EC=98=88=EC=99=B8=20=EC=B6=94=EA=B0=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/test/kotlin/lotto/LottoTest.kt | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/src/test/kotlin/lotto/LottoTest.kt b/src/test/kotlin/lotto/LottoTest.kt index 11d85ac2c..77c8aa16e 100644 --- a/src/test/kotlin/lotto/LottoTest.kt +++ b/src/test/kotlin/lotto/LottoTest.kt @@ -19,6 +19,11 @@ class LottoTest { Lotto(listOf(1, 2, 3, 4, 5, 5)) } } - + @Test + fun `로또 변호 범위가 1~45가 아닌 경우 예외가 발생한다`() { + assertThrows { + Lotto(listOf(1, 49, 3, 4, 5, 88)) + } + } // 아래에 추가 테스트 작성 가능 } From 3eb20bbfd5244038e4162cf0c05654d14213ead0 Mon Sep 17 00:00:00 2001 From: yoon Date: Wed, 8 Nov 2023 21:07:03 +0900 Subject: [PATCH 32/44] =?UTF-8?q?[Feat/docs]=20=EC=9D=BC=EC=B9=98=ED=95=98?= =?UTF-8?q?=EB=8A=94=20=EC=88=98=EC=97=90=20=EB=A7=9E=EA=B2=8C=20=EB=8B=B9?= =?UTF-8?q?=EC=B2=A8=EA=B8=88=20=EC=88=98=EB=A0=B9=20check?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- docs/README.md | 12 ++++++------ src/main/kotlin/lotto/LottoStore.kt | 15 +++++++-------- 2 files changed, 13 insertions(+), 14 deletions(-) diff --git a/docs/README.md b/docs/README.md index 639f311af..59ff18df9 100644 --- a/docs/README.md +++ b/docs/README.md @@ -91,12 +91,12 @@ ### Compare - [x] 손님과 랜덤 로또 번호를 비교할 수 있다. compare() - - [ ] 로또가 같은 숫자를 포함하고 있으면 당첨이다. checkSameNumber() - - [ ] 3개번호 일치 - 5000원 - - [ ] 4개 번호 일치 - 50000원 - - [ ] 5개 번호 일치 - 1500000 - - [ ] 5개번호+ 보너스 번호 일치 - 3000000 - - [ ] 6개 번호 일치 1등 - 2000000000 + - [x] 로또가 같은 숫자를 포함하고 있으면 당첨이다. checkSameNumber() + - [x] 3개번호 일치 - 5000원 + - [x] 4개 번호 일치 - 50000원 + - [x] 5개 번호 일치 - 1500000 + - [x] 5개번호+ 보너스 번호 일치 - 3000000 + - [x] 6개 번호 일치 1등 - 2000000000 ## WinningNumberChecker diff --git a/src/main/kotlin/lotto/LottoStore.kt b/src/main/kotlin/lotto/LottoStore.kt index e2e4597a2..3a9a93f9c 100644 --- a/src/main/kotlin/lotto/LottoStore.kt +++ b/src/main/kotlin/lotto/LottoStore.kt @@ -14,14 +14,6 @@ class LottoStore { resultLotto(lottoNumbers, isBonusValid) } - private fun resultLotto(lottoNumbers: List, isBonusValid: Int) { - val lottoResult = Calculator() - lottoResult.compareNum(lottoNumbers, isBonusValid, randomLottos) - LottoGameView().printMatchedNumbersCount() - LottoGameView().printProfitRate(lottoResult.calculateProfitRate()) - } - - private fun userInput(money: String): Int { return try { LottoSeller().checkLottoTicketCount(money) @@ -39,4 +31,11 @@ class LottoStore { randomLottos.add(machineLottoNumbers) } } + + private fun resultLotto(lottoNumbers: List, isBonusValid: Int) { + val lottoResult = Calculator() + lottoResult.compareNum(lottoNumbers, isBonusValid, randomLottos) + LottoGameView().printMatchedNumbersCount() + LottoGameView().printProfitRate(lottoResult.calculateProfitRate()) + } } From ce80548e0a72c3e7d494710d3d6602dc5feca898 Mon Sep 17 00:00:00 2001 From: yoon Date: Wed, 8 Nov 2023 21:53:48 +0900 Subject: [PATCH 33/44] =?UTF-8?q?[Feat]=20=EB=AA=87=EA=B0=9C=EA=B0=80=20?= =?UTF-8?q?=EB=8B=B9=EC=B2=A8=EB=90=98=EC=97=88=EB=8A=94=EC=A7=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/main/kotlin/lotto/Calculator.kt | 17 ++++++----------- 1 file changed, 6 insertions(+), 11 deletions(-) diff --git a/src/main/kotlin/lotto/Calculator.kt b/src/main/kotlin/lotto/Calculator.kt index 5df48be87..0f253ef5d 100644 --- a/src/main/kotlin/lotto/Calculator.kt +++ b/src/main/kotlin/lotto/Calculator.kt @@ -2,9 +2,7 @@ package lotto import lotto.LottoSeller.Companion.LOTTO_TICKET_PRICE -class Calculator( - -) { +class Calculator { //비교하는 곳 , 나 이거 비교해줘! 라는 곳에 대한 대답 //그러려면 사용자가 입력한 값과 로또 리스트를 비교하는자가 가지고 있어야겠지? @@ -26,27 +24,24 @@ class Calculator( lottoTicketCount = lottoMachine.size for (lotto in lottoMachine) { - val matchedNumbers = lotto.intersect(userLotto).size + val matchedNumbers = lotto.intersect(userLotto.toSet()).size val isBonusMatched = userLotto.contains(bonusNum) //보너스 볼이 포함 되어 있는지 확인 -// println("matchedNumbers $matchedNumbers") val lottoRank = MatchedCount.fromMatchedNumbers(matchedNumbers, isBonusMatched) - if (lottoRank != MatchedCount.NONE) lottoResult[lottoRank] = lottoResult.getOrDefault(lottoRank, 0) + 1 + if (lottoRank != MatchedCount.NONE) { + lottoResult[lottoRank] = lottoResult.getOrDefault(lottoRank, 0) + 1 + } } } fun calculateProfitRate(): Float { calculateProfit() val moneySpent = lottoTicketCount * LOTTO_TICKET_PRICE -// println("수익률 계산하는 곳 $moneySpent") -// println("수익률 $profitability") return (profitability * 100f) / moneySpent } private fun calculateProfit() { lottoResult.forEach { (rank, count) -> -// println("lottoResult $lottoResult") profitability += rank.prize * count } } - -} \ No newline at end of file +} From 5aed29fb820e067530fdde8bf9234cc0c7a0fa2b Mon Sep 17 00:00:00 2001 From: yoon Date: Wed, 8 Nov 2023 21:54:10 +0900 Subject: [PATCH 34/44] =?UTF-8?q?[Refactor]=20=EC=83=9D=EC=84=B1=EC=9E=90?= =?UTF-8?q?=20=EC=9D=B8=EC=9E=90=EB=A1=9C=20=EB=B0=9B=EA=B8=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/main/kotlin/lotto/LottoGameView.kt | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/main/kotlin/lotto/LottoGameView.kt b/src/main/kotlin/lotto/LottoGameView.kt index 2ed72eb5e..10f92d34d 100644 --- a/src/main/kotlin/lotto/LottoGameView.kt +++ b/src/main/kotlin/lotto/LottoGameView.kt @@ -14,10 +14,10 @@ class LottoGameView { println(INPUT_BONUS) } - fun printMatchedNumbersCount() { + fun printMatchedNumbersCount(lottoResult: Calculator) { println(SHOW_MATCH_PROFIT) println(SHOW_PROFIT_LINE) - Calculator().lottoResult.forEach { (rank, count) -> + lottoResult.lottoResult.forEach { (rank, count) -> val prize = rank.prize println("${rank.statement} (${prize.toDecimalFormat()}$MONEY_WON) - ${count}$COUNT") } From f6ddf846dbac8f33c26c1de4e48e7690f47f7079 Mon Sep 17 00:00:00 2001 From: yoon Date: Wed, 8 Nov 2023 21:54:31 +0900 Subject: [PATCH 35/44] =?UTF-8?q?[Refactor]=20=EB=AC=B8=EA=B5=AC=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/main/kotlin/lotto/MatchedCount.kt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/main/kotlin/lotto/MatchedCount.kt b/src/main/kotlin/lotto/MatchedCount.kt index bfddadea0..8b32f5982 100644 --- a/src/main/kotlin/lotto/MatchedCount.kt +++ b/src/main/kotlin/lotto/MatchedCount.kt @@ -7,7 +7,7 @@ enum class MatchedCount(val title: String, val prize: Long, val statement: Strin SECOND("2등", 30_000_000, "5개 일치, 보너스 볼 일치"), FIRST("1등", 2_000_000_000, "6개 일치"), - NONE("낙첨", 0, "2개 이하 일치"); + NONE("꽝", 0, "2개 이하 일치"); companion object { fun fromMatchedNumbers(matchedNumbers: Int, isBonusNumberMatched: Boolean): MatchedCount { From f43cb362640b5424f5afd1a54de9765797fc0f8a Mon Sep 17 00:00:00 2001 From: yoon Date: Wed, 8 Nov 2023 21:54:43 +0900 Subject: [PATCH 36/44] =?UTF-8?q?[Refactor]=20=ED=8C=8C=EB=9D=BC=EB=AF=B8?= =?UTF-8?q?=ED=84=B0=20=EC=88=98=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/main/kotlin/lotto/LottoStore.kt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/main/kotlin/lotto/LottoStore.kt b/src/main/kotlin/lotto/LottoStore.kt index 3a9a93f9c..f22a6aac1 100644 --- a/src/main/kotlin/lotto/LottoStore.kt +++ b/src/main/kotlin/lotto/LottoStore.kt @@ -35,7 +35,7 @@ class LottoStore { private fun resultLotto(lottoNumbers: List, isBonusValid: Int) { val lottoResult = Calculator() lottoResult.compareNum(lottoNumbers, isBonusValid, randomLottos) - LottoGameView().printMatchedNumbersCount() + LottoGameView().printMatchedNumbersCount(lottoResult) LottoGameView().printProfitRate(lottoResult.calculateProfitRate()) } } From 930f327ebba26b57dfc8acd882d27cd02a2d0ce9 Mon Sep 17 00:00:00 2001 From: yoon Date: Wed, 8 Nov 2023 21:55:06 +0900 Subject: [PATCH 37/44] =?UTF-8?q?[docs]=20=EB=8B=B9=EC=B2=A8=20=ED=9A=9F?= =?UTF-8?q?=EC=88=98=20=ED=99=95=EC=9D=B8=20check?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- docs/README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/README.md b/docs/README.md index 59ff18df9..17bb6f7e5 100644 --- a/docs/README.md +++ b/docs/README.md @@ -100,7 +100,7 @@ ## WinningNumberChecker -- [ ] 몇개가 당첨 되었는지 알 수 있다. +- [x] 몇개가 당첨 되었는지 알 수 있다. ## **YieldCalculator** From c6b6e3d0b520d7a8b1c099106d40ec8e8043fb15 Mon Sep 17 00:00:00 2001 From: yoon Date: Wed, 8 Nov 2023 22:30:56 +0900 Subject: [PATCH 38/44] =?UTF-8?q?[Test]=20=EC=A0=9C=EB=8C=80=EB=A1=9C=20?= =?UTF-8?q?=EB=90=9C=20=EB=8F=88=EC=9D=84=20=EC=9E=85=EB=A0=A5=ED=95=98?= =?UTF-8?q?=EC=98=80=EB=8A=94=EC=A7=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/test/kotlin/lotto/LottoSellerTest.kt | 25 ++++++++++++++++++++++++ 1 file changed, 25 insertions(+) create mode 100644 src/test/kotlin/lotto/LottoSellerTest.kt diff --git a/src/test/kotlin/lotto/LottoSellerTest.kt b/src/test/kotlin/lotto/LottoSellerTest.kt new file mode 100644 index 000000000..be19716ee --- /dev/null +++ b/src/test/kotlin/lotto/LottoSellerTest.kt @@ -0,0 +1,25 @@ +package lotto + +import org.junit.jupiter.api.Test +import org.junit.jupiter.api.assertThrows + +class LottoSellerTest { + + @Test + fun `돈이 아닌 값을 입력했을 때 예외 발생`() { + val money = "돈이 아닌 값" + val lottoSeller = LottoSeller() + assertThrows { + lottoSeller.checkLottoTicketCount(money) + } + } + @Test + fun `1000원 단위의 돈을 입력했는지`() { + val money = "12" + val lottoSeller = LottoSeller() + assertThrows { + lottoSeller.checkLottoTicketCount(money) + } + } +} + From 109b613028fd58d2a80c29adbc02d5e46da24c17 Mon Sep 17 00:00:00 2001 From: yoon Date: Wed, 8 Nov 2023 22:31:13 +0900 Subject: [PATCH 39/44] =?UTF-8?q?[Test]=20=EB=93=B1=EC=88=98=EA=B0=80=20?= =?UTF-8?q?=EC=A0=9C=EB=8C=80=EB=A1=9C=20=EC=B6=9C=EB=A0=A5=EC=9D=B4=20?= =?UTF-8?q?=EB=90=98=EB=8A=94=EC=A7=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/test/kotlin/lotto/CalculatorTest.kt | 28 +++++++++++++++++++++++++ 1 file changed, 28 insertions(+) create mode 100644 src/test/kotlin/lotto/CalculatorTest.kt diff --git a/src/test/kotlin/lotto/CalculatorTest.kt b/src/test/kotlin/lotto/CalculatorTest.kt new file mode 100644 index 000000000..b76d8ef3f --- /dev/null +++ b/src/test/kotlin/lotto/CalculatorTest.kt @@ -0,0 +1,28 @@ +package lotto + +import org.assertj.core.api.Assertions.assertThat +import org.junit.jupiter.api.Test + +class CalculatorTest { + private val winningLottoNum = listOf( + listOf(1, 2, 3, 16, 32, 38), + listOf(11, 24, 33, 43, 32, 38), listOf(13, 14, 16, 38, 42, 45) + ) + + @Test + fun `3개가 동일 할때 5등이다`() { + val lottoUser = listOf(1, 2, 3, 4, 5, 6) + val bonus = 7 + val calculator = Calculator() + calculator.compareNum(lottoUser, bonus, winningLottoNum) + val compareResult = calculator.lottoResult + val lottoResult = mapOf( + MatchedCount.FIFTH to 1, + MatchedCount.FOURTH to 0, + MatchedCount.THIRD to 0, + MatchedCount.SECOND to 0, + MatchedCount.FIRST to 0, + ) + assertThat(compareResult).isEqualTo(lottoResult) + } +} \ No newline at end of file From d3b76666260bd31e8778488f09d030b7b21418ed Mon Sep 17 00:00:00 2001 From: yoon Date: Wed, 8 Nov 2023 22:32:06 +0900 Subject: [PATCH 40/44] =?UTF-8?q?[Refactor]=20=EC=95=88=EC=93=B0=EB=8A=94?= =?UTF-8?q?=20=EB=B3=80=EC=88=98=20=EC=82=AD=EC=A0=9C?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/main/kotlin/lotto/Calculator.kt | 2 +- src/main/kotlin/lotto/User.kt | 1 - 2 files changed, 1 insertion(+), 2 deletions(-) diff --git a/src/main/kotlin/lotto/Calculator.kt b/src/main/kotlin/lotto/Calculator.kt index 0f253ef5d..157742eed 100644 --- a/src/main/kotlin/lotto/Calculator.kt +++ b/src/main/kotlin/lotto/Calculator.kt @@ -18,7 +18,7 @@ class Calculator { fun compareNum( userLotto: List, bonusNum: Int, - lottoMachine: MutableList> + lottoMachine: List> ) { //로또속 번호와 사용자가 입력한 번호를 비교해서 몇개가 당첨인지를 알수 있다. lottoTicketCount = lottoMachine.size diff --git a/src/main/kotlin/lotto/User.kt b/src/main/kotlin/lotto/User.kt index 5dc417043..58ef24db6 100644 --- a/src/main/kotlin/lotto/User.kt +++ b/src/main/kotlin/lotto/User.kt @@ -5,7 +5,6 @@ import camp.nextstep.edu.missionutils.Console private const val COMMA = "," class User { - private val _purchasedLotto = mutableListOf() fun inputBonusNum(): Int { return Console.readLine().toInt() From a5e9ae4b01c169aa4a147a2a61639fc716138512 Mon Sep 17 00:00:00 2001 From: yoon Date: Wed, 8 Nov 2023 22:49:51 +0900 Subject: [PATCH 41/44] =?UTF-8?q?[Refactor]=20=EB=B3=B4=EB=84=88=EC=8A=A4?= =?UTF-8?q?=20=EB=B2=88=ED=98=B8=20=EC=9E=85=EB=A0=A5=20=EC=88=98=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/main/kotlin/lotto/LottoSeller.kt | 12 ++++-------- src/main/kotlin/lotto/LottoStore.kt | 10 ++++++++-- 2 files changed, 12 insertions(+), 10 deletions(-) diff --git a/src/main/kotlin/lotto/LottoSeller.kt b/src/main/kotlin/lotto/LottoSeller.kt index dc90edb28..89f11d8b6 100644 --- a/src/main/kotlin/lotto/LottoSeller.kt +++ b/src/main/kotlin/lotto/LottoSeller.kt @@ -52,13 +52,9 @@ class LottoSeller() { //미쳐버려 이거 잘못된 보너스 번호잖아! //당첨번호랑 안겹치는 걸로 다시 적어서 내렴 fun checkLottoHasBonusNum(lottoList: List, bonusNum: Int): Int { - return try { - checkContainNum(lottoList, bonusNum) - checkBonuslength(bonusNum) - } catch (e: IllegalArgumentException) { - println(e.message) - LottoSeller().checkLottoHasBonusNum(lottoList, User().inputBonusNum()) - } +우 checkContainNum(lottoList, bonusNum) + checkBonusLength(bonusNum) + return bonusNum } private fun checkContainNum(lottoList: List, bonusNum: Int): Int { @@ -66,7 +62,7 @@ class LottoSeller() { return bonusNum } - private fun checkBonuslength(bonusNum: Int): Int { + private fun checkBonusLength(bonusNum: Int): Int { if (bonusNum !in 1..45) throw IllegalArgumentException(ERROR_INPUT_NUMBER_RANGE) return bonusNum } diff --git a/src/main/kotlin/lotto/LottoStore.kt b/src/main/kotlin/lotto/LottoStore.kt index f22a6aac1..492902680 100644 --- a/src/main/kotlin/lotto/LottoStore.kt +++ b/src/main/kotlin/lotto/LottoStore.kt @@ -10,8 +10,14 @@ class LottoStore { lottoGameView.inputUserLottoNumber() val lottoNumbers = LottoSeller().isValidateLotto() lottoGameView.inputBonusNumber() - val isBonusValid = LottoSeller().checkLottoHasBonusNum(lottoNumbers, User().inputBonusNum()) - resultLotto(lottoNumbers, isBonusValid) + val lottoSeller = LottoSeller() + val bonusNum: Int = try { + lottoSeller.checkLottoHasBonusNum(lottoNumbers, User().inputBonusNum()) + } catch (e: IllegalArgumentException) { + println(e.message) + lottoSeller.checkLottoHasBonusNum(lottoNumbers, User().inputBonusNum()) + } + resultLotto(lottoNumbers, bonusNum) } private fun userInput(money: String): Int { From 0bc53ec2b9339b68e2f9a049b3f80feba3df685b Mon Sep 17 00:00:00 2001 From: yoon Date: Wed, 8 Nov 2023 22:50:08 +0900 Subject: [PATCH 42/44] =?UTF-8?q?[Test]=20=EB=B3=B4=EB=84=88=EC=8A=A4=20?= =?UTF-8?q?=EB=B2=88=ED=98=B8=EA=B0=80=20=EB=B2=94=EC=9C=84=20=EB=B0=96?= =?UTF-8?q?=EC=9D=BC=20=EB=95=8C?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/test/kotlin/lotto/LottoSellerTest.kt | 11 +++++++++++ 1 file changed, 11 insertions(+) diff --git a/src/test/kotlin/lotto/LottoSellerTest.kt b/src/test/kotlin/lotto/LottoSellerTest.kt index be19716ee..636b25dda 100644 --- a/src/test/kotlin/lotto/LottoSellerTest.kt +++ b/src/test/kotlin/lotto/LottoSellerTest.kt @@ -13,6 +13,7 @@ class LottoSellerTest { lottoSeller.checkLottoTicketCount(money) } } + @Test fun `1000원 단위의 돈을 입력했는지`() { val money = "12" @@ -21,5 +22,15 @@ class LottoSellerTest { lottoSeller.checkLottoTicketCount(money) } } + + @Test + fun `보너스 범위가 잘못 되었을 때`() { + val lottoUser = listOf(1, 2, 3, 4, 5, 6) + val money = 78 + val lottoSeller = LottoSeller() + assertThrows { + lottoSeller.checkLottoHasBonusNum(lottoUser, money) + } + } } From 38dc93ac36a254170fdc0cfa5965bf834c8dc02a Mon Sep 17 00:00:00 2001 From: yoon Date: Wed, 8 Nov 2023 22:54:48 +0900 Subject: [PATCH 43/44] =?UTF-8?q?[Test]=20=EB=B3=B4=EB=84=88=EC=8A=A4?= =?UTF-8?q?=EA=B0=80=20=EB=B0=9B=EC=9D=80=20=EA=B0=92=EA=B3=BC=20=EC=A4=91?= =?UTF-8?q?=EB=B3=B5=EC=9D=BC=20=EB=95=8C?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/main/kotlin/lotto/LottoSeller.kt | 2 +- src/test/kotlin/lotto/LottoSellerTest.kt | 10 ++++++++++ 2 files changed, 11 insertions(+), 1 deletion(-) diff --git a/src/main/kotlin/lotto/LottoSeller.kt b/src/main/kotlin/lotto/LottoSeller.kt index 89f11d8b6..22258e6a0 100644 --- a/src/main/kotlin/lotto/LottoSeller.kt +++ b/src/main/kotlin/lotto/LottoSeller.kt @@ -52,7 +52,7 @@ class LottoSeller() { //미쳐버려 이거 잘못된 보너스 번호잖아! //당첨번호랑 안겹치는 걸로 다시 적어서 내렴 fun checkLottoHasBonusNum(lottoList: List, bonusNum: Int): Int { -우 checkContainNum(lottoList, bonusNum) + checkContainNum(lottoList, bonusNum) checkBonusLength(bonusNum) return bonusNum } diff --git a/src/test/kotlin/lotto/LottoSellerTest.kt b/src/test/kotlin/lotto/LottoSellerTest.kt index 636b25dda..8f848129b 100644 --- a/src/test/kotlin/lotto/LottoSellerTest.kt +++ b/src/test/kotlin/lotto/LottoSellerTest.kt @@ -32,5 +32,15 @@ class LottoSellerTest { lottoSeller.checkLottoHasBonusNum(lottoUser, money) } } + + @Test + fun `보너스가 입력받은 값과 중복일 때`() { + val lottoUser = listOf(1, 2, 3, 4, 5, 6) + val money = 6 + val lottoSeller = LottoSeller() + assertThrows { + lottoSeller.checkLottoHasBonusNum(lottoUser, money) + } + } } From f65db789945d3499cdf6ac295c77207c2023fbd8 Mon Sep 17 00:00:00 2001 From: yoon Date: Wed, 8 Nov 2023 22:58:35 +0900 Subject: [PATCH 44/44] =?UTF-8?q?[style]=20=EB=82=98=EB=A7=8C=20=EB=B3=B4?= =?UTF-8?q?=EA=B8=B0=20=EC=9C=84=ED=95=9C=20=EC=A3=BC=EC=84=9D=20=EC=82=AD?= =?UTF-8?q?=EC=A0=9C?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/main/kotlin/lotto/Calculator.kt | 4 ---- src/main/kotlin/lotto/Lotto.kt | 1 - src/main/kotlin/lotto/LottoNumberGenerator.kt | 5 ----- src/main/kotlin/lotto/LottoSeller.kt | 12 +----------- 4 files changed, 1 insertion(+), 21 deletions(-) diff --git a/src/main/kotlin/lotto/Calculator.kt b/src/main/kotlin/lotto/Calculator.kt index 157742eed..8a07c01b8 100644 --- a/src/main/kotlin/lotto/Calculator.kt +++ b/src/main/kotlin/lotto/Calculator.kt @@ -3,9 +3,6 @@ package lotto import lotto.LottoSeller.Companion.LOTTO_TICKET_PRICE class Calculator { -//비교하는 곳 , 나 이거 비교해줘! 라는 곳에 대한 대답 -//그러려면 사용자가 입력한 값과 로또 리스트를 비교하는자가 가지고 있어야겠지? - val lottoResult = mutableMapOf( MatchedCount.FIFTH to 0, MatchedCount.FOURTH to 0, @@ -20,7 +17,6 @@ class Calculator { bonusNum: Int, lottoMachine: List> ) { - //로또속 번호와 사용자가 입력한 번호를 비교해서 몇개가 당첨인지를 알수 있다. lottoTicketCount = lottoMachine.size for (lotto in lottoMachine) { diff --git a/src/main/kotlin/lotto/Lotto.kt b/src/main/kotlin/lotto/Lotto.kt index 081049662..563b763b8 100644 --- a/src/main/kotlin/lotto/Lotto.kt +++ b/src/main/kotlin/lotto/Lotto.kt @@ -7,7 +7,6 @@ class Lotto(private val numbers: List) { } fun checkLottoNumberException(): List { -//중복숫자 체크 및 6자리 확인 if (numbers.size != 6) throw IllegalArgumentException(ERROR_INPUT_NUMBER_LENGTH) if (numbers.distinct().size != 6) throw IllegalArgumentException(ERROR_INPUT_NUMBER_DISTINCT) isAllNumbersInRange(numbers) diff --git a/src/main/kotlin/lotto/LottoNumberGenerator.kt b/src/main/kotlin/lotto/LottoNumberGenerator.kt index 15f69eab7..18680d4ba 100644 --- a/src/main/kotlin/lotto/LottoNumberGenerator.kt +++ b/src/main/kotlin/lotto/LottoNumberGenerator.kt @@ -3,23 +3,18 @@ package lotto import camp.nextstep.edu.missionutils.Randoms class LottoNumberGenerator : NumberGenerator { - //랜덤로또생성 후 제대로 된 로또 한장을 만들어 내는 override fun generate(): List { - //제대로 된 로또 내놔!에 대한 응답임 val randomLottoNumber = Randoms.pickUniqueNumbersInRange(MIN_NUMBER, MAX_NUMBER, PICK_NUMBER) - //제대로된 로또 주려면 중복체크 해야되고 정렬해서 줘야 되자넝! return checkRandomLottoNumber(randomLottoNumber) } private fun checkRandomLottoNumber(randomNum: List): List { -//나 중복체크 할 수 있어!! if (randomNum.distinct().size > 6) generate() return isSortedLottoNumber(randomNum) } private fun isSortedLottoNumber(randomNum: List): List { - //중복체크는 되어 있는거니까 정렬해서 보내주자! return randomNum.sorted() } diff --git a/src/main/kotlin/lotto/LottoSeller.kt b/src/main/kotlin/lotto/LottoSeller.kt index 22258e6a0..8b31157cc 100644 --- a/src/main/kotlin/lotto/LottoSeller.kt +++ b/src/main/kotlin/lotto/LottoSeller.kt @@ -2,11 +2,7 @@ package lotto class LottoSeller() { - //랜덤수에 맞게 로또를 판매하는 곳, 돈을 받은 만큼 줬지? - //what/who 계속 생각하기! - //어떤 행위가 필요한가! 이 행위를 수행할 객체는 어디인가! fun generateLottoNumbers(lottoMoney: Int): List { - //고객이 요구한 만큼 받아서 한번에 주는 거 val result = mutableListOf() repeat(lottoMoney) { result.add(LottoNumberGenerator()) @@ -14,8 +10,6 @@ class LottoSeller() { return result } - //야 이거 잘못된 당첨번호 로또잖아! - //다시 적어서 내렴 fun isValidateLotto(): List { return try { Lotto(User().inputLottoNumber()).checkLottoNumberException() @@ -33,8 +27,7 @@ class LottoSeller() { } } - fun checkLottoTicketCount(lottoMoney: String): Int { //x원 받았는데 로또 몇장이냐?에 대한 대답 - //가격을 파는 사람이 알지 사는 사람이 우째 안대유 + fun checkLottoTicketCount(lottoMoney: String): Int { lottoMoney.forEach { char -> val charConvertedToCode = char.code if ((charConvertedToCode > 57) or (charConvertedToCode < 48)) { @@ -48,9 +41,6 @@ class LottoSeller() { return lottoMoney.toInt() / LOTTO_TICKET_PRICE } - - //미쳐버려 이거 잘못된 보너스 번호잖아! - //당첨번호랑 안겹치는 걸로 다시 적어서 내렴 fun checkLottoHasBonusNum(lottoList: List, bonusNum: Int): Int { checkContainNum(lottoList, bonusNum) checkBonusLength(bonusNum)