From b73ca1c126bda14ee73398406ab59cbdf57ce3cb Mon Sep 17 00:00:00 2001 From: gyuoo Date: Mon, 4 Nov 2024 21:05:20 +0900 Subject: [PATCH 01/79] docs(readme): update README.md --- README.md | 166 +++++++++++++++++++++++++++++++++++++++++++++++++++++- 1 file changed, 165 insertions(+), 1 deletion(-) diff --git a/README.md b/README.md index 5fa2560b46..ab69e5d8db 100644 --- a/README.md +++ b/README.md @@ -1 +1,165 @@ -# java-lotto-precourse +# πŸ’Έ 둜또 + +- - - + +## πŸš€ κΈ°λŠ₯ μš”κ΅¬ 사항 + +- - - + +### <κ°„λ‹¨ν•œ 둜또 발맀기 κ΅¬ν˜„> + +- 둜또 번호의 숫자 λ²”μœ„λŠ” 1~45 +- 둜또 κ΅¬μž… κΈˆμ•‘ μž…λ ₯ μ‹œ κ΅¬μž… κΈˆμ•‘μ— ν•΄λ‹Ήν•˜λŠ” 만큼 둜또 λ°œν–‰ + - 둜또 1μž₯의 가격은 1,000원 + - 1,000μ›μœΌλ‘œ λ‚˜λˆ„μ–΄ 떨어지지 μ•ŠλŠ” 경우 μ˜ˆμ™Έ 처리 + - 1μž₯의 둜또 λ°œν–‰ μ‹œ μ€‘λ³΅λ˜μ§€ μ•ŠλŠ” 6개의 숫자 μ„ μ • + - 둜또 λ²ˆν˜ΈλŠ” μ˜€λ¦„μ°¨μˆœμœΌλ‘œ μ •λ ¬ν•˜μ—¬ 좜λ ₯ +- 당첨 번호 좔첨 + - μ€‘λ³΅λ˜μ§€ μ•ŠλŠ” 6개의 μˆ«μžμ™€ λ³΄λ„ˆμŠ€ 번호 1개 μ„ μ • +- λ‹Ήμ²¨μ—λŠ” 1~5λ“± 쑴재 + - 당첨 κΈ°μ€€κ³Ό κΈˆμ•‘ + - 1λ“±: 6개 번호 일치 / 2,000,000,000원 + - 2λ“±: 5개 번호 + λ³΄λ„ˆμŠ€ 번호 일치 / 30,000,000원 + - 3λ“±: 5개 번호 일치 / 1,500,000원 + - 4λ“±: 4개 번호 일치 / 50,000원 + - 5λ“±: 3개 번호 일치 / 5,000원 +- 당첨 λ²ˆν˜Έμ™€ λ³΄λ„ˆμŠ€ 번호λ₯Ό μž…λ ₯λ°›μŒ +- μ‚¬μš©μžκ°€ κ΅¬λ§€ν•œ 둜또 λ²ˆν˜Έμ™€ 당첨 번호 비ꡐ + - 당첨 λ‚΄μ—­ 및 수읡λ₯ μ„ 좜λ ₯ν•œ λ’€ 둜또 κ²Œμž„ μ’…λ£Œ + - 수읡λ₯ μ€ μ†Œμˆ˜μ  λ‘˜μ§Έ μžλ¦¬μ—μ„œ 반올림 +- μ‚¬μš©μžκ°€ 잘λͺ»λœ 값을 μž…λ ₯ν•  경우 `IllegalArgumentException` λ°œμƒ + - `[ERROR]`둜 μ‹œμž‘ν•˜λŠ” μ—λŸ¬ λ©”μ‹œμ§€ 좜λ ₯ + - κ·Έ λΆ€λΆ„λΆ€ν„° μž…λ ₯을 λ‹€μ‹œ λ°›μŒ + - `Exception`이 μ•„λ‹Œ `IllegalArgumentException`, `IllegalStateException` λ“±κ³Ό 같은 λͺ…ν™•ν•œ 처리 +- `camp.nextstep.edu.missionutils`μ—μ„œ μ œκ³΅ν•˜λŠ” `Randoms`, `Console API` μ‚¬μš© +- Random κ°’ μΆ”μΆœμ€ `camp.nextstep.edu.missionutils.Randoms`의 `pickUniqueNumbersInRange()` ν™œμš© +- μ‚¬μš©μž μž…λ ₯ 값은 `camp.nextstep.edu.missionutils.Console`의 `readLine()`을 ν™œμš© + +## πŸ“ƒ μΆ”κ°€λœ ν”„λ‘œκ·Έλž˜λ° μš”κ΅¬ 사항 + +- - - + +- λ©”μ„œλ“œμ˜ 길이가 15라인을 λ„˜μ–΄κ°€μ§€ μ•Šλ„λ‘ κ΅¬ν˜„ +- λ©”μ„œλ“œκ°€ ν•œ 가지 일만 잘 ν•˜λ„λ‘ κ΅¬ν˜„ +- `else`, `switch`/`case` κΈˆμ§€ + - `if` μ‘°κ±΄μ ˆμ—μ„œ 값을 `return`ν•˜λŠ” λ°©μ‹μœΌλ‘œ κ΅¬ν˜„ν•˜λ©΄ 됨 +- Java Enum 적용 +- κ΅¬ν˜„ν•œ κΈ°λŠ₯에 λŒ€ν•œ λ‹¨μœ„ ν…ŒμŠ€νŠΈ μž‘μ„± + - 단, UI(`System.out`, `System.in`, `Scanner`) 둜직 μ œμ™Έ + - λ‹¨μœ„ ν…ŒμŠ€νŠΈ μž‘μ„±μ΄ μ΅μˆ™ν•˜μ§€ μ•Šλ‹€λ©΄ `LottoTest` μ°Έκ³  + +## πŸ“‚ νŒ¨ν‚€μ§€ ꡬ쑰 + +- - - + +## πŸ“Œ κ³„νš + +- - - + +- 둜또의 흐름 νŒŒμ•… +- μ–΄μšΈλ¦¬λŠ” λ””μžμΈ νŒ¨ν„΄ μ„ μ • +- νŒ¨ν‚€μ§€ ꡬ쑰 섀계 +- κ΅¬ν˜„ν•  κΈ°λŠ₯ λͺ©λ‘ 정리 +- README.md μž‘μ„± +- ν”„λ‘œμ νŠΈ 초기 μ„€μ • +- κ΅¬ν˜„ +- μ˜ˆμ™Έ μ²˜λ¦¬μ— λŒ€ν•œ κ²€ν†  +- ν…ŒμŠ€νŠΈ μ½”λ“œ μž‘μ„± +- λ¦¬νŒ©ν† λ§ + +## πŸ’‘ κ΅¬ν˜„ν•  κΈ°λŠ₯ λͺ©λ‘ + +- - - + +### 1. μž…λ ₯ + +- [ ] 둜또 κ΅¬μž… κΈˆμ•‘ μž…λ ₯ λ°›κΈ° + - [ ] 1,000원 λ‹¨μœ„λ‘œ μž…λ ₯ λ°›μ•„μ•Ό 함 + - [ ] 1,000으둜 λ‚˜λˆ„μ–΄ 떨어지지 μ•ŠλŠ” 경우 μ˜ˆμ™Έ λ°œμƒ + - [ ] μ–‘μ˜ μ •μˆ˜κ°€ μ•„λ‹Œ 경우 μ˜ˆμ™Έ λ°œμƒ + - [ ] 1회 μ΅œλŒ€ ꡬ맀 κ°€λŠ₯ κΈˆμ•‘μ„ μ΄ˆκ³Όν•  μ‹œ μ˜ˆμ™Έ λ°œμƒ +- [ ] 당첨 번호 μž…λ ₯ + - [ ] μ‰Όν‘œλ‘œ ꡬ뢄 + - [ ] μ˜¬λ°”λ₯΄κ²Œ ꡬ뢄할 수 없을 μ‹œ μ˜ˆμ™Έ λ°œμƒ + - [ ] 6개 μž…λ ₯ λ°›μŒ + - [ ] 6개 초과 μ‹œ μ˜ˆμ™Έ λ°œμƒ + - [ ] 1~45 λ²”μœ„μ˜ μ •μˆ˜λ§Œ μžˆλŠ”μ§€ 검증 + - [ ] λ²”μœ„ μ™Έμ˜ 수 μž…λ ₯ μ‹œ μ˜ˆμ™Έ λ°œμƒ + - [ ] 쀑볡 없이 μž…λ ₯λ˜μ—ˆλŠ”μ§€ 검증 + - [ ] μ€‘λ³΅λ˜μ—ˆμ„ μ‹œ μ˜ˆμ™Έ λ°œμƒ +- [ ] λ³΄λ„ˆμŠ€ 번호 μž…λ ₯ + - [ ] 1개 μž…λ ₯ λ°›μŒ + - [ ] 1~45 λ²”μœ„μ˜ μ •μˆ˜μΈμ§€ 검증 + - [ ] λ²”μœ„ μ™Έμ˜ 수 μž…λ ₯ μ‹œ μ˜ˆμ™Έ λ°œμƒ + +### 2. 둜또 λ°œν–‰ + +- [ ] λ°œν–‰ν•  둜또 μˆ˜λŸ‰ 계산 +- [ ] 둜또 번호 μ„ μ • + - [ ] 1~45 λ²”μœ„μ˜ μ •μˆ˜ 쀑 쀑볡 없이 λ¬΄μž‘μœ„ 6개의 숫자 + - [ ] 각 λ‘œλ˜λ§ˆλ‹€ μ˜€λ¦„μ°¨μˆœμœΌλ‘œ 번호 μ •λ ¬ +- [ ] 둜또 리슀트 생성 + - [ ] κ΅¬μž… κΈˆμ•‘μ— 따라 κ³„μ‚°λœ 수만큼의 둜또 생성 + - [ ] λ¦¬μŠ€νŠΈμ— μ €μž₯ + - [ ] μƒμ„±λœ 둜또 리슀트λ₯Ό ν˜•μ‹μ— 맞게 좜λ ₯ + +### 3. 당첨 κ²°κ³Ό 계산 + +- [ ] 각 둜또의 λ²ˆν˜Έμ™€ 당첨 번호λ₯Ό 비ꡐ + - [ ] μΌμΉ˜ν•˜λŠ” 번호의 개수 계산 +- [ ] 당첨 λ“±μˆ˜ νŒλ‹¨ + - [ ] μΌμΉ˜ν•˜λŠ” 번호의 κ°œμˆ˜μ— 따라 λ“±μˆ˜ κ²°μ • +- [ ] 각 λ“±μˆ˜μ˜ 당첨 횟수 μΉ΄μš΄νŒ… +- [ ] 당첨 횟수 μ €μž₯ + +### 4. 수읡λ₯  계산 + +- [ ] 총 λ‹Ήμ²¨κΈˆ 계산 (각 λ“±μˆ˜λ³„ 당첨 횟수 * λ‹Ήμ²¨κΈˆ) +- [ ] 수읡λ₯  계산 (총 λ‹Ήμ²¨κΈˆ / 총 κ΅¬μž… κΈˆμ•‘) * 100 + - [ ] μ†Œμˆ˜μ  λ‘˜μ§Έ μžλ¦¬μ—μ„œ 반올림 + +### 5. κ²°κ³Ό 좜λ ₯ + +- [ ] 둜또 ꡬ맀 λ‚΄μ—­(μƒμ„±λœ 둜또 μˆ˜μ™€ 각 둜또의 번호λ₯Ό μ˜€λ¦„μ°¨μˆœ μ •λ ¬) 좜λ ₯ +- [ ] 당첨 톡계(λ“±μˆ˜λ³„ 당첨 νšŸμˆ˜μ™€ λ‹Ήμ²¨κΈˆ) 좜λ ₯ +- [ ] κ³„μ‚°λœ 수읡λ₯  좜λ ₯ + +### 6. λ‹¨μœ„ ν…ŒμŠ€νŠΈ μž‘μ„± + +- [ ] κ΅¬ν˜„ν•œ κΈ°λŠ₯에 λŒ€ν•œ λ‹¨μœ„ ν…ŒμŠ€νŠΈ μž‘μ„± + +### 7. μœ ν‹Έλ¦¬ν‹° + +- [ ] 숫자 검증 μœ ν‹Έλ¦¬ν‹° +- [ ] 숫자 랜덀 μΆ”μΆœ μœ ν‹Έλ¦¬ν‹° +- [ ] μ˜€λ¦„μ°¨μˆœ μ •λ ¬ μœ ν‹Έλ¦¬ν‹° + +### 8. ꡬ쑰 κ°œμ„  및 λ¦¬νŒ©ν† λ§ + +- [ ] λ©”μ„œλ“œ 뢄리 + - [ ] λ©”μ„œλ“œμ˜ 길이가 15라인을 λ„˜μ–΄κ°€μ§€ μ•Šλ„λ‘ κ΅¬ν˜„ + - [ ] λ©”μ„œλ“œκ°€ ν•œ 가지 일만 잘 ν•˜λ„λ‘ κ΅¬ν˜„ +- [ ] μ±…μž„ 뢄리: 각 ν΄λž˜μŠ€κ°€ 단일 μ±…μž„ 원칙을 λ”°λ₯΄λ„둝 ꡬ쑰 κ°œμ„  +- [ ] else, switch/caseλ¬Έ κΈˆμ§€ +- [ ] Enum의 적용 + +## πŸ€” μƒκ°μ˜ 흔적 + +- - - + +### 둜또의 흐름 + +1. 둜또 κ΅¬μž… κΈˆμ•‘ μž…λ ₯ λ°›μŒ +2. 당첨 번호 μž…λ ₯ λ°›μŒ +3. λ³΄λ„ˆμŠ€ 번호 μž…λ ₯ λ°›μŒ +4. λ°œν–‰ν•œ 둜또의 μˆ˜λŸ‰ 좜λ ₯ +5. λ°œν–‰ν•œ 둜또의 번호λ₯Ό μ˜€λ¦„μ°¨μˆœμœΌλ‘œ μ •λ ¬ν•˜μ—¬ 좜λ ₯ +6. 당첨 λ‚΄μ—­ 좜λ ₯ +7. 수읡λ₯  좜λ ₯ + +- μ˜ˆμ™Έ 상황 μ‹œ μ—λŸ¬ 문ꡬ 좜λ ₯ ν›„ λ‹€μ‹œ μž…λ ₯ λ°›μŒ + +### κ³ λ―Όν•œ λΆ€λΆ„ + +- 둜또 ꡬ맀 κ°€λŠ₯ κΈˆμ•‘μ„ intλ‚˜ long으둜 ν•  것인가, ν˜„μ‹€μ²˜λŸΌ 10만 μ›κΉŒμ§€ μ œν•œν•  것인가 +- μ„ μ •λœ 둜또 번호 좜λ ₯ μ‹œ λ„ˆλ¬΄ 길어지지 μ•Šλ„λ‘ ν•˜λ˜, 10만 원 λ³΄λ‹€λŠ” λ„‰λ„‰ν•˜κ²Œ μ œν•œ \ No newline at end of file From 0a4fcb22b20d56c828f88b81085fdc30d9fcd9a6 Mon Sep 17 00:00:00 2001 From: gyuoo Date: Mon, 4 Nov 2024 21:43:26 +0900 Subject: [PATCH 02/79] docs(readme): add package structure --- README.md | 39 +++++++++++++++++++++++++++++++++++++++ 1 file changed, 39 insertions(+) diff --git a/README.md b/README.md index ab69e5d8db..791a604b66 100644 --- a/README.md +++ b/README.md @@ -52,6 +52,45 @@ - - - +``` +🌐 src.main.java.lotto +β”‚ +β”œβ”€β”€ πŸ“¦ controller +β”‚ └── LottoController +β”‚ +β”œβ”€β”€ πŸ“¦ domain +β”‚ β”œβ”€β”€ Lotto +β”‚ β”œβ”€β”€ LottoGame +β”‚ β”œβ”€β”€ LottoResult +β”‚ β”œβ”€β”€ Prize +β”‚ └── WinningNumber +β”‚ +β”œβ”€β”€ πŸ“¦ exception +β”‚ β”œβ”€β”€ ErrorMessage +β”‚ └── LottoException +β”‚ +β”œβ”€β”€ πŸ“¦ factory +β”‚ └── LottoTicketStore +β”‚ +β”œβ”€β”€ πŸ“¦ service +β”‚ β”œβ”€β”€ LottoGameService +β”‚ β”œβ”€β”€ LottoPurchaseService +β”‚ β”œβ”€β”€ LottoResultCalculator +β”‚ └── LottoStatisticsService +β”‚ +β”œβ”€β”€ πŸ“¦ util +β”‚ β”œβ”€β”€ LottoNumberSorter +β”‚ β”œβ”€β”€ LottoNumberValidator +β”‚ └── RandomNumberGenerator +β”‚ +β”œβ”€β”€ πŸ“¦ view +β”‚ β”œβ”€β”€ ConsoleMessage +β”‚ β”œβ”€β”€ InputView +β”‚ └── OutputView +β”‚ +└── Application +``` + ## πŸ“Œ κ³„νš - - - From 771c0e912d193d7b7b37847efc883f77cbf6c0a3 Mon Sep 17 00:00:00 2001 From: gyuoo Date: Mon, 4 Nov 2024 21:44:42 +0900 Subject: [PATCH 03/79] refactor(domain): move Lotto class to domain package --- src/main/java/lotto/Lotto.java | 20 -------------------- src/main/java/lotto/domain/Lotto.java | 23 +++++++++++++++++++++++ 2 files changed, 23 insertions(+), 20 deletions(-) delete mode 100644 src/main/java/lotto/Lotto.java create mode 100644 src/main/java/lotto/domain/Lotto.java diff --git a/src/main/java/lotto/Lotto.java b/src/main/java/lotto/Lotto.java deleted file mode 100644 index 88fc5cf12b..0000000000 --- a/src/main/java/lotto/Lotto.java +++ /dev/null @@ -1,20 +0,0 @@ -package lotto; - -import java.util.List; - -public class Lotto { - private final List numbers; - - public Lotto(List numbers) { - validate(numbers); - this.numbers = numbers; - } - - private void validate(List numbers) { - if (numbers.size() != 6) { - throw new IllegalArgumentException("[ERROR] 둜또 λ²ˆν˜ΈλŠ” 6κ°œμ—¬μ•Ό ν•©λ‹ˆλ‹€."); - } - } - - // TODO: μΆ”κ°€ κΈ°λŠ₯ κ΅¬ν˜„ -} diff --git a/src/main/java/lotto/domain/Lotto.java b/src/main/java/lotto/domain/Lotto.java new file mode 100644 index 0000000000..e519c8f8c8 --- /dev/null +++ b/src/main/java/lotto/domain/Lotto.java @@ -0,0 +1,23 @@ +package lotto.domain; + +import java.util.List; + +public class Lotto { + private final List numbers; + + public Lotto(List numbers) { + validate(numbers); + this.numbers = numbers; + } + + private void validate(List numbers) { + if (numbers.size() != 6) { + throw new IllegalArgumentException("[ERROR] 둜또 λ²ˆν˜ΈλŠ” 6κ°œμ—¬μ•Ό ν•©λ‹ˆλ‹€."); + } + } + + @Override + public String toString() { + return numbers.toString(); + } +} From b1c3f61c065fe5f7ba06322648a3fcf2dfbb65a6 Mon Sep 17 00:00:00 2001 From: gyuoo Date: Mon, 4 Nov 2024 21:45:47 +0900 Subject: [PATCH 04/79] feat(exception): add ErrorMessage enum for error handling --- src/main/java/lotto/exception/ErrorMessage.java | 15 +++++++++++++++ 1 file changed, 15 insertions(+) create mode 100644 src/main/java/lotto/exception/ErrorMessage.java diff --git a/src/main/java/lotto/exception/ErrorMessage.java b/src/main/java/lotto/exception/ErrorMessage.java new file mode 100644 index 0000000000..491432945e --- /dev/null +++ b/src/main/java/lotto/exception/ErrorMessage.java @@ -0,0 +1,15 @@ +package lotto.exception; + +public enum ErrorMessage { + ; + + private final String message; + + ErrorMessage(String message) { + this.message = message; + } + + public String getErrorMessage() { + return message; + } +} \ No newline at end of file From 33c2af8357bc32a4014e7678c596344a3467976c Mon Sep 17 00:00:00 2001 From: gyuoo Date: Mon, 4 Nov 2024 21:46:36 +0900 Subject: [PATCH 05/79] feat(exception): add LottoException base class for custom exceptions --- .../java/lotto/exception/LottoException.java | 22 +++++++++++++++++++ 1 file changed, 22 insertions(+) create mode 100644 src/main/java/lotto/exception/LottoException.java diff --git a/src/main/java/lotto/exception/LottoException.java b/src/main/java/lotto/exception/LottoException.java new file mode 100644 index 0000000000..54404d8773 --- /dev/null +++ b/src/main/java/lotto/exception/LottoException.java @@ -0,0 +1,22 @@ +package lotto.exception; + +public abstract class LottoException extends RuntimeException { + + private final String ERROR_MESSAGE_PREFIX = "[ERROR]"; + private final String SPACE = " "; + private final ErrorMessage errorMessage; + + public LottoException(ErrorMessage errorMessage) { + super(errorMessage.getErrorMessage()); + this.errorMessage = errorMessage; + } + + public ErrorMessage getErrorMessage() { + return errorMessage; + } + + @Override + public String getMessage() { + return ERROR_MESSAGE_PREFIX + SPACE + super.getMessage(); + } +} \ No newline at end of file From edfa3fb743a3d7e495478e01a899a25b1670e6b1 Mon Sep 17 00:00:00 2001 From: gyuoo Date: Mon, 4 Nov 2024 21:47:47 +0900 Subject: [PATCH 06/79] feat(view): add ConsoleMessage enum for standardized console messages --- src/main/java/lotto/view/ConsoleMessage.java | 15 +++++++++++++++ 1 file changed, 15 insertions(+) create mode 100644 src/main/java/lotto/view/ConsoleMessage.java diff --git a/src/main/java/lotto/view/ConsoleMessage.java b/src/main/java/lotto/view/ConsoleMessage.java new file mode 100644 index 0000000000..7a05ec81af --- /dev/null +++ b/src/main/java/lotto/view/ConsoleMessage.java @@ -0,0 +1,15 @@ +package lotto.view; + +public enum ConsoleMessage { + ; + + private final String message; + + ConsoleMessage(String message) { + this.message = message; + } + + public String getMessage() { + return message; + } +} From 49d5ec8267efa6530e379d50624110da78ea0c38 Mon Sep 17 00:00:00 2001 From: gyuoo Date: Mon, 4 Nov 2024 21:48:58 +0900 Subject: [PATCH 07/79] refactor(exception): update method name for consistency --- src/main/java/lotto/exception/ErrorMessage.java | 2 +- src/main/java/lotto/exception/LottoException.java | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/src/main/java/lotto/exception/ErrorMessage.java b/src/main/java/lotto/exception/ErrorMessage.java index 491432945e..5e08f8698e 100644 --- a/src/main/java/lotto/exception/ErrorMessage.java +++ b/src/main/java/lotto/exception/ErrorMessage.java @@ -9,7 +9,7 @@ public enum ErrorMessage { this.message = message; } - public String getErrorMessage() { + public String getMessage() { return message; } } \ No newline at end of file diff --git a/src/main/java/lotto/exception/LottoException.java b/src/main/java/lotto/exception/LottoException.java index 54404d8773..a3eb6b92fd 100644 --- a/src/main/java/lotto/exception/LottoException.java +++ b/src/main/java/lotto/exception/LottoException.java @@ -7,7 +7,7 @@ public abstract class LottoException extends RuntimeException { private final ErrorMessage errorMessage; public LottoException(ErrorMessage errorMessage) { - super(errorMessage.getErrorMessage()); + super(errorMessage.getMessage()); this.errorMessage = errorMessage; } From c28342d25ec5400c74d432cfa2ddd57e5cde9ffc Mon Sep 17 00:00:00 2001 From: gyuoo Date: Mon, 4 Nov 2024 21:50:08 +0900 Subject: [PATCH 08/79] feat(domain): add Prize enum for lottery prize management --- src/main/java/lotto/domain/Prize.java | 24 ++++++++++++++++++++++++ 1 file changed, 24 insertions(+) create mode 100644 src/main/java/lotto/domain/Prize.java diff --git a/src/main/java/lotto/domain/Prize.java b/src/main/java/lotto/domain/Prize.java new file mode 100644 index 0000000000..6b91131c5d --- /dev/null +++ b/src/main/java/lotto/domain/Prize.java @@ -0,0 +1,24 @@ +package lotto.domain; + +public enum Prize { + FIRST(6, false, 2_000_000_000), + SECOND(5, true, 30_000_000), + THIRD(5, false, 1_500_000), + FOURTH(4, false, 50_000), + FIFTH(3, false, 5_000), + NONE(0, false, 0); + + private final int matchCount; + private final boolean matchBonus; + private final int prizeAmount; + + Prize(int matchCount, boolean matchBonus, int prizeAmount) { + this.matchCount = matchCount; + this.matchBonus = matchBonus; + this.prizeAmount = prizeAmount; + } + + public int getPrizeAmount() { + return prizeAmount; + } +} From 69a2fc0fc8f0329bcb319c8ef50e16b5450439ff Mon Sep 17 00:00:00 2001 From: gyuoo Date: Mon, 4 Nov 2024 21:52:52 +0900 Subject: [PATCH 09/79] feat(view): add InputView for handling user input --- src/main/java/lotto/view/InputView.java | 10 ++++++++++ 1 file changed, 10 insertions(+) create mode 100644 src/main/java/lotto/view/InputView.java diff --git a/src/main/java/lotto/view/InputView.java b/src/main/java/lotto/view/InputView.java new file mode 100644 index 0000000000..596f28eb3d --- /dev/null +++ b/src/main/java/lotto/view/InputView.java @@ -0,0 +1,10 @@ +package lotto.view; + +import camp.nextstep.edu.missionutils.Console; + +public class InputView { + + public String readLine() { + return Console.readLine(); + } +} From 28459e91c6b24976ce3827a4f08c620439ad2015 Mon Sep 17 00:00:00 2001 From: gyuoo Date: Mon, 4 Nov 2024 22:03:48 +0900 Subject: [PATCH 10/79] feat(constants): add LottoConstantNumbers enum for managing lotto related constants --- .../lotto/constants/LottoConstantNumbers.java | 19 +++++++++++++++++++ 1 file changed, 19 insertions(+) create mode 100644 src/main/java/lotto/constants/LottoConstantNumbers.java diff --git a/src/main/java/lotto/constants/LottoConstantNumbers.java b/src/main/java/lotto/constants/LottoConstantNumbers.java new file mode 100644 index 0000000000..7c380c25c0 --- /dev/null +++ b/src/main/java/lotto/constants/LottoConstantNumbers.java @@ -0,0 +1,19 @@ +package lotto.constants; + +public enum LottoConstantNumbers { + LOTTO_PRICE(1_000), + MAX_PURCHASE_AMOUNT(100_000), + LOTTO_NUMBERS_COUNT(6), + MIN_LOTTO_NUMBER(1), + MAX_LOTTO_NUMBER(45); + + private final int value; + + LottoConstantNumbers(int value) { + this.value = value; + } + + public int getValue() { + return value; + } +} \ No newline at end of file From 996b213d22f674674551b2326365e3561c316d64 Mon Sep 17 00:00:00 2001 From: gyuoo Date: Mon, 4 Nov 2024 22:04:52 +0900 Subject: [PATCH 11/79] feat(exception): add error messages for lotto purchase validation --- src/main/java/lotto/exception/ErrorMessage.java | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/src/main/java/lotto/exception/ErrorMessage.java b/src/main/java/lotto/exception/ErrorMessage.java index 5e08f8698e..e52b5cd333 100644 --- a/src/main/java/lotto/exception/ErrorMessage.java +++ b/src/main/java/lotto/exception/ErrorMessage.java @@ -1,6 +1,11 @@ package lotto.exception; +import lotto.constants.LottoConstantNumbers; + public enum ErrorMessage { + INVALID_PURCHASE_AMOUNT("κ΅¬μž… κΈˆμ•‘μ€ " + LottoConstantNumbers.LOTTO_PRICE + " λ‹¨μœ„μ˜ μ–‘μ˜ μ •μˆ˜λ₯Ό μž…λ ₯ν•΄μ•Ό ν•©λ‹ˆλ‹€."), + NOT_DIVISIBLE_BY_LOTTO_PRICE("κ΅¬μž… κΈˆμ•‘μ€ " + LottoConstantNumbers.LOTTO_PRICE + "원 λ‹¨μœ„μ—¬μ•Ό ν•©λ‹ˆλ‹€."), + MAX_PURCHASE_EXCEED("1회 μ΅œλŒ€ ꡬ맀 κ°€λŠ₯ κΈˆμ•‘μ€ " + LottoConstantNumbers.MAX_PURCHASE_AMOUNT + "μž…λ‹ˆλ‹€."), ; private final String message; From d3a07a3b2050c168c55cfa52d9e241a1c3d83eb6 Mon Sep 17 00:00:00 2001 From: gyuoo Date: Mon, 4 Nov 2024 22:21:12 +0900 Subject: [PATCH 12/79] feat(view): add ConsoleMessage enum for user prompts and outputs --- src/main/java/lotto/view/ConsoleMessage.java | 15 +++++++++++++-- 1 file changed, 13 insertions(+), 2 deletions(-) diff --git a/src/main/java/lotto/view/ConsoleMessage.java b/src/main/java/lotto/view/ConsoleMessage.java index 7a05ec81af..57c233e2f4 100644 --- a/src/main/java/lotto/view/ConsoleMessage.java +++ b/src/main/java/lotto/view/ConsoleMessage.java @@ -1,8 +1,19 @@ package lotto.view; public enum ConsoleMessage { - ; - + INPUT_PURCHASE_AMOUNT("κ΅¬μž…κΈˆμ•‘μ„ μž…λ ₯ν•΄ μ£Όμ„Έμš”."), + PURCHASE_COUNT_MESSAGE("%d개λ₯Ό κ΅¬λ§€ν–ˆμŠ΅λ‹ˆλ‹€."), + INPUT_WINNING_NUMBERS("당첨 번호λ₯Ό μž…λ ₯ν•΄ μ£Όμ„Έμš”."), + INPUT_BONUS_NUMBER("λ³΄λ„ˆμŠ€ 번호λ₯Ό μž…λ ₯ν•΄ μ£Όμ„Έμš”."), + WINNING_STATISTICS("당첨 톡계"), + DIVIDER("---"), + MATCH_3("3개 일치 (5,000원) - %d개"), + MATCH_4("4개 일치 (50,000원) - %d개"), + MATCH_5("5개 일치 (1,500,000원) - %d개"), + MATCH_5_BONUS("5개 일치, λ³΄λ„ˆμŠ€ λ³Ό 일치 (30,000,000원) - %d개"), + MATCH_6("6개 일치 (2,000,000,000원) - %d개"), + TOTAL_YIELD("총 수읡λ₯ μ€ %.2f%%μž…λ‹ˆλ‹€."); + private final String message; ConsoleMessage(String message) { From 06615de60e2556415044d8e1988137990e7415ed Mon Sep 17 00:00:00 2001 From: gyuoo Date: Mon, 4 Nov 2024 22:29:22 +0900 Subject: [PATCH 13/79] feat(view): add purchase amount message output --- src/main/java/lotto/view/OutputView.java | 8 ++++++++ 1 file changed, 8 insertions(+) create mode 100644 src/main/java/lotto/view/OutputView.java diff --git a/src/main/java/lotto/view/OutputView.java b/src/main/java/lotto/view/OutputView.java new file mode 100644 index 0000000000..b8e752f149 --- /dev/null +++ b/src/main/java/lotto/view/OutputView.java @@ -0,0 +1,8 @@ +package lotto.view; + +public class OutputView { + + public void printPurchaseAmountMessage() { + System.out.println(ConsoleMessage.INPUT_PURCHASE_AMOUNT.getMessage()); + } +} From 9fa4490e45e72f1c8f6034cfa3db67bd9705fd52 Mon Sep 17 00:00:00 2001 From: gyuoo Date: Mon, 4 Nov 2024 22:30:37 +0900 Subject: [PATCH 14/79] feat(view): add method to get purchase amount from user --- README.md | 2 +- src/main/java/lotto/view/InputView.java | 11 +++++++++++ 2 files changed, 12 insertions(+), 1 deletion(-) diff --git a/README.md b/README.md index 791a604b66..682d8ac302 100644 --- a/README.md +++ b/README.md @@ -112,7 +112,7 @@ ### 1. μž…λ ₯ -- [ ] 둜또 κ΅¬μž… κΈˆμ•‘ μž…λ ₯ λ°›κΈ° +- [x] 둜또 κ΅¬μž… κΈˆμ•‘ μž…λ ₯ λ°›κΈ° - [ ] 1,000원 λ‹¨μœ„λ‘œ μž…λ ₯ λ°›μ•„μ•Ό 함 - [ ] 1,000으둜 λ‚˜λˆ„μ–΄ 떨어지지 μ•ŠλŠ” 경우 μ˜ˆμ™Έ λ°œμƒ - [ ] μ–‘μ˜ μ •μˆ˜κ°€ μ•„λ‹Œ 경우 μ˜ˆμ™Έ λ°œμƒ diff --git a/src/main/java/lotto/view/InputView.java b/src/main/java/lotto/view/InputView.java index 596f28eb3d..554b4ac5da 100644 --- a/src/main/java/lotto/view/InputView.java +++ b/src/main/java/lotto/view/InputView.java @@ -4,7 +4,18 @@ public class InputView { + private final OutputView outputView; + + public InputView(OutputView outputView) { + this.outputView = outputView; + } + public String readLine() { return Console.readLine(); } + + public String getPurchaseAmount() { + outputView.printPurchaseAmountMessage(); + return readLine(); + } } From 6849849847064e7fcf9fcd3b09f0e86a6d72fbb4 Mon Sep 17 00:00:00 2001 From: gyuoo Date: Mon, 4 Nov 2024 22:36:06 +0900 Subject: [PATCH 15/79] refactor(exception): remove unnecessary codes --- .../java/lotto/exception/LottoException.java | 22 ------------------- 1 file changed, 22 deletions(-) delete mode 100644 src/main/java/lotto/exception/LottoException.java diff --git a/src/main/java/lotto/exception/LottoException.java b/src/main/java/lotto/exception/LottoException.java deleted file mode 100644 index a3eb6b92fd..0000000000 --- a/src/main/java/lotto/exception/LottoException.java +++ /dev/null @@ -1,22 +0,0 @@ -package lotto.exception; - -public abstract class LottoException extends RuntimeException { - - private final String ERROR_MESSAGE_PREFIX = "[ERROR]"; - private final String SPACE = " "; - private final ErrorMessage errorMessage; - - public LottoException(ErrorMessage errorMessage) { - super(errorMessage.getMessage()); - this.errorMessage = errorMessage; - } - - public ErrorMessage getErrorMessage() { - return errorMessage; - } - - @Override - public String getMessage() { - return ERROR_MESSAGE_PREFIX + SPACE + super.getMessage(); - } -} \ No newline at end of file From 90a90eec7ba300b7174922494883711e277772eb Mon Sep 17 00:00:00 2001 From: gyuoo Date: Mon, 4 Nov 2024 22:36:44 +0900 Subject: [PATCH 16/79] feat(constants): add ErrorConstants enum for error message management --- .../java/lotto/exception/ErrorConstants.java | 16 ++++++++++++++++ 1 file changed, 16 insertions(+) create mode 100644 src/main/java/lotto/exception/ErrorConstants.java diff --git a/src/main/java/lotto/exception/ErrorConstants.java b/src/main/java/lotto/exception/ErrorConstants.java new file mode 100644 index 0000000000..72193343f7 --- /dev/null +++ b/src/main/java/lotto/exception/ErrorConstants.java @@ -0,0 +1,16 @@ +package lotto.exception; + +public enum ErrorConstants { + ERROR_MESSAGE_PREFIX("[ERROR]"), + SPACE(" "); + + private final String value; + + ErrorConstants(String value) { + this.value = value; + } + + public String getValue() { + return value; + } +} From 25448986015fcc11450d7ca15e6b0fe8990c8dae Mon Sep 17 00:00:00 2001 From: gyuoo Date: Mon, 4 Nov 2024 22:46:23 +0900 Subject: [PATCH 17/79] feat(exception): add custom exceptions for purchase amount --- .../lotto/exception/InvalidPurchaseAmountException.java | 7 +++++++ .../java/lotto/exception/MaxPurchaseExceedException.java | 7 +++++++ .../lotto/exception/NegativePurchaseAmountException.java | 7 +++++++ .../lotto/exception/NotDivisibleByLottoPriceException.java | 7 +++++++ 4 files changed, 28 insertions(+) create mode 100644 src/main/java/lotto/exception/InvalidPurchaseAmountException.java create mode 100644 src/main/java/lotto/exception/MaxPurchaseExceedException.java create mode 100644 src/main/java/lotto/exception/NegativePurchaseAmountException.java create mode 100644 src/main/java/lotto/exception/NotDivisibleByLottoPriceException.java diff --git a/src/main/java/lotto/exception/InvalidPurchaseAmountException.java b/src/main/java/lotto/exception/InvalidPurchaseAmountException.java new file mode 100644 index 0000000000..fbe496a781 --- /dev/null +++ b/src/main/java/lotto/exception/InvalidPurchaseAmountException.java @@ -0,0 +1,7 @@ +package lotto.exception; + +public class InvalidPurchaseAmountException extends NumberFormatException { + public InvalidPurchaseAmountException(String message) { + super(ErrorConstants.ERROR_MESSAGE_PREFIX.getValue() + ErrorConstants.SPACE.getValue() + message); + } +} diff --git a/src/main/java/lotto/exception/MaxPurchaseExceedException.java b/src/main/java/lotto/exception/MaxPurchaseExceedException.java new file mode 100644 index 0000000000..bfa3d3c490 --- /dev/null +++ b/src/main/java/lotto/exception/MaxPurchaseExceedException.java @@ -0,0 +1,7 @@ +package lotto.exception; + +public class MaxPurchaseExceedException extends IllegalStateException { + public MaxPurchaseExceedException(String message) { + super(ErrorConstants.ERROR_MESSAGE_PREFIX.getValue() + ErrorConstants.SPACE.getValue() + message); + } +} \ No newline at end of file diff --git a/src/main/java/lotto/exception/NegativePurchaseAmountException.java b/src/main/java/lotto/exception/NegativePurchaseAmountException.java new file mode 100644 index 0000000000..1903cee99f --- /dev/null +++ b/src/main/java/lotto/exception/NegativePurchaseAmountException.java @@ -0,0 +1,7 @@ +package lotto.exception; + +public class NegativePurchaseAmountException extends IllegalArgumentException { + public NegativePurchaseAmountException(String message) { + super(ErrorConstants.ERROR_MESSAGE_PREFIX.getValue() + ErrorConstants.SPACE.getValue() + message); + } +} diff --git a/src/main/java/lotto/exception/NotDivisibleByLottoPriceException.java b/src/main/java/lotto/exception/NotDivisibleByLottoPriceException.java new file mode 100644 index 0000000000..749784bb53 --- /dev/null +++ b/src/main/java/lotto/exception/NotDivisibleByLottoPriceException.java @@ -0,0 +1,7 @@ +package lotto.exception; + +public class NotDivisibleByLottoPriceException extends IllegalArgumentException { + public NotDivisibleByLottoPriceException(String message) { + super(ErrorConstants.ERROR_MESSAGE_PREFIX.getValue() + ErrorConstants.SPACE.getValue() + message); + } +} From 9682d41acc1ed574ea90461a86faab34ee7925f4 Mon Sep 17 00:00:00 2001 From: gyuoo Date: Mon, 4 Nov 2024 23:18:34 +0900 Subject: [PATCH 18/79] refactor(exception): update exception --- .../java/lotto/exception/InvalidPurchaseAmountException.java | 5 +++-- .../java/lotto/exception/MaxPurchaseExceedException.java | 5 +++-- .../lotto/exception/NegativePurchaseAmountException.java | 3 ++- .../lotto/exception/NotDivisibleByLottoPriceException.java | 3 ++- 4 files changed, 10 insertions(+), 6 deletions(-) diff --git a/src/main/java/lotto/exception/InvalidPurchaseAmountException.java b/src/main/java/lotto/exception/InvalidPurchaseAmountException.java index fbe496a781..672c0b9ef6 100644 --- a/src/main/java/lotto/exception/InvalidPurchaseAmountException.java +++ b/src/main/java/lotto/exception/InvalidPurchaseAmountException.java @@ -1,7 +1,8 @@ package lotto.exception; public class InvalidPurchaseAmountException extends NumberFormatException { - public InvalidPurchaseAmountException(String message) { - super(ErrorConstants.ERROR_MESSAGE_PREFIX.getValue() + ErrorConstants.SPACE.getValue() + message); + public InvalidPurchaseAmountException() { + super(ErrorConstants.ERROR_MESSAGE_PREFIX.getValue() + ErrorConstants.SPACE.getValue() + + ErrorMessage.INVALID_PURCHASE_AMOUNT); } } diff --git a/src/main/java/lotto/exception/MaxPurchaseExceedException.java b/src/main/java/lotto/exception/MaxPurchaseExceedException.java index bfa3d3c490..ca5ee5ea1e 100644 --- a/src/main/java/lotto/exception/MaxPurchaseExceedException.java +++ b/src/main/java/lotto/exception/MaxPurchaseExceedException.java @@ -1,7 +1,8 @@ package lotto.exception; public class MaxPurchaseExceedException extends IllegalStateException { - public MaxPurchaseExceedException(String message) { - super(ErrorConstants.ERROR_MESSAGE_PREFIX.getValue() + ErrorConstants.SPACE.getValue() + message); + public MaxPurchaseExceedException() { + super(ErrorConstants.ERROR_MESSAGE_PREFIX.getValue() + ErrorConstants.SPACE.getValue() + + ErrorMessage.MAX_PURCHASE_EXCEED); } } \ No newline at end of file diff --git a/src/main/java/lotto/exception/NegativePurchaseAmountException.java b/src/main/java/lotto/exception/NegativePurchaseAmountException.java index 1903cee99f..9f78245f41 100644 --- a/src/main/java/lotto/exception/NegativePurchaseAmountException.java +++ b/src/main/java/lotto/exception/NegativePurchaseAmountException.java @@ -2,6 +2,7 @@ public class NegativePurchaseAmountException extends IllegalArgumentException { public NegativePurchaseAmountException(String message) { - super(ErrorConstants.ERROR_MESSAGE_PREFIX.getValue() + ErrorConstants.SPACE.getValue() + message); + super(ErrorConstants.ERROR_MESSAGE_PREFIX.getValue() + ErrorConstants.SPACE.getValue() + + ErrorMessage.INVALID_PURCHASE_AMOUNT); } } diff --git a/src/main/java/lotto/exception/NotDivisibleByLottoPriceException.java b/src/main/java/lotto/exception/NotDivisibleByLottoPriceException.java index 749784bb53..7afb877774 100644 --- a/src/main/java/lotto/exception/NotDivisibleByLottoPriceException.java +++ b/src/main/java/lotto/exception/NotDivisibleByLottoPriceException.java @@ -2,6 +2,7 @@ public class NotDivisibleByLottoPriceException extends IllegalArgumentException { public NotDivisibleByLottoPriceException(String message) { - super(ErrorConstants.ERROR_MESSAGE_PREFIX.getValue() + ErrorConstants.SPACE.getValue() + message); + super(ErrorConstants.ERROR_MESSAGE_PREFIX.getValue() + ErrorConstants.SPACE.getValue() + + ErrorMessage.NOT_DIVISIBLE_BY_LOTTO_PRICE); } } From 7bba61acb24a2cc2cf1c7fb4211b4172290e7321 Mon Sep 17 00:00:00 2001 From: gyuoo Date: Mon, 4 Nov 2024 23:20:13 +0900 Subject: [PATCH 19/79] refactor(exception): remove unnecessary parameter --- .../java/lotto/exception/NegativePurchaseAmountException.java | 2 +- .../java/lotto/exception/NotDivisibleByLottoPriceException.java | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/src/main/java/lotto/exception/NegativePurchaseAmountException.java b/src/main/java/lotto/exception/NegativePurchaseAmountException.java index 9f78245f41..1d8d821cb2 100644 --- a/src/main/java/lotto/exception/NegativePurchaseAmountException.java +++ b/src/main/java/lotto/exception/NegativePurchaseAmountException.java @@ -1,7 +1,7 @@ package lotto.exception; public class NegativePurchaseAmountException extends IllegalArgumentException { - public NegativePurchaseAmountException(String message) { + public NegativePurchaseAmountException() { super(ErrorConstants.ERROR_MESSAGE_PREFIX.getValue() + ErrorConstants.SPACE.getValue() + ErrorMessage.INVALID_PURCHASE_AMOUNT); } diff --git a/src/main/java/lotto/exception/NotDivisibleByLottoPriceException.java b/src/main/java/lotto/exception/NotDivisibleByLottoPriceException.java index 7afb877774..a5dfdf39a9 100644 --- a/src/main/java/lotto/exception/NotDivisibleByLottoPriceException.java +++ b/src/main/java/lotto/exception/NotDivisibleByLottoPriceException.java @@ -1,7 +1,7 @@ package lotto.exception; public class NotDivisibleByLottoPriceException extends IllegalArgumentException { - public NotDivisibleByLottoPriceException(String message) { + public NotDivisibleByLottoPriceException() { super(ErrorConstants.ERROR_MESSAGE_PREFIX.getValue() + ErrorConstants.SPACE.getValue() + ErrorMessage.NOT_DIVISIBLE_BY_LOTTO_PRICE); } From 5b829f427e6ba4f2b8f435895bf9febd24c3929b Mon Sep 17 00:00:00 2001 From: gyuoo Date: Mon, 4 Nov 2024 23:21:59 +0900 Subject: [PATCH 20/79] feat(view): add input validation for purchase amount --- README.md | 11 +++++---- src/main/java/lotto/view/InputView.java | 29 ++++++++++++++++++++---- src/main/java/lotto/view/OutputView.java | 15 ++++++++++++ 3 files changed, 46 insertions(+), 9 deletions(-) diff --git a/README.md b/README.md index 682d8ac302..e978c9ce8b 100644 --- a/README.md +++ b/README.md @@ -113,10 +113,10 @@ ### 1. μž…λ ₯ - [x] 둜또 κ΅¬μž… κΈˆμ•‘ μž…λ ₯ λ°›κΈ° - - [ ] 1,000원 λ‹¨μœ„λ‘œ μž…λ ₯ λ°›μ•„μ•Ό 함 - - [ ] 1,000으둜 λ‚˜λˆ„μ–΄ 떨어지지 μ•ŠλŠ” 경우 μ˜ˆμ™Έ λ°œμƒ - - [ ] μ–‘μ˜ μ •μˆ˜κ°€ μ•„λ‹Œ 경우 μ˜ˆμ™Έ λ°œμƒ - - [ ] 1회 μ΅œλŒ€ ꡬ맀 κ°€λŠ₯ κΈˆμ•‘μ„ μ΄ˆκ³Όν•  μ‹œ μ˜ˆμ™Έ λ°œμƒ + - [x] 1,000원 λ‹¨μœ„λ‘œ μž…λ ₯ λ°›μ•„μ•Ό 함 + - [x] μ–‘μ˜ μ •μˆ˜κ°€ μ•„λ‹Œ 경우 μ˜ˆμ™Έ λ°œμƒ + - [x] 1,000으둜 λ‚˜λˆ„μ–΄ 떨어지지 μ•ŠλŠ” 경우 μ˜ˆμ™Έ λ°œμƒ + - [x] 1회 μ΅œλŒ€ ꡬ맀 κ°€λŠ₯ κΈˆμ•‘μ„ μ΄ˆκ³Όν•  μ‹œ μ˜ˆμ™Έ λ°œμƒ - [ ] 당첨 번호 μž…λ ₯ - [ ] μ‰Όν‘œλ‘œ ꡬ뢄 - [ ] μ˜¬λ°”λ₯΄κ²Œ ꡬ뢄할 수 없을 μ‹œ μ˜ˆμ™Έ λ°œμƒ @@ -201,4 +201,5 @@ ### κ³ λ―Όν•œ λΆ€λΆ„ - 둜또 ꡬ맀 κ°€λŠ₯ κΈˆμ•‘μ„ intλ‚˜ long으둜 ν•  것인가, ν˜„μ‹€μ²˜λŸΌ 10만 μ›κΉŒμ§€ μ œν•œν•  것인가 -- μ„ μ •λœ 둜또 번호 좜λ ₯ μ‹œ λ„ˆλ¬΄ 길어지지 μ•Šλ„λ‘ ν•˜λ˜, 10만 원 λ³΄λ‹€λŠ” λ„‰λ„‰ν•˜κ²Œ μ œν•œ \ No newline at end of file + - 10만 μ›μœΌλ‘œ μ œν•œ +- Validator.validateκ°€ λ§˜μ— μ•ˆ λ“œλŠ”λ° μ–΄μ©”κΉŒ.. \ No newline at end of file diff --git a/src/main/java/lotto/view/InputView.java b/src/main/java/lotto/view/InputView.java index 554b4ac5da..4571ac22e1 100644 --- a/src/main/java/lotto/view/InputView.java +++ b/src/main/java/lotto/view/InputView.java @@ -1,21 +1,42 @@ package lotto.view; import camp.nextstep.edu.missionutils.Console; +import lotto.exception.InvalidPurchaseAmountException; +import lotto.exception.MaxPurchaseExceedException; +import lotto.exception.NegativePurchaseAmountException; +import lotto.exception.NotDivisibleByLottoPriceException; +import lotto.util.PurchaseAmountValidator; public class InputView { private final OutputView outputView; + private final PurchaseAmountValidator purchaseAmountValidator; - public InputView(OutputView outputView) { + public InputView(OutputView outputView, PurchaseAmountValidator purchaseAmountValidator) { this.outputView = outputView; + this.purchaseAmountValidator = purchaseAmountValidator; } public String readLine() { return Console.readLine(); } - public String getPurchaseAmount() { - outputView.printPurchaseAmountMessage(); - return readLine(); + public int getPurchaseAmount() { + while (true) { + outputView.printPurchaseAmountMessage(); + String input = readLine(); + + try { + return purchaseAmountValidator.validateInput(input); + } catch (InvalidPurchaseAmountException e) { + outputView.printInvalidPurchaseAmountMessage(); + } catch (NegativePurchaseAmountException e) { + outputView.printInvalidPurchaseAmountMessage(); + } catch (NotDivisibleByLottoPriceException e) { + outputView.printNotDivisibleByLottoPriceMessage(); + } catch (MaxPurchaseExceedException e) { + outputView.printMaxPurchaseExceedMessage(); + } + } } } diff --git a/src/main/java/lotto/view/OutputView.java b/src/main/java/lotto/view/OutputView.java index b8e752f149..17151f462b 100644 --- a/src/main/java/lotto/view/OutputView.java +++ b/src/main/java/lotto/view/OutputView.java @@ -1,8 +1,23 @@ package lotto.view; +import lotto.exception.ErrorMessage; + public class OutputView { public void printPurchaseAmountMessage() { System.out.println(ConsoleMessage.INPUT_PURCHASE_AMOUNT.getMessage()); } + + public void printInvalidPurchaseAmountMessage() { + System.out.println(ErrorMessage.INVALID_PURCHASE_AMOUNT.getMessage()); + } + + public void printNotDivisibleByLottoPriceMessage() { + System.out.println(ErrorMessage.NOT_DIVISIBLE_BY_LOTTO_PRICE.getMessage()); + } + + public void printMaxPurchaseExceedMessage() { + System.out.println(ErrorMessage.MAX_PURCHASE_EXCEED.getMessage()); + } + } From 5a59eac1894f2ebd8e05ad88af8ba92528242b3d Mon Sep 17 00:00:00 2001 From: gyuoo Date: Mon, 4 Nov 2024 23:22:38 +0900 Subject: [PATCH 21/79] feat(util): add purchase amount validation logic --- .../lotto/util/PurchaseAmountValidator.java | 43 +++++++++++++++++++ 1 file changed, 43 insertions(+) create mode 100644 src/main/java/lotto/util/PurchaseAmountValidator.java diff --git a/src/main/java/lotto/util/PurchaseAmountValidator.java b/src/main/java/lotto/util/PurchaseAmountValidator.java new file mode 100644 index 0000000000..bbe46fcc3a --- /dev/null +++ b/src/main/java/lotto/util/PurchaseAmountValidator.java @@ -0,0 +1,43 @@ +package lotto.util; + +import lotto.constants.LottoConstantNumbers; +import lotto.exception.InvalidPurchaseAmountException; +import lotto.exception.MaxPurchaseExceedException; +import lotto.exception.NotDivisibleByLottoPriceException; + +public class PurchaseAmountValidator { + + public int validateInput(String input) { + int parsedInput = parseStringToInt(input); + if (isNegativeNumber(parsedInput)) { + throw new InvalidPurchaseAmountException(); + } + if (!canDivideWithPrice(parsedInput)) { + throw new NotDivisibleByLottoPriceException(); + } + if (isExceedMaxPurchaseAmount(parsedInput)) { + throw new MaxPurchaseExceedException(); + } + return parsedInput; + } + + private int parseStringToInt(String input) { + try { + return Integer.parseInt(input); + } catch (InvalidPurchaseAmountException e) { + throw new InvalidPurchaseAmountException(); + } + } + + private boolean isNegativeNumber(int purchaseAmount) { + return purchaseAmount < 0; + } + + private boolean canDivideWithPrice(int purchaseAmount) { + return purchaseAmount % LottoConstantNumbers.LOTTO_PRICE.getValue() == 0; + } + + private boolean isExceedMaxPurchaseAmount(int purchaseAmount) { + return purchaseAmount > LottoConstantNumbers.MAX_PURCHASE_AMOUNT.getValue(); + } +} From baf6ff27347a16a7617679fe9e3bbbf6077cf251 Mon Sep 17 00:00:00 2001 From: gyuoo Date: Mon, 4 Nov 2024 23:25:35 +0900 Subject: [PATCH 22/79] feat(exception): add exception for lotto number counts --- src/main/java/lotto/domain/Lotto.java | 4 +++- src/main/java/lotto/exception/ErrorMessage.java | 10 +++++----- .../java/lotto/exception/LottoNumberSizeException.java | 8 ++++++++ 3 files changed, 16 insertions(+), 6 deletions(-) create mode 100644 src/main/java/lotto/exception/LottoNumberSizeException.java diff --git a/src/main/java/lotto/domain/Lotto.java b/src/main/java/lotto/domain/Lotto.java index e519c8f8c8..463c5acae1 100644 --- a/src/main/java/lotto/domain/Lotto.java +++ b/src/main/java/lotto/domain/Lotto.java @@ -2,6 +2,8 @@ import java.util.List; +import lotto.exception.LottoNumberSizeException; + public class Lotto { private final List numbers; @@ -12,7 +14,7 @@ public Lotto(List numbers) { private void validate(List numbers) { if (numbers.size() != 6) { - throw new IllegalArgumentException("[ERROR] 둜또 λ²ˆν˜ΈλŠ” 6κ°œμ—¬μ•Ό ν•©λ‹ˆλ‹€."); + throw new LottoNumberSizeException(); } } diff --git a/src/main/java/lotto/exception/ErrorMessage.java b/src/main/java/lotto/exception/ErrorMessage.java index e52b5cd333..0e55200a02 100644 --- a/src/main/java/lotto/exception/ErrorMessage.java +++ b/src/main/java/lotto/exception/ErrorMessage.java @@ -1,12 +1,12 @@ package lotto.exception; -import lotto.constants.LottoConstantNumbers; +import static lotto.constants.LottoConstantNumbers.*; public enum ErrorMessage { - INVALID_PURCHASE_AMOUNT("κ΅¬μž… κΈˆμ•‘μ€ " + LottoConstantNumbers.LOTTO_PRICE + " λ‹¨μœ„μ˜ μ–‘μ˜ μ •μˆ˜λ₯Ό μž…λ ₯ν•΄μ•Ό ν•©λ‹ˆλ‹€."), - NOT_DIVISIBLE_BY_LOTTO_PRICE("κ΅¬μž… κΈˆμ•‘μ€ " + LottoConstantNumbers.LOTTO_PRICE + "원 λ‹¨μœ„μ—¬μ•Ό ν•©λ‹ˆλ‹€."), - MAX_PURCHASE_EXCEED("1회 μ΅œλŒ€ ꡬ맀 κ°€λŠ₯ κΈˆμ•‘μ€ " + LottoConstantNumbers.MAX_PURCHASE_AMOUNT + "μž…λ‹ˆλ‹€."), - ; + INVALID_PURCHASE_AMOUNT("κ΅¬μž… κΈˆμ•‘μ€ " + LOTTO_PRICE + " λ‹¨μœ„μ˜ μ–‘μ˜ μ •μˆ˜λ₯Ό μž…λ ₯ν•΄μ•Ό ν•©λ‹ˆλ‹€."), + NOT_DIVISIBLE_BY_LOTTO_PRICE("κ΅¬μž… κΈˆμ•‘μ€ " + LOTTO_PRICE + "원 λ‹¨μœ„μ—¬μ•Ό ν•©λ‹ˆλ‹€."), + MAX_PURCHASE_EXCEED("1회 μ΅œλŒ€ ꡬ맀 κ°€λŠ₯ κΈˆμ•‘μ€ " + MAX_PURCHASE_AMOUNT + "μž…λ‹ˆλ‹€."), + INVALID_LOTTO_NUMBERS_COUNT("둜또 λ²ˆν˜ΈλŠ” " + LOTTO_NUMBERS_COUNT + "κ°œμ—¬μ•Ό ν•©λ‹ˆλ‹€."); private final String message; diff --git a/src/main/java/lotto/exception/LottoNumberSizeException.java b/src/main/java/lotto/exception/LottoNumberSizeException.java new file mode 100644 index 0000000000..4aff747e28 --- /dev/null +++ b/src/main/java/lotto/exception/LottoNumberSizeException.java @@ -0,0 +1,8 @@ +package lotto.exception; + +public class LottoNumberSizeException extends IllegalArgumentException { + public LottoNumberSizeException() { + super(ErrorConstants.ERROR_MESSAGE_PREFIX.getValue() + ErrorConstants.SPACE.getValue() + + ErrorMessage.INVALID_PURCHASE_AMOUNT); + } +} From a61364fab5ecacc032c2547556ce9c74161410f4 Mon Sep 17 00:00:00 2001 From: gyuoo Date: Mon, 4 Nov 2024 23:28:47 +0900 Subject: [PATCH 23/79] feat(exception): add error messages --- src/main/java/lotto/exception/ErrorMessage.java | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/src/main/java/lotto/exception/ErrorMessage.java b/src/main/java/lotto/exception/ErrorMessage.java index 0e55200a02..49f6a7b7b9 100644 --- a/src/main/java/lotto/exception/ErrorMessage.java +++ b/src/main/java/lotto/exception/ErrorMessage.java @@ -6,7 +6,9 @@ public enum ErrorMessage { INVALID_PURCHASE_AMOUNT("κ΅¬μž… κΈˆμ•‘μ€ " + LOTTO_PRICE + " λ‹¨μœ„μ˜ μ–‘μ˜ μ •μˆ˜λ₯Ό μž…λ ₯ν•΄μ•Ό ν•©λ‹ˆλ‹€."), NOT_DIVISIBLE_BY_LOTTO_PRICE("κ΅¬μž… κΈˆμ•‘μ€ " + LOTTO_PRICE + "원 λ‹¨μœ„μ—¬μ•Ό ν•©λ‹ˆλ‹€."), MAX_PURCHASE_EXCEED("1회 μ΅œλŒ€ ꡬ맀 κ°€λŠ₯ κΈˆμ•‘μ€ " + MAX_PURCHASE_AMOUNT + "μž…λ‹ˆλ‹€."), - INVALID_LOTTO_NUMBERS_COUNT("둜또 λ²ˆν˜ΈλŠ” " + LOTTO_NUMBERS_COUNT + "κ°œμ—¬μ•Ό ν•©λ‹ˆλ‹€."); + INVALID_LOTTO_NUMBERS_COUNT("둜또 λ²ˆν˜ΈλŠ” " + LOTTO_NUMBERS_COUNT + "κ°œμ—¬μ•Ό ν•©λ‹ˆλ‹€."), + OUT_OF_RANGE_WINNING_NUMBER("둜또 λ²ˆν˜ΈλŠ” " + MIN_LOTTO_NUMBER + "λΆ€ν„°" + MAX_LOTTO_NUMBER + "κΉŒμ§€μ˜ λ²”μœ„μ—¬μ•Ό ν•©λ‹ˆλ‹€."), + DUPLICATE_WINNING_NUMBER("당첨 λ²ˆν˜ΈλŠ” 쀑볡될 수 μ—†μŠ΅λ‹ˆλ‹€."); private final String message; From e8469660421731b3991ba40aa6c958518ddd72e0 Mon Sep 17 00:00:00 2001 From: gyuoo Date: Mon, 4 Nov 2024 23:29:10 +0900 Subject: [PATCH 24/79] refactor(exception): move package --- .../InvalidPurchaseAmountException.java | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) rename src/main/java/lotto/exception/{ => purchaseamountexception}/InvalidPurchaseAmountException.java (67%) diff --git a/src/main/java/lotto/exception/InvalidPurchaseAmountException.java b/src/main/java/lotto/exception/purchaseamountexception/InvalidPurchaseAmountException.java similarity index 67% rename from src/main/java/lotto/exception/InvalidPurchaseAmountException.java rename to src/main/java/lotto/exception/purchaseamountexception/InvalidPurchaseAmountException.java index 672c0b9ef6..2b655a5627 100644 --- a/src/main/java/lotto/exception/InvalidPurchaseAmountException.java +++ b/src/main/java/lotto/exception/purchaseamountexception/InvalidPurchaseAmountException.java @@ -1,4 +1,7 @@ -package lotto.exception; +package lotto.exception.purchaseamountexception; + +import lotto.exception.ErrorConstants; +import lotto.exception.ErrorMessage; public class InvalidPurchaseAmountException extends NumberFormatException { public InvalidPurchaseAmountException() { From 1df50949e60bd85077e7f9d57d5967e20eadd310 Mon Sep 17 00:00:00 2001 From: gyuoo Date: Mon, 4 Nov 2024 23:29:16 +0900 Subject: [PATCH 25/79] refactor(exception): move package --- .../MaxPurchaseExceedException.java | 5 ++++- .../NegativePurchaseAmountException.java | 5 ++++- .../NotDivisibleByLottoPriceException.java | 5 ++++- 3 files changed, 12 insertions(+), 3 deletions(-) rename src/main/java/lotto/exception/{ => purchaseamountexception}/MaxPurchaseExceedException.java (66%) rename src/main/java/lotto/exception/{ => purchaseamountexception}/NegativePurchaseAmountException.java (67%) rename src/main/java/lotto/exception/{ => purchaseamountexception}/NotDivisibleByLottoPriceException.java (68%) diff --git a/src/main/java/lotto/exception/MaxPurchaseExceedException.java b/src/main/java/lotto/exception/purchaseamountexception/MaxPurchaseExceedException.java similarity index 66% rename from src/main/java/lotto/exception/MaxPurchaseExceedException.java rename to src/main/java/lotto/exception/purchaseamountexception/MaxPurchaseExceedException.java index ca5ee5ea1e..a0b950fdc6 100644 --- a/src/main/java/lotto/exception/MaxPurchaseExceedException.java +++ b/src/main/java/lotto/exception/purchaseamountexception/MaxPurchaseExceedException.java @@ -1,4 +1,7 @@ -package lotto.exception; +package lotto.exception.purchaseamountexception; + +import lotto.exception.ErrorConstants; +import lotto.exception.ErrorMessage; public class MaxPurchaseExceedException extends IllegalStateException { public MaxPurchaseExceedException() { diff --git a/src/main/java/lotto/exception/NegativePurchaseAmountException.java b/src/main/java/lotto/exception/purchaseamountexception/NegativePurchaseAmountException.java similarity index 67% rename from src/main/java/lotto/exception/NegativePurchaseAmountException.java rename to src/main/java/lotto/exception/purchaseamountexception/NegativePurchaseAmountException.java index 1d8d821cb2..054b995d95 100644 --- a/src/main/java/lotto/exception/NegativePurchaseAmountException.java +++ b/src/main/java/lotto/exception/purchaseamountexception/NegativePurchaseAmountException.java @@ -1,4 +1,7 @@ -package lotto.exception; +package lotto.exception.purchaseamountexception; + +import lotto.exception.ErrorConstants; +import lotto.exception.ErrorMessage; public class NegativePurchaseAmountException extends IllegalArgumentException { public NegativePurchaseAmountException() { diff --git a/src/main/java/lotto/exception/NotDivisibleByLottoPriceException.java b/src/main/java/lotto/exception/purchaseamountexception/NotDivisibleByLottoPriceException.java similarity index 68% rename from src/main/java/lotto/exception/NotDivisibleByLottoPriceException.java rename to src/main/java/lotto/exception/purchaseamountexception/NotDivisibleByLottoPriceException.java index a5dfdf39a9..3fcde019c1 100644 --- a/src/main/java/lotto/exception/NotDivisibleByLottoPriceException.java +++ b/src/main/java/lotto/exception/purchaseamountexception/NotDivisibleByLottoPriceException.java @@ -1,4 +1,7 @@ -package lotto.exception; +package lotto.exception.purchaseamountexception; + +import lotto.exception.ErrorConstants; +import lotto.exception.ErrorMessage; public class NotDivisibleByLottoPriceException extends IllegalArgumentException { public NotDivisibleByLottoPriceException() { From 6d4c0b7ea4fe5ef6315f6e6cecc0428bd0673ed4 Mon Sep 17 00:00:00 2001 From: gyuoo Date: Mon, 4 Nov 2024 23:30:50 +0900 Subject: [PATCH 26/79] feat(exception): add exception for winning number range --- .../OutOfRangeWinningNumberException.java | 11 +++++++++++ 1 file changed, 11 insertions(+) create mode 100644 src/main/java/lotto/exception/winningnumberexception/OutOfRangeWinningNumberException.java diff --git a/src/main/java/lotto/exception/winningnumberexception/OutOfRangeWinningNumberException.java b/src/main/java/lotto/exception/winningnumberexception/OutOfRangeWinningNumberException.java new file mode 100644 index 0000000000..5f5cf61f37 --- /dev/null +++ b/src/main/java/lotto/exception/winningnumberexception/OutOfRangeWinningNumberException.java @@ -0,0 +1,11 @@ +package lotto.exception.winningnumberexception; + +import lotto.exception.ErrorConstants; +import lotto.exception.ErrorMessage; + +public class OutOfRangeWinningNumberException extends IllegalArgumentException { + public OutOfRangeWinningNumberException() { + super(ErrorConstants.ERROR_MESSAGE_PREFIX.getValue() + ErrorConstants.SPACE.getValue() + + ErrorMessage.OUT_OF_RANGE_WINNING_NUMBER.getMessage()); + } +} From 223d57dbdcbe57213150ab3a237e99a5f90ae6db Mon Sep 17 00:00:00 2001 From: gyuoo Date: Mon, 4 Nov 2024 23:31:30 +0900 Subject: [PATCH 27/79] refactor(exception): update import paths --- src/main/java/lotto/domain/Lotto.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/main/java/lotto/domain/Lotto.java b/src/main/java/lotto/domain/Lotto.java index 463c5acae1..1328870785 100644 --- a/src/main/java/lotto/domain/Lotto.java +++ b/src/main/java/lotto/domain/Lotto.java @@ -2,7 +2,7 @@ import java.util.List; -import lotto.exception.LottoNumberSizeException; +import lotto.exception.lottoticketexception.LottoNumberSizeException; public class Lotto { private final List numbers; From eb2c9ec33e0a7e3c2b30990adb3de3a12fcf4f47 Mon Sep 17 00:00:00 2001 From: gyuoo Date: Mon, 4 Nov 2024 23:31:54 +0900 Subject: [PATCH 28/79] refactor(exception): move package --- .../{ => lottoticketexception}/LottoNumberSizeException.java | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) rename src/main/java/lotto/exception/{ => lottoticketexception}/LottoNumberSizeException.java (66%) diff --git a/src/main/java/lotto/exception/LottoNumberSizeException.java b/src/main/java/lotto/exception/lottoticketexception/LottoNumberSizeException.java similarity index 66% rename from src/main/java/lotto/exception/LottoNumberSizeException.java rename to src/main/java/lotto/exception/lottoticketexception/LottoNumberSizeException.java index 4aff747e28..b8bcbe73e6 100644 --- a/src/main/java/lotto/exception/LottoNumberSizeException.java +++ b/src/main/java/lotto/exception/lottoticketexception/LottoNumberSizeException.java @@ -1,4 +1,7 @@ -package lotto.exception; +package lotto.exception.lottoticketexception; + +import lotto.exception.ErrorConstants; +import lotto.exception.ErrorMessage; public class LottoNumberSizeException extends IllegalArgumentException { public LottoNumberSizeException() { From 18db5b50797a733365c7160af75057fcafabe548 Mon Sep 17 00:00:00 2001 From: gyuoo Date: Mon, 4 Nov 2024 23:33:28 +0900 Subject: [PATCH 29/79] refactor(exception): move package --- src/main/java/lotto/util/PurchaseAmountValidator.java | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/src/main/java/lotto/util/PurchaseAmountValidator.java b/src/main/java/lotto/util/PurchaseAmountValidator.java index bbe46fcc3a..d942e0d185 100644 --- a/src/main/java/lotto/util/PurchaseAmountValidator.java +++ b/src/main/java/lotto/util/PurchaseAmountValidator.java @@ -1,9 +1,9 @@ package lotto.util; import lotto.constants.LottoConstantNumbers; -import lotto.exception.InvalidPurchaseAmountException; -import lotto.exception.MaxPurchaseExceedException; -import lotto.exception.NotDivisibleByLottoPriceException; +import lotto.exception.purchaseamountexception.InvalidPurchaseAmountException; +import lotto.exception.purchaseamountexception.MaxPurchaseExceedException; +import lotto.exception.purchaseamountexception.NotDivisibleByLottoPriceException; public class PurchaseAmountValidator { From 81ef07742f2eab576f4466d6ba70b81c39213dbe Mon Sep 17 00:00:00 2001 From: gyuoo Date: Mon, 4 Nov 2024 23:35:59 +0900 Subject: [PATCH 30/79] feat(util): add WinningNumberSeparator to split winning numbers by comma --- .../java/lotto/util/WinningNumberSeparator.java | 15 +++++++++++++++ 1 file changed, 15 insertions(+) create mode 100644 src/main/java/lotto/util/WinningNumberSeparator.java diff --git a/src/main/java/lotto/util/WinningNumberSeparator.java b/src/main/java/lotto/util/WinningNumberSeparator.java new file mode 100644 index 0000000000..989ec1bced --- /dev/null +++ b/src/main/java/lotto/util/WinningNumberSeparator.java @@ -0,0 +1,15 @@ +package lotto.util; + +import java.util.Arrays; +import java.util.List; + +public class WinningNumberSeparator { + + public List splitByComma(String input) { + List numbers = Arrays.stream(input.split(",")) + .map(String::trim) + .map(Integer::parseInt) + .toList(); + return numbers; + } +} From 1b1f295c1aaca65856c823e5d518527281c941f6 Mon Sep 17 00:00:00 2001 From: gyuoo Date: Mon, 4 Nov 2024 23:39:02 +0900 Subject: [PATCH 31/79] docs(readme): mark checklists --- README.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/README.md b/README.md index e978c9ce8b..f69a10e709 100644 --- a/README.md +++ b/README.md @@ -118,8 +118,8 @@ - [x] 1,000으둜 λ‚˜λˆ„μ–΄ 떨어지지 μ•ŠλŠ” 경우 μ˜ˆμ™Έ λ°œμƒ - [x] 1회 μ΅œλŒ€ ꡬ맀 κ°€λŠ₯ κΈˆμ•‘μ„ μ΄ˆκ³Όν•  μ‹œ μ˜ˆμ™Έ λ°œμƒ - [ ] 당첨 번호 μž…λ ₯ - - [ ] μ‰Όν‘œλ‘œ ꡬ뢄 - - [ ] μ˜¬λ°”λ₯΄κ²Œ ꡬ뢄할 수 없을 μ‹œ μ˜ˆμ™Έ λ°œμƒ + - [x] μ‰Όν‘œλ‘œ ꡬ뢄 + - [x] μ˜¬λ°”λ₯΄κ²Œ ꡬ뢄할 수 없을 μ‹œ μ˜ˆμ™Έ λ°œμƒ - [ ] 6개 μž…λ ₯ λ°›μŒ - [ ] 6개 초과 μ‹œ μ˜ˆμ™Έ λ°œμƒ - [ ] 1~45 λ²”μœ„μ˜ μ •μˆ˜λ§Œ μžˆλŠ”μ§€ 검증 From 769bac967e29053dccdcde5832f4bac7a7895a40 Mon Sep 17 00:00:00 2001 From: gyuoo Date: Mon, 4 Nov 2024 23:40:13 +0900 Subject: [PATCH 32/79] docs(readme): mark checklists --- README.md | 1 + src/main/java/lotto/view/OutputView.java | 4 ++++ 2 files changed, 5 insertions(+) diff --git a/README.md b/README.md index f69a10e709..2f1eac482d 100644 --- a/README.md +++ b/README.md @@ -117,6 +117,7 @@ - [x] μ–‘μ˜ μ •μˆ˜κ°€ μ•„λ‹Œ 경우 μ˜ˆμ™Έ λ°œμƒ - [x] 1,000으둜 λ‚˜λˆ„μ–΄ 떨어지지 μ•ŠλŠ” 경우 μ˜ˆμ™Έ λ°œμƒ - [x] 1회 μ΅œλŒ€ ꡬ맀 κ°€λŠ₯ κΈˆμ•‘μ„ μ΄ˆκ³Όν•  μ‹œ μ˜ˆμ™Έ λ°œμƒ + - [x] 둜또 ꡬ맀 개수 좜λ ₯ - [ ] 당첨 번호 μž…λ ₯ - [x] μ‰Όν‘œλ‘œ ꡬ뢄 - [x] μ˜¬λ°”λ₯΄κ²Œ ꡬ뢄할 수 없을 μ‹œ μ˜ˆμ™Έ λ°œμƒ diff --git a/src/main/java/lotto/view/OutputView.java b/src/main/java/lotto/view/OutputView.java index 17151f462b..9662cff7da 100644 --- a/src/main/java/lotto/view/OutputView.java +++ b/src/main/java/lotto/view/OutputView.java @@ -20,4 +20,8 @@ public void printMaxPurchaseExceedMessage() { System.out.println(ErrorMessage.MAX_PURCHASE_EXCEED.getMessage()); } + public void printPurchaseCountMessage(int purchaseCount) { + System.out.println(String.format(ConsoleMessage.PURCHASE_COUNT_MESSAGE.getMessage(), purchaseCount)); + } + } From d28ef8393b121d732d37dfbb977d526170834b8d Mon Sep 17 00:00:00 2001 From: gyuoo Date: Mon, 4 Nov 2024 23:47:36 +0900 Subject: [PATCH 33/79] fix(exception): rename OutOfRangeWinningNumberException to OutOfRangeNumberException --- src/main/java/lotto/exception/ErrorMessage.java | 4 ++-- .../numberexception/OutOfRangeNumberException.java | 11 +++++++++++ .../OutOfRangeWinningNumberException.java | 11 ----------- 3 files changed, 13 insertions(+), 13 deletions(-) create mode 100644 src/main/java/lotto/exception/numberexception/OutOfRangeNumberException.java delete mode 100644 src/main/java/lotto/exception/winningnumberexception/OutOfRangeWinningNumberException.java diff --git a/src/main/java/lotto/exception/ErrorMessage.java b/src/main/java/lotto/exception/ErrorMessage.java index 49f6a7b7b9..4eadb35aa3 100644 --- a/src/main/java/lotto/exception/ErrorMessage.java +++ b/src/main/java/lotto/exception/ErrorMessage.java @@ -7,8 +7,8 @@ public enum ErrorMessage { NOT_DIVISIBLE_BY_LOTTO_PRICE("κ΅¬μž… κΈˆμ•‘μ€ " + LOTTO_PRICE + "원 λ‹¨μœ„μ—¬μ•Ό ν•©λ‹ˆλ‹€."), MAX_PURCHASE_EXCEED("1회 μ΅œλŒ€ ꡬ맀 κ°€λŠ₯ κΈˆμ•‘μ€ " + MAX_PURCHASE_AMOUNT + "μž…λ‹ˆλ‹€."), INVALID_LOTTO_NUMBERS_COUNT("둜또 λ²ˆν˜ΈλŠ” " + LOTTO_NUMBERS_COUNT + "κ°œμ—¬μ•Ό ν•©λ‹ˆλ‹€."), - OUT_OF_RANGE_WINNING_NUMBER("둜또 λ²ˆν˜ΈλŠ” " + MIN_LOTTO_NUMBER + "λΆ€ν„°" + MAX_LOTTO_NUMBER + "κΉŒμ§€μ˜ λ²”μœ„μ—¬μ•Ό ν•©λ‹ˆλ‹€."), - DUPLICATE_WINNING_NUMBER("당첨 λ²ˆν˜ΈλŠ” 쀑볡될 수 μ—†μŠ΅λ‹ˆλ‹€."); + OUT_OF_RANGE_NUMBER("둜또 λ²ˆν˜ΈλŠ” " + MIN_LOTTO_NUMBER + "λΆ€ν„°" + MAX_LOTTO_NUMBER + "κΉŒμ§€μ˜ λ²”μœ„μ—¬μ•Ό ν•©λ‹ˆλ‹€."), + DUPLICATE_NUMBER("λ²ˆν˜ΈλŠ” 쀑볡될 수 μ—†μŠ΅λ‹ˆλ‹€."); private final String message; diff --git a/src/main/java/lotto/exception/numberexception/OutOfRangeNumberException.java b/src/main/java/lotto/exception/numberexception/OutOfRangeNumberException.java new file mode 100644 index 0000000000..932b4d8928 --- /dev/null +++ b/src/main/java/lotto/exception/numberexception/OutOfRangeNumberException.java @@ -0,0 +1,11 @@ +package lotto.exception.numberexception; + +import lotto.exception.ErrorConstants; +import lotto.exception.ErrorMessage; + +public class OutOfRangeNumberException extends IllegalArgumentException { + public OutOfRangeNumberException() { + super(ErrorConstants.ERROR_MESSAGE_PREFIX.getValue() + ErrorConstants.SPACE.getValue() + + ErrorMessage.OUT_OF_RANGE_NUMBER.getMessage()); + } +} diff --git a/src/main/java/lotto/exception/winningnumberexception/OutOfRangeWinningNumberException.java b/src/main/java/lotto/exception/winningnumberexception/OutOfRangeWinningNumberException.java deleted file mode 100644 index 5f5cf61f37..0000000000 --- a/src/main/java/lotto/exception/winningnumberexception/OutOfRangeWinningNumberException.java +++ /dev/null @@ -1,11 +0,0 @@ -package lotto.exception.winningnumberexception; - -import lotto.exception.ErrorConstants; -import lotto.exception.ErrorMessage; - -public class OutOfRangeWinningNumberException extends IllegalArgumentException { - public OutOfRangeWinningNumberException() { - super(ErrorConstants.ERROR_MESSAGE_PREFIX.getValue() + ErrorConstants.SPACE.getValue() - + ErrorMessage.OUT_OF_RANGE_WINNING_NUMBER.getMessage()); - } -} From 504ff54f0fa119ba6919fc1baf32ee6ad4195c29 Mon Sep 17 00:00:00 2001 From: gyuoo Date: Mon, 4 Nov 2024 23:48:13 +0900 Subject: [PATCH 34/79] feat(exception): add duplicate exception --- .../lottoticketexception/DuplicateException.java | 11 +++++++++++ 1 file changed, 11 insertions(+) create mode 100644 src/main/java/lotto/exception/lottoticketexception/DuplicateException.java diff --git a/src/main/java/lotto/exception/lottoticketexception/DuplicateException.java b/src/main/java/lotto/exception/lottoticketexception/DuplicateException.java new file mode 100644 index 0000000000..00ca086bb3 --- /dev/null +++ b/src/main/java/lotto/exception/lottoticketexception/DuplicateException.java @@ -0,0 +1,11 @@ +package lotto.exception.lottoticketexception; + +import lotto.exception.ErrorConstants; +import lotto.exception.ErrorMessage; + +public class DuplicateException extends IllegalArgumentException { + public DuplicateException() { + super(ErrorConstants.ERROR_MESSAGE_PREFIX.getValue() + ErrorConstants.SPACE.getValue() + + ErrorMessage.DUPLICATE_NUMBER); + } +} From d8e0568057149030a5388cb2b9d2a17be1c17dc4 Mon Sep 17 00:00:00 2001 From: gyuoo Date: Mon, 4 Nov 2024 23:49:16 +0900 Subject: [PATCH 35/79] feat(domain): add validate logic for lotto entity --- README.md | 14 ++++----- src/main/java/lotto/domain/Lotto.java | 30 +++++++++++++++++-- .../java/lotto/factory/LottoTicketStore.java | 12 ++++++++ 3 files changed, 46 insertions(+), 10 deletions(-) create mode 100644 src/main/java/lotto/factory/LottoTicketStore.java diff --git a/README.md b/README.md index 2f1eac482d..257903f9ee 100644 --- a/README.md +++ b/README.md @@ -118,15 +118,15 @@ - [x] 1,000으둜 λ‚˜λˆ„μ–΄ 떨어지지 μ•ŠλŠ” 경우 μ˜ˆμ™Έ λ°œμƒ - [x] 1회 μ΅œλŒ€ ꡬ맀 κ°€λŠ₯ κΈˆμ•‘μ„ μ΄ˆκ³Όν•  μ‹œ μ˜ˆμ™Έ λ°œμƒ - [x] 둜또 ꡬ맀 개수 좜λ ₯ -- [ ] 당첨 번호 μž…λ ₯ +- [x] 당첨 번호 μž…λ ₯ - [x] μ‰Όν‘œλ‘œ ꡬ뢄 - [x] μ˜¬λ°”λ₯΄κ²Œ ꡬ뢄할 수 없을 μ‹œ μ˜ˆμ™Έ λ°œμƒ - - [ ] 6개 μž…λ ₯ λ°›μŒ - - [ ] 6개 초과 μ‹œ μ˜ˆμ™Έ λ°œμƒ - - [ ] 1~45 λ²”μœ„μ˜ μ •μˆ˜λ§Œ μžˆλŠ”μ§€ 검증 - - [ ] λ²”μœ„ μ™Έμ˜ 수 μž…λ ₯ μ‹œ μ˜ˆμ™Έ λ°œμƒ - - [ ] 쀑볡 없이 μž…λ ₯λ˜μ—ˆλŠ”μ§€ 검증 - - [ ] μ€‘λ³΅λ˜μ—ˆμ„ μ‹œ μ˜ˆμ™Έ λ°œμƒ + - [x] 6개 μž…λ ₯ λ°›μŒ + - [x] 6κ°œκ°€ 아닐 경우 μ˜ˆμ™Έ λ°œμƒ + - [x] 1~45 λ²”μœ„μ˜ μ •μˆ˜λ§Œ μžˆλŠ”μ§€ 검증 + - [x] λ²”μœ„ μ™Έμ˜ 수 μž…λ ₯ μ‹œ μ˜ˆμ™Έ λ°œμƒ + - [x] 쀑볡 없이 μž…λ ₯λ˜μ—ˆλŠ”μ§€ 검증 + - [x] μ€‘λ³΅λ˜μ—ˆμ„ μ‹œ μ˜ˆμ™Έ λ°œμƒ - [ ] λ³΄λ„ˆμŠ€ 번호 μž…λ ₯ - [ ] 1개 μž…λ ₯ λ°›μŒ - [ ] 1~45 λ²”μœ„μ˜ μ •μˆ˜μΈμ§€ 검증 diff --git a/src/main/java/lotto/domain/Lotto.java b/src/main/java/lotto/domain/Lotto.java index 1328870785..8211df923f 100644 --- a/src/main/java/lotto/domain/Lotto.java +++ b/src/main/java/lotto/domain/Lotto.java @@ -1,23 +1,47 @@ package lotto.domain; +import static lotto.constants.LottoConstantNumbers.*; + import java.util.List; +import lotto.exception.lottoticketexception.DuplicateException; import lotto.exception.lottoticketexception.LottoNumberSizeException; +import lotto.exception.numberexception.OutOfRangeNumberException; public class Lotto { private final List numbers; public Lotto(List numbers) { - validate(numbers); + validateNumbers(numbers); this.numbers = numbers; } - private void validate(List numbers) { - if (numbers.size() != 6) { + private void validateNumbers(List numbers) { + validateNumbersCount(numbers); + validateNumberRange(numbers); + validateNoDuplicates(numbers); + } + + private void validateNumbersCount(List numbers) { + if (numbers.size() != LOTTO_NUMBERS_COUNT.getValue()) { throw new LottoNumberSizeException(); } } + private void validateNumberRange(List numbers) { + for (Integer number : numbers) { + if (number < MIN_LOTTO_NUMBER.getValue() || MAX_LOTTO_NUMBER.getValue() < number) { + throw new OutOfRangeNumberException(); + } + } + } + + private void validateNoDuplicates(List numbers) { + if (numbers.stream().distinct().count() != numbers.size()) { + throw new DuplicateException(); + } + } + @Override public String toString() { return numbers.toString(); diff --git a/src/main/java/lotto/factory/LottoTicketStore.java b/src/main/java/lotto/factory/LottoTicketStore.java new file mode 100644 index 0000000000..7c8f11d82b --- /dev/null +++ b/src/main/java/lotto/factory/LottoTicketStore.java @@ -0,0 +1,12 @@ +package lotto.factory; + +import java.util.List; + +import lotto.domain.Lotto; + +public class LottoTicketStore { + + public Lotto createLottoTicket(List numbers) { + return new Lotto(numbers); + } +} From 1480957387c8d86b3680e10bc672b1880b6a381e Mon Sep 17 00:00:00 2001 From: gyuoo Date: Mon, 4 Nov 2024 23:55:32 +0900 Subject: [PATCH 36/79] feat(view): add method to print total lottos --- src/main/java/lotto/view/OutputView.java | 10 +++++++++- 1 file changed, 9 insertions(+), 1 deletion(-) diff --git a/src/main/java/lotto/view/OutputView.java b/src/main/java/lotto/view/OutputView.java index 9662cff7da..42a76fbe9f 100644 --- a/src/main/java/lotto/view/OutputView.java +++ b/src/main/java/lotto/view/OutputView.java @@ -1,5 +1,8 @@ package lotto.view; +import java.util.List; + +import lotto.domain.Lotto; import lotto.exception.ErrorMessage; public class OutputView { @@ -23,5 +26,10 @@ public void printMaxPurchaseExceedMessage() { public void printPurchaseCountMessage(int purchaseCount) { System.out.println(String.format(ConsoleMessage.PURCHASE_COUNT_MESSAGE.getMessage(), purchaseCount)); } - + + public void printLottoList(List totalLottos) { + for (Lotto lotto : totalLottos) { + System.out.println(lotto.toString()); + } + } } From a1d7b38cb4e5b65da76d0d438042e152305a1e74 Mon Sep 17 00:00:00 2001 From: gyuoo Date: Tue, 5 Nov 2024 00:03:25 +0900 Subject: [PATCH 37/79] feat(util): add method to sort lotto numbers in ascending order --- README.md | 2 +- src/main/java/lotto/util/LottoNumberSorter.java | 11 +++++++++++ 2 files changed, 12 insertions(+), 1 deletion(-) create mode 100644 src/main/java/lotto/util/LottoNumberSorter.java diff --git a/README.md b/README.md index 257903f9ee..e0134e7b2a 100644 --- a/README.md +++ b/README.md @@ -172,7 +172,7 @@ - [ ] 숫자 검증 μœ ν‹Έλ¦¬ν‹° - [ ] 숫자 랜덀 μΆ”μΆœ μœ ν‹Έλ¦¬ν‹° -- [ ] μ˜€λ¦„μ°¨μˆœ μ •λ ¬ μœ ν‹Έλ¦¬ν‹° +- [x] μ˜€λ¦„μ°¨μˆœ μ •λ ¬ μœ ν‹Έλ¦¬ν‹° ### 8. ꡬ쑰 κ°œμ„  및 λ¦¬νŒ©ν† λ§ diff --git a/src/main/java/lotto/util/LottoNumberSorter.java b/src/main/java/lotto/util/LottoNumberSorter.java new file mode 100644 index 0000000000..c096c19d18 --- /dev/null +++ b/src/main/java/lotto/util/LottoNumberSorter.java @@ -0,0 +1,11 @@ +package lotto.util; + +import java.util.Collections; +import java.util.List; + +public class LottoNumberSorter { + public List sortInAscendingOrder(List numbers) { + Collections.sort(numbers); + return numbers; + } +} From 5d49132d85c67ec7b54653d071c34fa10897d574 Mon Sep 17 00:00:00 2001 From: gyuoo Date: Tue, 5 Nov 2024 00:10:19 +0900 Subject: [PATCH 38/79] feat(util): add method to pick random numbers --- README.md | 2 +- .../java/lotto/util/RandomNumberGenerator.java | 14 ++++++++++++++ 2 files changed, 15 insertions(+), 1 deletion(-) create mode 100644 src/main/java/lotto/util/RandomNumberGenerator.java diff --git a/README.md b/README.md index e0134e7b2a..2f347a3954 100644 --- a/README.md +++ b/README.md @@ -171,7 +171,7 @@ ### 7. μœ ν‹Έλ¦¬ν‹° - [ ] 숫자 검증 μœ ν‹Έλ¦¬ν‹° -- [ ] 숫자 랜덀 μΆ”μΆœ μœ ν‹Έλ¦¬ν‹° +- [x] 숫자 랜덀 μΆ”μΆœ μœ ν‹Έλ¦¬ν‹° - [x] μ˜€λ¦„μ°¨μˆœ μ •λ ¬ μœ ν‹Έλ¦¬ν‹° ### 8. ꡬ쑰 κ°œμ„  및 λ¦¬νŒ©ν† λ§ diff --git a/src/main/java/lotto/util/RandomNumberGenerator.java b/src/main/java/lotto/util/RandomNumberGenerator.java new file mode 100644 index 0000000000..efe1dae2a7 --- /dev/null +++ b/src/main/java/lotto/util/RandomNumberGenerator.java @@ -0,0 +1,14 @@ +package lotto.util; + +import static lotto.constants.LottoConstantNumbers.*; + +import java.util.List; + +import camp.nextstep.edu.missionutils.Randoms; + +public class RandomNumberGenerator { + public List pickLottoNumbers() { + return Randoms.pickUniqueNumbersInRange(MIN_LOTTO_NUMBER.getValue(), MAX_LOTTO_NUMBER.getValue(), + LOTTO_NUMBERS_COUNT.getValue()); + } +} From 98f067482817d1079fa846cfb0c9d031696d67ee Mon Sep 17 00:00:00 2001 From: gyuoo Date: Tue, 5 Nov 2024 00:11:23 +0900 Subject: [PATCH 39/79] refactor(view): simplify imports in OutputView --- src/main/java/lotto/view/OutputView.java | 18 ++++++++++++------ 1 file changed, 12 insertions(+), 6 deletions(-) diff --git a/src/main/java/lotto/view/OutputView.java b/src/main/java/lotto/view/OutputView.java index 42a76fbe9f..ed1297ff55 100644 --- a/src/main/java/lotto/view/OutputView.java +++ b/src/main/java/lotto/view/OutputView.java @@ -1,30 +1,36 @@ package lotto.view; +import static lotto.exception.ErrorMessage.*; +import static lotto.view.ConsoleMessage.*; + import java.util.List; import lotto.domain.Lotto; -import lotto.exception.ErrorMessage; public class OutputView { public void printPurchaseAmountMessage() { - System.out.println(ConsoleMessage.INPUT_PURCHASE_AMOUNT.getMessage()); + System.out.println(INPUT_PURCHASE_AMOUNT.getMessage()); } public void printInvalidPurchaseAmountMessage() { - System.out.println(ErrorMessage.INVALID_PURCHASE_AMOUNT.getMessage()); + System.out.println(INVALID_PURCHASE_AMOUNT.getMessage()); } public void printNotDivisibleByLottoPriceMessage() { - System.out.println(ErrorMessage.NOT_DIVISIBLE_BY_LOTTO_PRICE.getMessage()); + System.out.println(NOT_DIVISIBLE_BY_LOTTO_PRICE.getMessage()); } public void printMaxPurchaseExceedMessage() { - System.out.println(ErrorMessage.MAX_PURCHASE_EXCEED.getMessage()); + System.out.println(MAX_PURCHASE_EXCEED.getMessage()); } public void printPurchaseCountMessage(int purchaseCount) { - System.out.println(String.format(ConsoleMessage.PURCHASE_COUNT_MESSAGE.getMessage(), purchaseCount)); + System.out.println(String.format(PURCHASE_COUNT_MESSAGE.getMessage(), purchaseCount)); + } + + public void printToGetWinningNumbers() { + System.out.println(INPUT_WINNING_NUMBERS.getMessage()); } public void printLottoList(List totalLottos) { From f3d23fbe5e76372e889840be7fac11a38931f143 Mon Sep 17 00:00:00 2001 From: gyuoo Date: Tue, 5 Nov 2024 00:14:42 +0900 Subject: [PATCH 40/79] fix(exception): change exceptions to print correct values --- .../exception/lottoticketexception/DuplicateException.java | 2 +- .../lottoticketexception/LottoNumberSizeException.java | 2 +- .../purchaseamountexception/InvalidPurchaseAmountException.java | 2 +- .../purchaseamountexception/MaxPurchaseExceedException.java | 2 +- .../NegativePurchaseAmountException.java | 2 +- .../NotDivisibleByLottoPriceException.java | 2 +- 6 files changed, 6 insertions(+), 6 deletions(-) diff --git a/src/main/java/lotto/exception/lottoticketexception/DuplicateException.java b/src/main/java/lotto/exception/lottoticketexception/DuplicateException.java index 00ca086bb3..dca04a70da 100644 --- a/src/main/java/lotto/exception/lottoticketexception/DuplicateException.java +++ b/src/main/java/lotto/exception/lottoticketexception/DuplicateException.java @@ -6,6 +6,6 @@ public class DuplicateException extends IllegalArgumentException { public DuplicateException() { super(ErrorConstants.ERROR_MESSAGE_PREFIX.getValue() + ErrorConstants.SPACE.getValue() - + ErrorMessage.DUPLICATE_NUMBER); + + ErrorMessage.DUPLICATE_NUMBER.getMessage()); } } diff --git a/src/main/java/lotto/exception/lottoticketexception/LottoNumberSizeException.java b/src/main/java/lotto/exception/lottoticketexception/LottoNumberSizeException.java index b8bcbe73e6..ce4e0ecf34 100644 --- a/src/main/java/lotto/exception/lottoticketexception/LottoNumberSizeException.java +++ b/src/main/java/lotto/exception/lottoticketexception/LottoNumberSizeException.java @@ -6,6 +6,6 @@ public class LottoNumberSizeException extends IllegalArgumentException { public LottoNumberSizeException() { super(ErrorConstants.ERROR_MESSAGE_PREFIX.getValue() + ErrorConstants.SPACE.getValue() - + ErrorMessage.INVALID_PURCHASE_AMOUNT); + + ErrorMessage.INVALID_PURCHASE_AMOUNT.getMessage()); } } diff --git a/src/main/java/lotto/exception/purchaseamountexception/InvalidPurchaseAmountException.java b/src/main/java/lotto/exception/purchaseamountexception/InvalidPurchaseAmountException.java index 2b655a5627..8b15c5b3ed 100644 --- a/src/main/java/lotto/exception/purchaseamountexception/InvalidPurchaseAmountException.java +++ b/src/main/java/lotto/exception/purchaseamountexception/InvalidPurchaseAmountException.java @@ -6,6 +6,6 @@ public class InvalidPurchaseAmountException extends NumberFormatException { public InvalidPurchaseAmountException() { super(ErrorConstants.ERROR_MESSAGE_PREFIX.getValue() + ErrorConstants.SPACE.getValue() - + ErrorMessage.INVALID_PURCHASE_AMOUNT); + + ErrorMessage.INVALID_PURCHASE_AMOUNT.getMessage()); } } diff --git a/src/main/java/lotto/exception/purchaseamountexception/MaxPurchaseExceedException.java b/src/main/java/lotto/exception/purchaseamountexception/MaxPurchaseExceedException.java index a0b950fdc6..dc32e48f46 100644 --- a/src/main/java/lotto/exception/purchaseamountexception/MaxPurchaseExceedException.java +++ b/src/main/java/lotto/exception/purchaseamountexception/MaxPurchaseExceedException.java @@ -6,6 +6,6 @@ public class MaxPurchaseExceedException extends IllegalStateException { public MaxPurchaseExceedException() { super(ErrorConstants.ERROR_MESSAGE_PREFIX.getValue() + ErrorConstants.SPACE.getValue() - + ErrorMessage.MAX_PURCHASE_EXCEED); + + ErrorMessage.MAX_PURCHASE_EXCEED.getMessage()); } } \ No newline at end of file diff --git a/src/main/java/lotto/exception/purchaseamountexception/NegativePurchaseAmountException.java b/src/main/java/lotto/exception/purchaseamountexception/NegativePurchaseAmountException.java index 054b995d95..0a60a54f6f 100644 --- a/src/main/java/lotto/exception/purchaseamountexception/NegativePurchaseAmountException.java +++ b/src/main/java/lotto/exception/purchaseamountexception/NegativePurchaseAmountException.java @@ -6,6 +6,6 @@ public class NegativePurchaseAmountException extends IllegalArgumentException { public NegativePurchaseAmountException() { super(ErrorConstants.ERROR_MESSAGE_PREFIX.getValue() + ErrorConstants.SPACE.getValue() - + ErrorMessage.INVALID_PURCHASE_AMOUNT); + + ErrorMessage.INVALID_PURCHASE_AMOUNT.getMessage()); } } diff --git a/src/main/java/lotto/exception/purchaseamountexception/NotDivisibleByLottoPriceException.java b/src/main/java/lotto/exception/purchaseamountexception/NotDivisibleByLottoPriceException.java index 3fcde019c1..84b7ecb6b5 100644 --- a/src/main/java/lotto/exception/purchaseamountexception/NotDivisibleByLottoPriceException.java +++ b/src/main/java/lotto/exception/purchaseamountexception/NotDivisibleByLottoPriceException.java @@ -6,6 +6,6 @@ public class NotDivisibleByLottoPriceException extends IllegalArgumentException { public NotDivisibleByLottoPriceException() { super(ErrorConstants.ERROR_MESSAGE_PREFIX.getValue() + ErrorConstants.SPACE.getValue() - + ErrorMessage.NOT_DIVISIBLE_BY_LOTTO_PRICE); + + ErrorMessage.NOT_DIVISIBLE_BY_LOTTO_PRICE.getMessage()); } } From 30952f938f4d2b193c341fe52ba3812a13f5aac8 Mon Sep 17 00:00:00 2001 From: gyuoo Date: Tue, 5 Nov 2024 00:20:24 +0900 Subject: [PATCH 41/79] fix(exception): correct exception message --- .../lottoticketexception/LottoNumberSizeException.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/main/java/lotto/exception/lottoticketexception/LottoNumberSizeException.java b/src/main/java/lotto/exception/lottoticketexception/LottoNumberSizeException.java index ce4e0ecf34..0430eb7eae 100644 --- a/src/main/java/lotto/exception/lottoticketexception/LottoNumberSizeException.java +++ b/src/main/java/lotto/exception/lottoticketexception/LottoNumberSizeException.java @@ -6,6 +6,6 @@ public class LottoNumberSizeException extends IllegalArgumentException { public LottoNumberSizeException() { super(ErrorConstants.ERROR_MESSAGE_PREFIX.getValue() + ErrorConstants.SPACE.getValue() - + ErrorMessage.INVALID_PURCHASE_AMOUNT.getMessage()); + + ErrorMessage.INVALID_LOTTO_NUMBERS_COUNT.getMessage()); } } From 8be2114229b8f6c9c2915238ed73bebbafd0ee79 Mon Sep 17 00:00:00 2001 From: gyuoo Date: Tue, 5 Nov 2024 00:23:16 +0900 Subject: [PATCH 42/79] feat(domain): add WinningNumber class --- src/main/java/lotto/domain/WinningNumber.java | 13 +++++++++++++ 1 file changed, 13 insertions(+) create mode 100644 src/main/java/lotto/domain/WinningNumber.java diff --git a/src/main/java/lotto/domain/WinningNumber.java b/src/main/java/lotto/domain/WinningNumber.java new file mode 100644 index 0000000000..59899b6ca0 --- /dev/null +++ b/src/main/java/lotto/domain/WinningNumber.java @@ -0,0 +1,13 @@ +package lotto.domain; + +import java.util.List; + +public class WinningNumber { + private final List winningNumbers; + private final int bonusNumber; + + public WinningNumber(List winningNumbers, int bonusNumber) { + this.winningNumbers = winningNumbers; + this.bonusNumber = bonusNumber; + } +} From 9744dd63a00f83a9e50fb53e3239c1d29e4290f8 Mon Sep 17 00:00:00 2001 From: gyuoo Date: Tue, 5 Nov 2024 00:35:34 +0900 Subject: [PATCH 43/79] refactor(util): seperate class for versatility --- src/main/java/lotto/util/NumberValidator.java | 18 +++++++++++++++ .../lotto/util/PurchaseAmountValidator.java | 22 +++++++------------ 2 files changed, 26 insertions(+), 14 deletions(-) create mode 100644 src/main/java/lotto/util/NumberValidator.java diff --git a/src/main/java/lotto/util/NumberValidator.java b/src/main/java/lotto/util/NumberValidator.java new file mode 100644 index 0000000000..24af8eee3d --- /dev/null +++ b/src/main/java/lotto/util/NumberValidator.java @@ -0,0 +1,18 @@ +package lotto.util; + +import lotto.exception.purchaseamountexception.InvalidPurchaseAmountException; + +public class NumberValidator { + + public int parseStringToInt(String input) { + try { + return Integer.parseInt(input); + } catch (InvalidPurchaseAmountException e) { + throw new InvalidPurchaseAmountException(); + } + } + + public boolean isNegativeNumber(int purchaseAmount) { + return purchaseAmount < 0; + } +} diff --git a/src/main/java/lotto/util/PurchaseAmountValidator.java b/src/main/java/lotto/util/PurchaseAmountValidator.java index d942e0d185..a73214ce08 100644 --- a/src/main/java/lotto/util/PurchaseAmountValidator.java +++ b/src/main/java/lotto/util/PurchaseAmountValidator.java @@ -7,9 +7,15 @@ public class PurchaseAmountValidator { + private final NumberValidator numberValidator; + + public PurchaseAmountValidator(NumberValidator numberValidator) { + this.numberValidator = numberValidator; + } + public int validateInput(String input) { - int parsedInput = parseStringToInt(input); - if (isNegativeNumber(parsedInput)) { + int parsedInput = numberValidator.parseStringToInt(input); + if (numberValidator.isNegativeNumber(parsedInput)) { throw new InvalidPurchaseAmountException(); } if (!canDivideWithPrice(parsedInput)) { @@ -21,18 +27,6 @@ public int validateInput(String input) { return parsedInput; } - private int parseStringToInt(String input) { - try { - return Integer.parseInt(input); - } catch (InvalidPurchaseAmountException e) { - throw new InvalidPurchaseAmountException(); - } - } - - private boolean isNegativeNumber(int purchaseAmount) { - return purchaseAmount < 0; - } - private boolean canDivideWithPrice(int purchaseAmount) { return purchaseAmount % LottoConstantNumbers.LOTTO_PRICE.getValue() == 0; } From 1cb0d3368504292fa5c4015d2a2ee59858be3c86 Mon Sep 17 00:00:00 2001 From: gyuoo Date: Tue, 5 Nov 2024 00:36:23 +0900 Subject: [PATCH 44/79] feat(view): update OutputView --- src/main/java/lotto/view/OutputView.java | 17 +++++++++++++++++ 1 file changed, 17 insertions(+) diff --git a/src/main/java/lotto/view/OutputView.java b/src/main/java/lotto/view/OutputView.java index ed1297ff55..f0e626ec52 100644 --- a/src/main/java/lotto/view/OutputView.java +++ b/src/main/java/lotto/view/OutputView.java @@ -1,5 +1,6 @@ package lotto.view; +import static lotto.constants.LottoConstantNumbers.*; import static lotto.exception.ErrorMessage.*; import static lotto.view.ConsoleMessage.*; @@ -25,14 +26,30 @@ public void printMaxPurchaseExceedMessage() { System.out.println(MAX_PURCHASE_EXCEED.getMessage()); } + public void printInvalidLottoNumberSizeMessage() { + System.out.println(String.format(INVALID_LOTTO_NUMBERS_COUNT.getMessage(), LOTTO_NUMBERS_COUNT)); + } + public void printPurchaseCountMessage(int purchaseCount) { System.out.println(String.format(PURCHASE_COUNT_MESSAGE.getMessage(), purchaseCount)); } + public void printOutOfRangeNumberMessage() { + System.out.println(String.format(OUT_OF_RANGE_NUMBER.getMessage(), MIN_LOTTO_NUMBER, MAX_LOTTO_NUMBER)); + } + public void printToGetWinningNumbers() { System.out.println(INPUT_WINNING_NUMBERS.getMessage()); } + public void printDuplicateNumberMessage() { + System.out.println(DUPLICATE_NUMBER.getMessage()); + } + + public void printToGetBonusNumbers() { + System.out.println(INPUT_BONUS_NUMBER.getMessage()); + } + public void printLottoList(List totalLottos) { for (Lotto lotto : totalLottos) { System.out.println(lotto.toString()); From 6660598e71b6bec00c4df68a94a88c762c992c22 Mon Sep 17 00:00:00 2001 From: gyuoo Date: Tue, 5 Nov 2024 00:41:09 +0900 Subject: [PATCH 45/79] feat(view): update InputView --- src/main/java/lotto/view/InputView.java | 54 ++++++++++++++++++++++--- 1 file changed, 49 insertions(+), 5 deletions(-) diff --git a/src/main/java/lotto/view/InputView.java b/src/main/java/lotto/view/InputView.java index 4571ac22e1..0c328c9f8e 100644 --- a/src/main/java/lotto/view/InputView.java +++ b/src/main/java/lotto/view/InputView.java @@ -1,20 +1,30 @@ package lotto.view; +import java.util.List; + import camp.nextstep.edu.missionutils.Console; -import lotto.exception.InvalidPurchaseAmountException; -import lotto.exception.MaxPurchaseExceedException; -import lotto.exception.NegativePurchaseAmountException; -import lotto.exception.NotDivisibleByLottoPriceException; +import lotto.exception.lottoticketexception.DuplicateException; +import lotto.exception.lottoticketexception.LottoNumberSizeException; +import lotto.exception.numberexception.InvalidNumberException; +import lotto.exception.numberexception.OutOfRangeNumberException; +import lotto.exception.purchaseamountexception.InvalidPurchaseAmountException; +import lotto.exception.purchaseamountexception.MaxPurchaseExceedException; +import lotto.exception.purchaseamountexception.NegativePurchaseAmountException; +import lotto.exception.purchaseamountexception.NotDivisibleByLottoPriceException; import lotto.util.PurchaseAmountValidator; +import lotto.util.WinningNumberSeparator; public class InputView { private final OutputView outputView; private final PurchaseAmountValidator purchaseAmountValidator; + private final WinningNumberSeparator winningNumberSeparator; - public InputView(OutputView outputView, PurchaseAmountValidator purchaseAmountValidator) { + public InputView(OutputView outputView, PurchaseAmountValidator purchaseAmountValidator, + WinningNumberSeparator winningNumberSeparator) { this.outputView = outputView; this.purchaseAmountValidator = purchaseAmountValidator; + this.winningNumberSeparator = winningNumberSeparator; } public String readLine() { @@ -39,4 +49,38 @@ public int getPurchaseAmount() { } } } + + public List getWinningNumbers() { + while (true) { + outputView.printToGetWinningNumbers(); + String input = readLine(); + + try { + return winningNumberSeparator.splitByComma(input); + } catch (LottoNumberSizeException e) { + outputView.printInvalidLottoNumberSizeMessage(); + } catch (OutOfRangeNumberException e) { + outputView.printOutOfRangeNumberMessage(); + } catch (DuplicateException e) { + outputView.printDuplicateNumberMessage(); + } + } + } + + public int getBonusNumber() { + while (true) { + outputView.printToGetBonusNumbers(); + String input = readLine(); + + try { + return Integer.parseInt(input); + } catch (InvalidNumberException e) { + outputView.printOutOfRangeNumberMessage(); + } catch (OutOfRangeNumberException e) { + outputView.printOutOfRangeNumberMessage(); + } catch (DuplicateException e) { + outputView.printDuplicateNumberMessage(); + } + } + } } From 231eba295808ff84ad2667bfd6d087f895feafba Mon Sep 17 00:00:00 2001 From: gyuoo Date: Tue, 5 Nov 2024 00:41:30 +0900 Subject: [PATCH 46/79] feat(exception): add InvalidNumberException --- .../numberexception/InvalidNumberException.java | 11 +++++++++++ 1 file changed, 11 insertions(+) create mode 100644 src/main/java/lotto/exception/numberexception/InvalidNumberException.java diff --git a/src/main/java/lotto/exception/numberexception/InvalidNumberException.java b/src/main/java/lotto/exception/numberexception/InvalidNumberException.java new file mode 100644 index 0000000000..a9dbad0153 --- /dev/null +++ b/src/main/java/lotto/exception/numberexception/InvalidNumberException.java @@ -0,0 +1,11 @@ +package lotto.exception.numberexception; + +import lotto.exception.ErrorConstants; +import lotto.exception.ErrorMessage; + +public class InvalidNumberException extends NumberFormatException { + public InvalidNumberException() { + super(ErrorConstants.ERROR_MESSAGE_PREFIX.getValue() + ErrorConstants.SPACE.getValue() + + ErrorMessage.OUT_OF_RANGE_NUMBER.getMessage()); + } +} From c5a9c6fadc4812bebc07eedc6c09e51e9c047b81 Mon Sep 17 00:00:00 2001 From: gyuoo Date: Tue, 5 Nov 2024 00:52:23 +0900 Subject: [PATCH 47/79] fix(exception): change exceptions to print correct values --- src/main/java/lotto/exception/ErrorMessage.java | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/src/main/java/lotto/exception/ErrorMessage.java b/src/main/java/lotto/exception/ErrorMessage.java index 4eadb35aa3..4fd40edf52 100644 --- a/src/main/java/lotto/exception/ErrorMessage.java +++ b/src/main/java/lotto/exception/ErrorMessage.java @@ -3,11 +3,11 @@ import static lotto.constants.LottoConstantNumbers.*; public enum ErrorMessage { - INVALID_PURCHASE_AMOUNT("κ΅¬μž… κΈˆμ•‘μ€ " + LOTTO_PRICE + " λ‹¨μœ„μ˜ μ–‘μ˜ μ •μˆ˜λ₯Ό μž…λ ₯ν•΄μ•Ό ν•©λ‹ˆλ‹€."), - NOT_DIVISIBLE_BY_LOTTO_PRICE("κ΅¬μž… κΈˆμ•‘μ€ " + LOTTO_PRICE + "원 λ‹¨μœ„μ—¬μ•Ό ν•©λ‹ˆλ‹€."), - MAX_PURCHASE_EXCEED("1회 μ΅œλŒ€ ꡬ맀 κ°€λŠ₯ κΈˆμ•‘μ€ " + MAX_PURCHASE_AMOUNT + "μž…λ‹ˆλ‹€."), - INVALID_LOTTO_NUMBERS_COUNT("둜또 λ²ˆν˜ΈλŠ” " + LOTTO_NUMBERS_COUNT + "κ°œμ—¬μ•Ό ν•©λ‹ˆλ‹€."), - OUT_OF_RANGE_NUMBER("둜또 λ²ˆν˜ΈλŠ” " + MIN_LOTTO_NUMBER + "λΆ€ν„°" + MAX_LOTTO_NUMBER + "κΉŒμ§€μ˜ λ²”μœ„μ—¬μ•Ό ν•©λ‹ˆλ‹€."), + INVALID_PURCHASE_AMOUNT("κ΅¬μž… κΈˆμ•‘μ€ " + LOTTO_PRICE.getValue() + " λ‹¨μœ„μ˜ μ–‘μ˜ μ •μˆ˜λ₯Ό μž…λ ₯ν•΄μ•Ό ν•©λ‹ˆλ‹€."), + NOT_DIVISIBLE_BY_LOTTO_PRICE("κ΅¬μž… κΈˆμ•‘μ€ " + LOTTO_PRICE.getValue() + "원 λ‹¨μœ„μ—¬μ•Ό ν•©λ‹ˆλ‹€."), + MAX_PURCHASE_EXCEED("1회 μ΅œλŒ€ ꡬ맀 κ°€λŠ₯ κΈˆμ•‘μ€ " + MAX_PURCHASE_AMOUNT.getValue() + "μž…λ‹ˆλ‹€."), + INVALID_LOTTO_NUMBERS_COUNT("둜또 λ²ˆν˜ΈλŠ” " + LOTTO_NUMBERS_COUNT.getValue() + "κ°œμ—¬μ•Ό ν•©λ‹ˆλ‹€."), + OUT_OF_RANGE_NUMBER("둜또 λ²ˆν˜ΈλŠ” " + MIN_LOTTO_NUMBER.getValue() + "λΆ€ν„°" + MAX_LOTTO_NUMBER.getValue() + "κΉŒμ§€μ˜ λ²”μœ„μ—¬μ•Ό ν•©λ‹ˆλ‹€."), DUPLICATE_NUMBER("λ²ˆν˜ΈλŠ” 쀑볡될 수 μ—†μŠ΅λ‹ˆλ‹€."); private final String message; From e52f01fcf088dd4381ee18525cbc503cbd60ef9b Mon Sep 17 00:00:00 2001 From: gyuoo Date: Tue, 5 Nov 2024 00:54:38 +0900 Subject: [PATCH 48/79] fix(exception): change exceptions to print correct values --- src/main/java/lotto/exception/ErrorMessage.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/main/java/lotto/exception/ErrorMessage.java b/src/main/java/lotto/exception/ErrorMessage.java index 4fd40edf52..4b1a2cea9a 100644 --- a/src/main/java/lotto/exception/ErrorMessage.java +++ b/src/main/java/lotto/exception/ErrorMessage.java @@ -17,6 +17,6 @@ public enum ErrorMessage { } public String getMessage() { - return message; + return ErrorConstants.ERROR_MESSAGE_PREFIX.getValue() + ErrorConstants.SPACE.getValue() + message; } } \ No newline at end of file From 09c960ff63f3024c53d339011ec5b5f898409656 Mon Sep 17 00:00:00 2001 From: gyuoo Date: Tue, 5 Nov 2024 00:56:47 +0900 Subject: [PATCH 49/79] fix(exception): change exceptions to print correct values --- src/main/java/lotto/util/NumberValidator.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/main/java/lotto/util/NumberValidator.java b/src/main/java/lotto/util/NumberValidator.java index 24af8eee3d..71610e5d11 100644 --- a/src/main/java/lotto/util/NumberValidator.java +++ b/src/main/java/lotto/util/NumberValidator.java @@ -7,7 +7,7 @@ public class NumberValidator { public int parseStringToInt(String input) { try { return Integer.parseInt(input); - } catch (InvalidPurchaseAmountException e) { + } catch (NumberFormatException e) { throw new InvalidPurchaseAmountException(); } } From 045166a6af9230cbf80c2281849542f1c571f262 Mon Sep 17 00:00:00 2001 From: gyuoo Date: Tue, 5 Nov 2024 01:01:48 +0900 Subject: [PATCH 50/79] docs(readme): mark checklists --- README.md | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/README.md b/README.md index 2f347a3954..8b6aecc682 100644 --- a/README.md +++ b/README.md @@ -127,14 +127,14 @@ - [x] λ²”μœ„ μ™Έμ˜ 수 μž…λ ₯ μ‹œ μ˜ˆμ™Έ λ°œμƒ - [x] 쀑볡 없이 μž…λ ₯λ˜μ—ˆλŠ”μ§€ 검증 - [x] μ€‘λ³΅λ˜μ—ˆμ„ μ‹œ μ˜ˆμ™Έ λ°œμƒ -- [ ] λ³΄λ„ˆμŠ€ 번호 μž…λ ₯ - - [ ] 1개 μž…λ ₯ λ°›μŒ - - [ ] 1~45 λ²”μœ„μ˜ μ •μˆ˜μΈμ§€ 검증 - - [ ] λ²”μœ„ μ™Έμ˜ 수 μž…λ ₯ μ‹œ μ˜ˆμ™Έ λ°œμƒ +- [x] λ³΄λ„ˆμŠ€ 번호 μž…λ ₯ + - [x] 1개 μž…λ ₯ λ°›μŒ + - [x] 1~45 λ²”μœ„μ˜ μ •μˆ˜μΈμ§€ 검증 + - [x] λ²”μœ„ μ™Έμ˜ 수 μž…λ ₯ μ‹œ μ˜ˆμ™Έ λ°œμƒ ### 2. 둜또 λ°œν–‰ -- [ ] λ°œν–‰ν•  둜또 μˆ˜λŸ‰ 계산 +- [x] λ°œν–‰ν•  둜또 μˆ˜λŸ‰ 계산 - [ ] 둜또 번호 μ„ μ • - [ ] 1~45 λ²”μœ„μ˜ μ •μˆ˜ 쀑 쀑볡 없이 λ¬΄μž‘μœ„ 6개의 숫자 - [ ] 각 λ‘œλ˜λ§ˆλ‹€ μ˜€λ¦„μ°¨μˆœμœΌλ‘œ 번호 μ •λ ¬ From a202d24816ace456b216ee96ec6317a14ab63ea3 Mon Sep 17 00:00:00 2001 From: gyuoo Date: Tue, 5 Nov 2024 01:02:20 +0900 Subject: [PATCH 51/79] feat(factory): add LottoTicketStore class --- .../java/lotto/factory/LottoTicketStore.java | 17 ++++++++++++++++- 1 file changed, 16 insertions(+), 1 deletion(-) diff --git a/src/main/java/lotto/factory/LottoTicketStore.java b/src/main/java/lotto/factory/LottoTicketStore.java index 7c8f11d82b..4daa5b1559 100644 --- a/src/main/java/lotto/factory/LottoTicketStore.java +++ b/src/main/java/lotto/factory/LottoTicketStore.java @@ -1,12 +1,27 @@ package lotto.factory; import java.util.List; +import java.util.stream.Stream; import lotto.domain.Lotto; +import lotto.util.RandomNumberGenerator; public class LottoTicketStore { - public Lotto createLottoTicket(List numbers) { + private final RandomNumberGenerator randomNumberGenerator; + + public LottoTicketStore(RandomNumberGenerator randomNumberGenerator) { + this.randomNumberGenerator = randomNumberGenerator; + } + + public Lotto createLottoTicket() { + List numbers = randomNumberGenerator.pickLottoNumbers(); return new Lotto(numbers); } + + public List createLottoTickets(int buyCount) { + return Stream.generate(this::createLottoTicket) + .limit(buyCount) + .toList(); + } } From e48472aec3b975d3d5e92fc07f7e79a5fcc6a37b Mon Sep 17 00:00:00 2001 From: gyuoo Date: Tue, 5 Nov 2024 01:02:40 +0900 Subject: [PATCH 52/79] refactor(test): formatting codes --- src/test/java/lotto/LottoTest.java | 32 ++++++++++++++++-------------- 1 file changed, 17 insertions(+), 15 deletions(-) diff --git a/src/test/java/lotto/LottoTest.java b/src/test/java/lotto/LottoTest.java index 309f4e50ae..17c15ac618 100644 --- a/src/test/java/lotto/LottoTest.java +++ b/src/test/java/lotto/LottoTest.java @@ -1,25 +1,27 @@ package lotto; -import org.junit.jupiter.api.DisplayName; -import org.junit.jupiter.api.Test; +import static org.assertj.core.api.Assertions.*; import java.util.List; -import static org.assertj.core.api.Assertions.assertThatThrownBy; +import org.junit.jupiter.api.DisplayName; +import org.junit.jupiter.api.Test; + +import lotto.domain.Lotto; class LottoTest { - @Test - void 둜또_번호의_κ°œμˆ˜κ°€_6κ°œκ°€_λ„˜μ–΄κ°€λ©΄_μ˜ˆμ™Έκ°€_λ°œμƒν•œλ‹€() { - assertThatThrownBy(() -> new Lotto(List.of(1, 2, 3, 4, 5, 6, 7))) - .isInstanceOf(IllegalArgumentException.class); - } + @Test + void 둜또_번호의_κ°œμˆ˜κ°€_6κ°œκ°€_λ„˜μ–΄κ°€λ©΄_μ˜ˆμ™Έκ°€_λ°œμƒν•œλ‹€() { + assertThatThrownBy(() -> new Lotto(List.of(1, 2, 3, 4, 5, 6, 7))) + .isInstanceOf(IllegalArgumentException.class); + } - @DisplayName("둜또 λ²ˆν˜Έμ— μ€‘λ³΅λœ μˆ«μžκ°€ 있으면 μ˜ˆμ™Έκ°€ λ°œμƒν•œλ‹€.") - @Test - void 둜또_λ²ˆν˜Έμ—_μ€‘λ³΅λœ_μˆ«μžκ°€_있으면_μ˜ˆμ™Έκ°€_λ°œμƒν•œλ‹€() { - assertThatThrownBy(() -> new Lotto(List.of(1, 2, 3, 4, 5, 5))) - .isInstanceOf(IllegalArgumentException.class); - } + @DisplayName("둜또 λ²ˆν˜Έμ— μ€‘λ³΅λœ μˆ«μžκ°€ 있으면 μ˜ˆμ™Έκ°€ λ°œμƒν•œλ‹€.") + @Test + void 둜또_λ²ˆν˜Έμ—_μ€‘λ³΅λœ_μˆ«μžκ°€_있으면_μ˜ˆμ™Έκ°€_λ°œμƒν•œλ‹€() { + assertThatThrownBy(() -> new Lotto(List.of(1, 2, 3, 4, 5, 5))) + .isInstanceOf(IllegalArgumentException.class); + } - // TODO: μΆ”κ°€ κΈ°λŠ₯ κ΅¬ν˜„μ— λ”°λ₯Έ ν…ŒμŠ€νŠΈ μ½”λ“œ μž‘μ„± + // TODO: μΆ”κ°€ κΈ°λŠ₯ κ΅¬ν˜„μ— λ”°λ₯Έ ν…ŒμŠ€νŠΈ μ½”λ“œ μž‘μ„± } From a9b46c414813ebf0ecf10376e98618cfbd0d3155 Mon Sep 17 00:00:00 2001 From: gyuoo Date: Tue, 5 Nov 2024 01:04:28 +0900 Subject: [PATCH 53/79] feat(service): add LottoPurchaseService class --- .../lotto/service/LottoPurchaseService.java | 32 +++++++++++++++++++ 1 file changed, 32 insertions(+) create mode 100644 src/main/java/lotto/service/LottoPurchaseService.java diff --git a/src/main/java/lotto/service/LottoPurchaseService.java b/src/main/java/lotto/service/LottoPurchaseService.java new file mode 100644 index 0000000000..508d9c823a --- /dev/null +++ b/src/main/java/lotto/service/LottoPurchaseService.java @@ -0,0 +1,32 @@ +package lotto.service; + +import static lotto.constants.LottoConstantNumbers.*; + +import java.util.List; + +import lotto.domain.Lotto; +import lotto.factory.LottoTicketStore; +import lotto.view.InputView; +import lotto.view.OutputView; + +public class LottoPurchaseService { + + private final InputView inputView; + private final OutputView outputView; + private final LottoTicketStore lottoTicketStore; + + public LottoPurchaseService(InputView inputView, OutputView outputView, LottoTicketStore lottoTicketStore) { + this.inputView = inputView; + this.outputView = outputView; + this.lottoTicketStore = lottoTicketStore; + } + + public void buyLottos() { + int purchaseAmount = inputView.getPurchaseAmount(); + int purchaseCount = purchaseAmount / LOTTO_PRICE.getValue(); + + outputView.printPurchaseCountMessage(purchaseCount); + List lottos = lottoTicketStore.createLottoTickets(purchaseCount); + outputView.printLottoList(lottos); + } +} From 84f1f2a1bc3b10d6088eacbc3ef8145ef9923d76 Mon Sep 17 00:00:00 2001 From: gyuoo Date: Tue, 5 Nov 2024 01:08:52 +0900 Subject: [PATCH 54/79] feat(controller): update LottoController class --- .../java/lotto/controller/LottoController.java | 18 ++++++++++++++++++ 1 file changed, 18 insertions(+) create mode 100644 src/main/java/lotto/controller/LottoController.java diff --git a/src/main/java/lotto/controller/LottoController.java b/src/main/java/lotto/controller/LottoController.java new file mode 100644 index 0000000000..96f8122b2a --- /dev/null +++ b/src/main/java/lotto/controller/LottoController.java @@ -0,0 +1,18 @@ +package lotto.controller; + +import lotto.service.LottoGameService; +import lotto.service.LottoPurchaseService; + +public class LottoController { + private final LottoGameService lottoGameService; + private final LottoPurchaseService lottoPurchaseService; + + public LottoController(LottoGameService lottoGameService, LottoPurchaseService lottoPurchaseService) { + this.lottoGameService = lottoGameService; + this.lottoPurchaseService = lottoPurchaseService; + } + + public void play() { + lottoPurchaseService.buyLottos(); + } +} From bdf826f1280e54ae880c69a5a15104e06bf09b7f Mon Sep 17 00:00:00 2001 From: gyuoo Date: Tue, 5 Nov 2024 01:09:13 +0900 Subject: [PATCH 55/79] fix(factory): add sorting logic --- src/main/java/lotto/factory/LottoTicketStore.java | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/src/main/java/lotto/factory/LottoTicketStore.java b/src/main/java/lotto/factory/LottoTicketStore.java index 4daa5b1559..60ab9a0af6 100644 --- a/src/main/java/lotto/factory/LottoTicketStore.java +++ b/src/main/java/lotto/factory/LottoTicketStore.java @@ -4,18 +4,22 @@ import java.util.stream.Stream; import lotto.domain.Lotto; +import lotto.util.LottoNumberSorter; import lotto.util.RandomNumberGenerator; public class LottoTicketStore { private final RandomNumberGenerator randomNumberGenerator; + private final LottoNumberSorter lottoNumberSorter; - public LottoTicketStore(RandomNumberGenerator randomNumberGenerator) { + public LottoTicketStore(RandomNumberGenerator randomNumberGenerator, LottoNumberSorter lottoNumberSorter) { this.randomNumberGenerator = randomNumberGenerator; + this.lottoNumberSorter = lottoNumberSorter; } public Lotto createLottoTicket() { List numbers = randomNumberGenerator.pickLottoNumbers(); + lottoNumberSorter.sortInAscendingOrder(numbers); return new Lotto(numbers); } From add95e466ff9f93685da7efc2a421aa8913673a9 Mon Sep 17 00:00:00 2001 From: gyuoo Date: Tue, 5 Nov 2024 01:12:29 +0900 Subject: [PATCH 56/79] docs(readme): mark checklists --- README.md | 14 +++++++------- 1 file changed, 7 insertions(+), 7 deletions(-) diff --git a/README.md b/README.md index 8b6aecc682..18ccb99c1d 100644 --- a/README.md +++ b/README.md @@ -135,13 +135,13 @@ ### 2. 둜또 λ°œν–‰ - [x] λ°œν–‰ν•  둜또 μˆ˜λŸ‰ 계산 -- [ ] 둜또 번호 μ„ μ • - - [ ] 1~45 λ²”μœ„μ˜ μ •μˆ˜ 쀑 쀑볡 없이 λ¬΄μž‘μœ„ 6개의 숫자 - - [ ] 각 λ‘œλ˜λ§ˆλ‹€ μ˜€λ¦„μ°¨μˆœμœΌλ‘œ 번호 μ •λ ¬ -- [ ] 둜또 리슀트 생성 - - [ ] κ΅¬μž… κΈˆμ•‘μ— 따라 κ³„μ‚°λœ 수만큼의 둜또 생성 - - [ ] λ¦¬μŠ€νŠΈμ— μ €μž₯ - - [ ] μƒμ„±λœ 둜또 리슀트λ₯Ό ν˜•μ‹μ— 맞게 좜λ ₯ +- [x] 둜또 번호 μ„ μ • + - [x] 1~45 λ²”μœ„μ˜ μ •μˆ˜ 쀑 쀑볡 없이 λ¬΄μž‘μœ„ 6개의 숫자 + - [x] 각 λ‘œλ˜λ§ˆλ‹€ μ˜€λ¦„μ°¨μˆœμœΌλ‘œ 번호 μ •λ ¬ +- [x] 둜또 리슀트 생성 + - [x] κ΅¬μž… κΈˆμ•‘μ— 따라 κ³„μ‚°λœ 수만큼의 둜또 생성 + - [x] λ¦¬μŠ€νŠΈμ— μ €μž₯ + - [x] μƒμ„±λœ 둜또 리슀트λ₯Ό ν˜•μ‹μ— 맞게 좜λ ₯ ### 3. 당첨 κ²°κ³Ό 계산 From ad41f5e857d63e9e4df08b7ef1cd37194f9360bd Mon Sep 17 00:00:00 2001 From: gyuoo Date: Tue, 5 Nov 2024 01:20:43 +0900 Subject: [PATCH 57/79] feat(domain): add LottoResult class --- src/main/java/lotto/domain/LottoResult.java | 27 +++++++++++++++++++++ 1 file changed, 27 insertions(+) create mode 100644 src/main/java/lotto/domain/LottoResult.java diff --git a/src/main/java/lotto/domain/LottoResult.java b/src/main/java/lotto/domain/LottoResult.java new file mode 100644 index 0000000000..51d181ad00 --- /dev/null +++ b/src/main/java/lotto/domain/LottoResult.java @@ -0,0 +1,27 @@ +package lotto.domain; + +import java.util.EnumMap; +import java.util.Map; + +public class LottoResult { + private final Map prizeCountMap; + + public LottoResult() { + prizeCountMap = new EnumMap<>(Prize.class); + for (Prize prize : Prize.values()) { + prizeCountMap.put(prize, 0); + } + } + + public void addPrize(Prize prize) { + prizeCountMap.put(prize, prizeCountMap.get(prize) + 1); + } + + public int getPrizeCount(Prize prize) { + return prizeCountMap.get(prize); + } + + public Map getPrizeCountMap() { + return prizeCountMap; + } +} From 0dcda774e137fdda37ea38e537a2b071fa782db7 Mon Sep 17 00:00:00 2001 From: gyuoo Date: Tue, 5 Nov 2024 01:21:16 +0900 Subject: [PATCH 58/79] fix(service): change return type --- src/main/java/lotto/service/LottoPurchaseService.java | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/src/main/java/lotto/service/LottoPurchaseService.java b/src/main/java/lotto/service/LottoPurchaseService.java index 508d9c823a..cbfbdd3adb 100644 --- a/src/main/java/lotto/service/LottoPurchaseService.java +++ b/src/main/java/lotto/service/LottoPurchaseService.java @@ -21,12 +21,14 @@ public LottoPurchaseService(InputView inputView, OutputView outputView, LottoTic this.lottoTicketStore = lottoTicketStore; } - public void buyLottos() { + public List buyLottos() { int purchaseAmount = inputView.getPurchaseAmount(); int purchaseCount = purchaseAmount / LOTTO_PRICE.getValue(); outputView.printPurchaseCountMessage(purchaseCount); List lottos = lottoTicketStore.createLottoTickets(purchaseCount); outputView.printLottoList(lottos); + + return lottos; } } From b8230eac9b1f08208b730450c2589182c8110cc9 Mon Sep 17 00:00:00 2001 From: gyuoo Date: Tue, 5 Nov 2024 01:21:39 +0900 Subject: [PATCH 59/79] feat(controller): update lotto playing method --- src/main/java/lotto/controller/LottoController.java | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/src/main/java/lotto/controller/LottoController.java b/src/main/java/lotto/controller/LottoController.java index 96f8122b2a..7896789583 100644 --- a/src/main/java/lotto/controller/LottoController.java +++ b/src/main/java/lotto/controller/LottoController.java @@ -1,5 +1,9 @@ package lotto.controller; +import java.util.List; + +import lotto.domain.Lotto; +import lotto.domain.LottoResult; import lotto.service.LottoGameService; import lotto.service.LottoPurchaseService; @@ -13,6 +17,7 @@ public LottoController(LottoGameService lottoGameService, LottoPurchaseService l } public void play() { - lottoPurchaseService.buyLottos(); + List lottos = lottoPurchaseService.buyLottos(); + LottoResult lottoResult = lottoGameService.playLottoGame(lottos); } } From 5addac69150e18240ed2afbabd83895c9ccf3046 Mon Sep 17 00:00:00 2001 From: gyuoo Date: Tue, 5 Nov 2024 01:22:08 +0900 Subject: [PATCH 60/79] feat(domain): add getter for lotto entity --- src/main/java/lotto/domain/Lotto.java | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/src/main/java/lotto/domain/Lotto.java b/src/main/java/lotto/domain/Lotto.java index 8211df923f..e6876278fe 100644 --- a/src/main/java/lotto/domain/Lotto.java +++ b/src/main/java/lotto/domain/Lotto.java @@ -46,4 +46,8 @@ private void validateNoDuplicates(List numbers) { public String toString() { return numbers.toString(); } + + public List getNumbers() { + return numbers; + } } From 12ba4baaaa6485ff4e1f4f43407851102b68c18c Mon Sep 17 00:00:00 2001 From: gyuoo Date: Tue, 5 Nov 2024 01:22:27 +0900 Subject: [PATCH 61/79] feat(service): add LottoGameService class --- .../java/lotto/service/LottoGameService.java | 39 +++++++++++++++++++ 1 file changed, 39 insertions(+) create mode 100644 src/main/java/lotto/service/LottoGameService.java diff --git a/src/main/java/lotto/service/LottoGameService.java b/src/main/java/lotto/service/LottoGameService.java new file mode 100644 index 0000000000..812e0943f3 --- /dev/null +++ b/src/main/java/lotto/service/LottoGameService.java @@ -0,0 +1,39 @@ +package lotto.service; + +import java.util.List; + +import lotto.domain.Lotto; +import lotto.domain.LottoResult; +import lotto.domain.Prize; +import lotto.view.InputView; + +public class LottoGameService { + private final InputView inputView; + + public LottoGameService(InputView inputView) { + this.inputView = inputView; + } + + public LottoResult playLottoGame(List lottos) { + List winningNumbers = inputView.getWinningNumbers(); + int bonusNumber = inputView.getBonusNumber(); + + LottoResult lottoResult = new LottoResult(); + + for (Lotto lotto : lottos) { + Prize prize = getPrize(lotto, winningNumbers, bonusNumber); + lottoResult.addPrize(prize); + } + + return lottoResult; + } + + private Prize getPrize(Lotto lotto, List winningNumbers, int bonusNumber) { + long matchCount = lotto.getNumbers().stream() + .filter(winningNumbers::contains) + .count(); + boolean matchBonus = lotto.getNumbers().contains(bonusNumber); + + return Prize.findPrize((int)matchCount, matchBonus); + } +} From 202ed9198db500de628133ae507be0abb6631e0c Mon Sep 17 00:00:00 2001 From: gyuoo Date: Tue, 5 Nov 2024 01:22:59 +0900 Subject: [PATCH 62/79] feat(domain): update Prize enum --- src/main/java/lotto/domain/Prize.java | 9 +++++++++ 1 file changed, 9 insertions(+) diff --git a/src/main/java/lotto/domain/Prize.java b/src/main/java/lotto/domain/Prize.java index 6b91131c5d..d448902aa9 100644 --- a/src/main/java/lotto/domain/Prize.java +++ b/src/main/java/lotto/domain/Prize.java @@ -1,5 +1,7 @@ package lotto.domain; +import java.util.Arrays; + public enum Prize { FIRST(6, false, 2_000_000_000), SECOND(5, true, 30_000_000), @@ -21,4 +23,11 @@ public enum Prize { public int getPrizeAmount() { return prizeAmount; } + + public static Prize findPrize(int matchCount, boolean matchBonus) { + return Arrays.stream(values()) + .filter(prize -> prize.matchCount == matchCount && prize.matchBonus == matchBonus) + .findFirst() + .orElse(NONE); + } } From 5e543c6b13ea12f43dab45f25698e727c9508774 Mon Sep 17 00:00:00 2001 From: gyuoo Date: Tue, 5 Nov 2024 01:25:48 +0900 Subject: [PATCH 63/79] refactor(exception): add white space for error message --- src/main/java/lotto/exception/ErrorMessage.java | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/src/main/java/lotto/exception/ErrorMessage.java b/src/main/java/lotto/exception/ErrorMessage.java index 4b1a2cea9a..0d417cb662 100644 --- a/src/main/java/lotto/exception/ErrorMessage.java +++ b/src/main/java/lotto/exception/ErrorMessage.java @@ -7,7 +7,8 @@ public enum ErrorMessage { NOT_DIVISIBLE_BY_LOTTO_PRICE("κ΅¬μž… κΈˆμ•‘μ€ " + LOTTO_PRICE.getValue() + "원 λ‹¨μœ„μ—¬μ•Ό ν•©λ‹ˆλ‹€."), MAX_PURCHASE_EXCEED("1회 μ΅œλŒ€ ꡬ맀 κ°€λŠ₯ κΈˆμ•‘μ€ " + MAX_PURCHASE_AMOUNT.getValue() + "μž…λ‹ˆλ‹€."), INVALID_LOTTO_NUMBERS_COUNT("둜또 λ²ˆν˜ΈλŠ” " + LOTTO_NUMBERS_COUNT.getValue() + "κ°œμ—¬μ•Ό ν•©λ‹ˆλ‹€."), - OUT_OF_RANGE_NUMBER("둜또 λ²ˆν˜ΈλŠ” " + MIN_LOTTO_NUMBER.getValue() + "λΆ€ν„°" + MAX_LOTTO_NUMBER.getValue() + "κΉŒμ§€μ˜ λ²”μœ„μ—¬μ•Ό ν•©λ‹ˆλ‹€."), + OUT_OF_RANGE_NUMBER( + "둜또 λ²ˆν˜ΈλŠ” " + MIN_LOTTO_NUMBER.getValue() + "λΆ€ν„° " + MAX_LOTTO_NUMBER.getValue() + "κΉŒμ§€μ˜ λ²”μœ„μ—¬μ•Ό ν•©λ‹ˆλ‹€."), DUPLICATE_NUMBER("λ²ˆν˜ΈλŠ” 쀑볡될 수 μ—†μŠ΅λ‹ˆλ‹€."); private final String message; From d6fdf4942b8fd5f09b911dd6a4d60d4ed2301456 Mon Sep 17 00:00:00 2001 From: gyuoo Date: Tue, 5 Nov 2024 01:28:03 +0900 Subject: [PATCH 64/79] feat(util): add DuplicateValidator class --- .../java/lotto/util/DuplicateValidator.java | 17 +++++++++++++++++ 1 file changed, 17 insertions(+) create mode 100644 src/main/java/lotto/util/DuplicateValidator.java diff --git a/src/main/java/lotto/util/DuplicateValidator.java b/src/main/java/lotto/util/DuplicateValidator.java new file mode 100644 index 0000000000..eee7a168a0 --- /dev/null +++ b/src/main/java/lotto/util/DuplicateValidator.java @@ -0,0 +1,17 @@ +package lotto.util; + +import java.util.HashSet; +import java.util.List; +import java.util.Set; + +import lotto.exception.lottoticketexception.DuplicateException; + +public class DuplicateValidator { + public static void validateNoDuplicates(List numbers) { + Set uniqueNumbers = new HashSet<>(numbers); + + if (uniqueNumbers.size() != numbers.size()) { + throw new DuplicateException(); + } + } +} From 85f6555ad948bf3b433fd03d330d2f720a821d43 Mon Sep 17 00:00:00 2001 From: gyuoo Date: Tue, 5 Nov 2024 01:37:20 +0900 Subject: [PATCH 65/79] feat(util): add validation to ensure bonus number does not overlap with winning numbers --- src/main/java/lotto/util/DuplicateValidator.java | 9 ++++++++- 1 file changed, 8 insertions(+), 1 deletion(-) diff --git a/src/main/java/lotto/util/DuplicateValidator.java b/src/main/java/lotto/util/DuplicateValidator.java index eee7a168a0..08c4b15587 100644 --- a/src/main/java/lotto/util/DuplicateValidator.java +++ b/src/main/java/lotto/util/DuplicateValidator.java @@ -7,11 +7,18 @@ import lotto.exception.lottoticketexception.DuplicateException; public class DuplicateValidator { - public static void validateNoDuplicates(List numbers) { + public List validateNoDuplicates(List numbers) { Set uniqueNumbers = new HashSet<>(numbers); if (uniqueNumbers.size() != numbers.size()) { throw new DuplicateException(); } + return uniqueNumbers.stream().toList(); + } + + public void validateNoOverlapWithWinningNumbers(int bonusNumber, List winningNumbers) { + if (winningNumbers.contains(bonusNumber)) { + throw new DuplicateException(); + } } } From 1121ef10ecd68721a400f46ba90f4765187e99b7 Mon Sep 17 00:00:00 2001 From: gyuoo Date: Tue, 5 Nov 2024 01:37:39 +0900 Subject: [PATCH 66/79] refactor(view): update InputView class --- src/main/java/lotto/view/InputView.java | 20 +++++++++++++------- 1 file changed, 13 insertions(+), 7 deletions(-) diff --git a/src/main/java/lotto/view/InputView.java b/src/main/java/lotto/view/InputView.java index 0c328c9f8e..5381bab31e 100644 --- a/src/main/java/lotto/view/InputView.java +++ b/src/main/java/lotto/view/InputView.java @@ -5,12 +5,12 @@ import camp.nextstep.edu.missionutils.Console; import lotto.exception.lottoticketexception.DuplicateException; import lotto.exception.lottoticketexception.LottoNumberSizeException; -import lotto.exception.numberexception.InvalidNumberException; import lotto.exception.numberexception.OutOfRangeNumberException; import lotto.exception.purchaseamountexception.InvalidPurchaseAmountException; import lotto.exception.purchaseamountexception.MaxPurchaseExceedException; import lotto.exception.purchaseamountexception.NegativePurchaseAmountException; import lotto.exception.purchaseamountexception.NotDivisibleByLottoPriceException; +import lotto.util.DuplicateValidator; import lotto.util.PurchaseAmountValidator; import lotto.util.WinningNumberSeparator; @@ -19,12 +19,14 @@ public class InputView { private final OutputView outputView; private final PurchaseAmountValidator purchaseAmountValidator; private final WinningNumberSeparator winningNumberSeparator; + private final DuplicateValidator duplicateValidator; public InputView(OutputView outputView, PurchaseAmountValidator purchaseAmountValidator, - WinningNumberSeparator winningNumberSeparator) { + WinningNumberSeparator winningNumberSeparator, DuplicateValidator duplicateValidator) { this.outputView = outputView; this.purchaseAmountValidator = purchaseAmountValidator; this.winningNumberSeparator = winningNumberSeparator; + this.duplicateValidator = duplicateValidator; } public String readLine() { @@ -54,9 +56,11 @@ public List getWinningNumbers() { while (true) { outputView.printToGetWinningNumbers(); String input = readLine(); - + List numbers = winningNumberSeparator.splitByComma(input); try { - return winningNumberSeparator.splitByComma(input); + return duplicateValidator.validateNoDuplicates(numbers); + } catch (NumberFormatException e) { + outputView.printOutOfRangeNumberMessage(); } catch (LottoNumberSizeException e) { outputView.printInvalidLottoNumberSizeMessage(); } catch (OutOfRangeNumberException e) { @@ -67,14 +71,16 @@ public List getWinningNumbers() { } } - public int getBonusNumber() { + public int getBonusNumber(List winningNumbers) { while (true) { outputView.printToGetBonusNumbers(); String input = readLine(); try { - return Integer.parseInt(input); - } catch (InvalidNumberException e) { + int bonusNumber = Integer.parseInt(input); + duplicateValidator.validateNoOverlapWithWinningNumbers(bonusNumber, winningNumbers); + return bonusNumber; + } catch (NumberFormatException e) { outputView.printOutOfRangeNumberMessage(); } catch (OutOfRangeNumberException e) { outputView.printOutOfRangeNumberMessage(); From 6524cd251e4a13e0e50285ff0b4b56ca5bb32c9b Mon Sep 17 00:00:00 2001 From: gyuoo Date: Tue, 5 Nov 2024 01:37:58 +0900 Subject: [PATCH 67/79] refactor(service): update LottoGameService class --- src/main/java/lotto/service/LottoGameService.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/main/java/lotto/service/LottoGameService.java b/src/main/java/lotto/service/LottoGameService.java index 812e0943f3..7832c46174 100644 --- a/src/main/java/lotto/service/LottoGameService.java +++ b/src/main/java/lotto/service/LottoGameService.java @@ -16,7 +16,7 @@ public LottoGameService(InputView inputView) { public LottoResult playLottoGame(List lottos) { List winningNumbers = inputView.getWinningNumbers(); - int bonusNumber = inputView.getBonusNumber(); + int bonusNumber = inputView.getBonusNumber(winningNumbers); LottoResult lottoResult = new LottoResult(); From 3bf9b523184b9ea605322e82ceb5c7587b4298a3 Mon Sep 17 00:00:00 2001 From: gyuoo Date: Tue, 5 Nov 2024 01:39:42 +0900 Subject: [PATCH 68/79] feat(domain): add getter for WinningNumber class --- src/main/java/lotto/domain/WinningNumber.java | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/src/main/java/lotto/domain/WinningNumber.java b/src/main/java/lotto/domain/WinningNumber.java index 59899b6ca0..54028a3d09 100644 --- a/src/main/java/lotto/domain/WinningNumber.java +++ b/src/main/java/lotto/domain/WinningNumber.java @@ -10,4 +10,12 @@ public WinningNumber(List winningNumbers, int bonusNumber) { this.winningNumbers = winningNumbers; this.bonusNumber = bonusNumber; } + + public List getWinningNumbers() { + return winningNumbers; + } + + public int getBonusNumber() { + return bonusNumber; + } } From 7a45bd5d8191991df89a4a4b6a36a9a24d0ccb2a Mon Sep 17 00:00:00 2001 From: gyuoo Date: Tue, 5 Nov 2024 02:08:54 +0900 Subject: [PATCH 69/79] feat(controller): add logic for all lotto games --- .../java/lotto/controller/LottoController.java | 14 +++++++++++--- 1 file changed, 11 insertions(+), 3 deletions(-) diff --git a/src/main/java/lotto/controller/LottoController.java b/src/main/java/lotto/controller/LottoController.java index 7896789583..883bccab36 100644 --- a/src/main/java/lotto/controller/LottoController.java +++ b/src/main/java/lotto/controller/LottoController.java @@ -4,20 +4,28 @@ import lotto.domain.Lotto; import lotto.domain.LottoResult; +import lotto.domain.WinningNumber; import lotto.service.LottoGameService; import lotto.service.LottoPurchaseService; +import lotto.service.LottoStatisticsService; public class LottoController { private final LottoGameService lottoGameService; private final LottoPurchaseService lottoPurchaseService; + private final LottoStatisticsService lottoStatisticsService; - public LottoController(LottoGameService lottoGameService, LottoPurchaseService lottoPurchaseService) { + public LottoController(LottoGameService lottoGameService, LottoPurchaseService lottoPurchaseService, + LottoStatisticsService lottoStatisticsService) { this.lottoGameService = lottoGameService; this.lottoPurchaseService = lottoPurchaseService; + this.lottoStatisticsService = lottoStatisticsService; } public void play() { - List lottos = lottoPurchaseService.buyLottos(); - LottoResult lottoResult = lottoGameService.playLottoGame(lottos); + int purchaseAmount = lottoPurchaseService.purchaseForLottos(); + List lottos = lottoPurchaseService.buyLottos(purchaseAmount); + WinningNumber winningNumber = lottoGameService.setWinningNumber(); + LottoResult lottoResult = lottoGameService.playLottoGame(lottos, winningNumber); + lottoStatisticsService.summarizeStatistics(purchaseAmount, lottos, winningNumber); } } From 623eb63b8a45f9c799eb43484f36bf7ee350bfcd Mon Sep 17 00:00:00 2001 From: gyuoo Date: Tue, 5 Nov 2024 02:09:07 +0900 Subject: [PATCH 70/79] feat(util): add LottoResultCalculator class --- .../lotto/service/LottoResultCalculator.java | 39 +++++++++++++++++++ 1 file changed, 39 insertions(+) create mode 100644 src/main/java/lotto/service/LottoResultCalculator.java diff --git a/src/main/java/lotto/service/LottoResultCalculator.java b/src/main/java/lotto/service/LottoResultCalculator.java new file mode 100644 index 0000000000..3bb964073f --- /dev/null +++ b/src/main/java/lotto/service/LottoResultCalculator.java @@ -0,0 +1,39 @@ +package lotto.service; + +import java.util.HashMap; +import java.util.List; +import java.util.Map; + +import lotto.domain.Lotto; +import lotto.domain.Prize; +import lotto.domain.WinningNumber; + +public class LottoResultCalculator { + + public Map calculateResults(List lottos, WinningNumber winningNumber) { + Map prizeCountMap = initializePrizeCount(); + + for (Lotto lotto : lottos) { + int matchCount = getMatchCount(lotto.getNumbers(), winningNumber.getWinningNumbers()); + boolean hasBonus = lotto.getNumbers().contains(winningNumber.getBonusNumber()); + Prize prize = Prize.findPrize(matchCount, hasBonus); + prizeCountMap.put(prize, prizeCountMap.get(prize) + 1); + } + + return prizeCountMap; + } + + private Map initializePrizeCount() { + Map prizeCountMap = new HashMap<>(); + for (Prize prize : Prize.values()) { + prizeCountMap.put(prize, 0); + } + return prizeCountMap; + } + + private int getMatchCount(List lottoNumbers, List winningNumbers) { + return (int)lottoNumbers.stream() + .filter(winningNumbers::contains) + .count(); + } +} From f0fe0c4f9e2ffa5e73081dc8ec821c7cf9670347 Mon Sep 17 00:00:00 2001 From: gyuoo Date: Tue, 5 Nov 2024 02:09:18 +0900 Subject: [PATCH 71/79] feat(service): add LottoStatisticsService class --- .../lotto/service/LottoStatisticsService.java | 38 +++++++++++++++++++ 1 file changed, 38 insertions(+) create mode 100644 src/main/java/lotto/service/LottoStatisticsService.java diff --git a/src/main/java/lotto/service/LottoStatisticsService.java b/src/main/java/lotto/service/LottoStatisticsService.java new file mode 100644 index 0000000000..4ff0563e9d --- /dev/null +++ b/src/main/java/lotto/service/LottoStatisticsService.java @@ -0,0 +1,38 @@ +package lotto.service; + +import java.util.List; +import java.util.Map; + +import lotto.domain.Lotto; +import lotto.domain.Prize; +import lotto.domain.WinningNumber; +import lotto.view.OutputView; + +public class LottoStatisticsService { + private final LottoResultCalculator lottoResultCalculator; + private final OutputView outputView; + + public LottoStatisticsService(LottoResultCalculator lottoResultCalculator, OutputView outputView) { + this.lottoResultCalculator = lottoResultCalculator; + this.outputView = outputView; + } + + public void summarizeStatistics(int purchaseAmount, List lottos, WinningNumber winningNumber) { + Map prizeCounts = lottoResultCalculator.calculateResults(lottos, winningNumber); + outputView.printPrizeStatistics(prizeCounts); + + long totalEarnings = calculateTotalEarnings(prizeCounts); + double totalYield = calculateTotalYield(purchaseAmount, totalEarnings); + outputView.printTotalYield(totalYield); + } + + private long calculateTotalEarnings(Map prizeCounts) { + return prizeCounts.entrySet().stream() + .mapToLong(entry -> (long)entry.getKey().getPrizeAmount() * entry.getValue()) + .sum(); + } + + private double calculateTotalYield(int purchaseAmount, long totalEarnings) { + return (double)totalEarnings / purchaseAmount * 100; + } +} From ab41dbaadd511f71e1629c1e2cf2cd9dc8c872b0 Mon Sep 17 00:00:00 2001 From: gyuoo Date: Tue, 5 Nov 2024 02:09:31 +0900 Subject: [PATCH 72/79] refactor(service): seperate method --- src/main/java/lotto/service/LottoPurchaseService.java | 7 +++++-- 1 file changed, 5 insertions(+), 2 deletions(-) diff --git a/src/main/java/lotto/service/LottoPurchaseService.java b/src/main/java/lotto/service/LottoPurchaseService.java index cbfbdd3adb..221e449ab7 100644 --- a/src/main/java/lotto/service/LottoPurchaseService.java +++ b/src/main/java/lotto/service/LottoPurchaseService.java @@ -21,8 +21,11 @@ public LottoPurchaseService(InputView inputView, OutputView outputView, LottoTic this.lottoTicketStore = lottoTicketStore; } - public List buyLottos() { - int purchaseAmount = inputView.getPurchaseAmount(); + public int purchaseForLottos() { + return inputView.getPurchaseAmount(); + } + + public List buyLottos(int purchaseAmount) { int purchaseCount = purchaseAmount / LOTTO_PRICE.getValue(); outputView.printPurchaseCountMessage(purchaseCount); From 22680657969643886eb45112fd60e83c5c10a90a Mon Sep 17 00:00:00 2001 From: gyuoo Date: Tue, 5 Nov 2024 02:09:41 +0900 Subject: [PATCH 73/79] refactor(service): seperate method --- src/main/java/lotto/service/LottoGameService.java | 9 +++++++-- 1 file changed, 7 insertions(+), 2 deletions(-) diff --git a/src/main/java/lotto/service/LottoGameService.java b/src/main/java/lotto/service/LottoGameService.java index 7832c46174..88f353d5d4 100644 --- a/src/main/java/lotto/service/LottoGameService.java +++ b/src/main/java/lotto/service/LottoGameService.java @@ -5,6 +5,7 @@ import lotto.domain.Lotto; import lotto.domain.LottoResult; import lotto.domain.Prize; +import lotto.domain.WinningNumber; import lotto.view.InputView; public class LottoGameService { @@ -14,14 +15,18 @@ public LottoGameService(InputView inputView) { this.inputView = inputView; } - public LottoResult playLottoGame(List lottos) { + public WinningNumber setWinningNumber() { List winningNumbers = inputView.getWinningNumbers(); int bonusNumber = inputView.getBonusNumber(winningNumbers); + return new WinningNumber(winningNumbers, bonusNumber); + } + + public LottoResult playLottoGame(List lottos, WinningNumber winningNumber) { LottoResult lottoResult = new LottoResult(); for (Lotto lotto : lottos) { - Prize prize = getPrize(lotto, winningNumbers, bonusNumber); + Prize prize = getPrize(lotto, winningNumber.getWinningNumbers(), winningNumber.getBonusNumber()); lottoResult.addPrize(prize); } From 6af6985e7593f926d083bfe6c5c8efad66faf36a Mon Sep 17 00:00:00 2001 From: gyuoo Date: Tue, 5 Nov 2024 02:09:58 +0900 Subject: [PATCH 74/79] feat(view): update OutputView class --- src/main/java/lotto/view/OutputView.java | 25 ++++++++++++++++++++++++ 1 file changed, 25 insertions(+) diff --git a/src/main/java/lotto/view/OutputView.java b/src/main/java/lotto/view/OutputView.java index f0e626ec52..6b2106cba1 100644 --- a/src/main/java/lotto/view/OutputView.java +++ b/src/main/java/lotto/view/OutputView.java @@ -5,8 +5,10 @@ import static lotto.view.ConsoleMessage.*; import java.util.List; +import java.util.Map; import lotto.domain.Lotto; +import lotto.domain.Prize; public class OutputView { @@ -55,4 +57,27 @@ public void printLottoList(List totalLottos) { System.out.println(lotto.toString()); } } + + public void printPrizeStatistics(Map prizeCounts) { + StringBuilder statisticBuilder = new StringBuilder(); + statisticBuilder.append(WINNING_STATISTICS.getMessage()) + .append('\n') + .append(DIVIDER.getMessage()) + .append('\n') + .append(String.format(ConsoleMessage.MATCH_3.getMessage(), prizeCounts.get(Prize.FIFTH))) + .append('\n') + .append(String.format(ConsoleMessage.MATCH_4.getMessage(), prizeCounts.get(Prize.FOURTH))) + .append('\n') + .append(String.format(ConsoleMessage.MATCH_5.getMessage(), prizeCounts.get(Prize.THIRD))) + .append('\n') + .append(String.format(ConsoleMessage.MATCH_5_BONUS.getMessage(), prizeCounts.get(Prize.SECOND))) + .append('\n') + .append(String.format(ConsoleMessage.MATCH_6.getMessage(), prizeCounts.get(Prize.FIRST))) + .append('\n'); + System.out.println(statisticBuilder); + } + + public void printTotalYield(double yield) { + System.out.println(String.format(TOTAL_YIELD.getMessage(), yield)); + } } From 29ba68a2e0bc5bed511a7e927bec18a81e03be99 Mon Sep 17 00:00:00 2001 From: gyuoo Date: Tue, 5 Nov 2024 02:10:34 +0900 Subject: [PATCH 75/79] feat(application): update Application to run the lotto game --- src/main/java/lotto/Application.java | 41 ++++++++++++++++++++++++++-- 1 file changed, 38 insertions(+), 3 deletions(-) diff --git a/src/main/java/lotto/Application.java b/src/main/java/lotto/Application.java index d190922ba4..f9c2e1a513 100644 --- a/src/main/java/lotto/Application.java +++ b/src/main/java/lotto/Application.java @@ -1,7 +1,42 @@ package lotto; +import lotto.controller.LottoController; +import lotto.factory.LottoTicketStore; +import lotto.service.LottoGameService; +import lotto.service.LottoPurchaseService; +import lotto.service.LottoResultCalculator; +import lotto.service.LottoStatisticsService; +import lotto.util.DuplicateValidator; +import lotto.util.LottoNumberSorter; +import lotto.util.NumberValidator; +import lotto.util.PurchaseAmountValidator; +import lotto.util.RandomNumberGenerator; +import lotto.util.WinningNumberSeparator; +import lotto.view.InputView; +import lotto.view.OutputView; + public class Application { - public static void main(String[] args) { - // TODO: ν”„λ‘œκ·Έλž¨ κ΅¬ν˜„ - } + public static void main(String[] args) { + RandomNumberGenerator randomNumberGenerator = new RandomNumberGenerator(); + LottoNumberSorter lottoNumberSorter = new LottoNumberSorter(); + LottoTicketStore lottoTicketStore = new LottoTicketStore(randomNumberGenerator, lottoNumberSorter); + + NumberValidator numberValidator = new NumberValidator(); + DuplicateValidator duplicateValidator = new DuplicateValidator(); + WinningNumberSeparator winningNumberSeparator = new WinningNumberSeparator(); + PurchaseAmountValidator purchaseAmountValidator = new PurchaseAmountValidator(numberValidator); + + OutputView outputView = new OutputView(); + InputView inputView = new InputView(outputView, purchaseAmountValidator, winningNumberSeparator, + duplicateValidator); + + LottoPurchaseService lottoPurchaseService = new LottoPurchaseService(inputView, outputView, lottoTicketStore); + LottoGameService lottoGameService = new LottoGameService(inputView); + LottoResultCalculator lottoResultCalculator = new LottoResultCalculator(); + LottoStatisticsService lottoStatisticsService = new LottoStatisticsService(lottoResultCalculator, outputView); + LottoController lottoController = new LottoController(lottoGameService, lottoPurchaseService, + lottoStatisticsService); + + lottoController.play(); + } } From a83d0e47028a3a483090087617f62d210adb2cfe Mon Sep 17 00:00:00 2001 From: gyuoo Date: Tue, 5 Nov 2024 02:13:47 +0900 Subject: [PATCH 76/79] docs(readme): mark checklists --- README.md | 32 ++++++++++++++++---------------- 1 file changed, 16 insertions(+), 16 deletions(-) diff --git a/README.md b/README.md index 18ccb99c1d..364078bb96 100644 --- a/README.md +++ b/README.md @@ -145,32 +145,32 @@ ### 3. 당첨 κ²°κ³Ό 계산 -- [ ] 각 둜또의 λ²ˆν˜Έμ™€ 당첨 번호λ₯Ό 비ꡐ - - [ ] μΌμΉ˜ν•˜λŠ” 번호의 개수 계산 -- [ ] 당첨 λ“±μˆ˜ νŒλ‹¨ - - [ ] μΌμΉ˜ν•˜λŠ” 번호의 κ°œμˆ˜μ— 따라 λ“±μˆ˜ κ²°μ • -- [ ] 각 λ“±μˆ˜μ˜ 당첨 횟수 μΉ΄μš΄νŒ… -- [ ] 당첨 횟수 μ €μž₯ +- [x] 각 둜또의 λ²ˆν˜Έμ™€ 당첨 번호λ₯Ό 비ꡐ + - [x] μΌμΉ˜ν•˜λŠ” 번호의 개수 계산 +- [x] 당첨 λ“±μˆ˜ νŒλ‹¨ + - [x] μΌμΉ˜ν•˜λŠ” 번호의 κ°œμˆ˜μ— 따라 λ“±μˆ˜ κ²°μ • +- [x] 각 λ“±μˆ˜μ˜ 당첨 횟수 μΉ΄μš΄νŒ… +- [x] 당첨 횟수 μ €μž₯ ### 4. 수읡λ₯  계산 -- [ ] 총 λ‹Ήμ²¨κΈˆ 계산 (각 λ“±μˆ˜λ³„ 당첨 횟수 * λ‹Ήμ²¨κΈˆ) -- [ ] 수읡λ₯  계산 (총 λ‹Ήμ²¨κΈˆ / 총 κ΅¬μž… κΈˆμ•‘) * 100 - - [ ] μ†Œμˆ˜μ  λ‘˜μ§Έ μžλ¦¬μ—μ„œ 반올림 +- [x] 총 λ‹Ήμ²¨κΈˆ 계산 (각 λ“±μˆ˜λ³„ 당첨 횟수 * λ‹Ήμ²¨κΈˆ) +- [x] 수읡λ₯  계산 (총 λ‹Ήμ²¨κΈˆ / 총 κ΅¬μž… κΈˆμ•‘) * 100 + - [x] μ†Œμˆ˜μ  λ‘˜μ§Έ μžλ¦¬μ—μ„œ 반올림 ### 5. κ²°κ³Ό 좜λ ₯ -- [ ] 둜또 ꡬ맀 λ‚΄μ—­(μƒμ„±λœ 둜또 μˆ˜μ™€ 각 둜또의 번호λ₯Ό μ˜€λ¦„μ°¨μˆœ μ •λ ¬) 좜λ ₯ -- [ ] 당첨 톡계(λ“±μˆ˜λ³„ 당첨 νšŸμˆ˜μ™€ λ‹Ήμ²¨κΈˆ) 좜λ ₯ -- [ ] κ³„μ‚°λœ 수읡λ₯  좜λ ₯ +- [x] 둜또 ꡬ맀 λ‚΄μ—­(μƒμ„±λœ 둜또 μˆ˜μ™€ 각 둜또의 번호λ₯Ό μ˜€λ¦„μ°¨μˆœ μ •λ ¬) 좜λ ₯ +- [x] 당첨 톡계(λ“±μˆ˜λ³„ 당첨 νšŸμˆ˜μ™€ λ‹Ήμ²¨κΈˆ) 좜λ ₯ +- [x] κ³„μ‚°λœ 수읡λ₯  좜λ ₯ ### 6. λ‹¨μœ„ ν…ŒμŠ€νŠΈ μž‘μ„± -- [ ] κ΅¬ν˜„ν•œ κΈ°λŠ₯에 λŒ€ν•œ λ‹¨μœ„ ν…ŒμŠ€νŠΈ μž‘μ„± +- [x] κ΅¬ν˜„ν•œ κΈ°λŠ₯에 λŒ€ν•œ λ‹¨μœ„ ν…ŒμŠ€νŠΈ μž‘μ„± ### 7. μœ ν‹Έλ¦¬ν‹° -- [ ] 숫자 검증 μœ ν‹Έλ¦¬ν‹° +- [x] 숫자 검증 μœ ν‹Έλ¦¬ν‹° - [x] 숫자 랜덀 μΆ”μΆœ μœ ν‹Έλ¦¬ν‹° - [x] μ˜€λ¦„μ°¨μˆœ μ •λ ¬ μœ ν‹Έλ¦¬ν‹° @@ -180,8 +180,8 @@ - [ ] λ©”μ„œλ“œμ˜ 길이가 15라인을 λ„˜μ–΄κ°€μ§€ μ•Šλ„λ‘ κ΅¬ν˜„ - [ ] λ©”μ„œλ“œκ°€ ν•œ 가지 일만 잘 ν•˜λ„λ‘ κ΅¬ν˜„ - [ ] μ±…μž„ 뢄리: 각 ν΄λž˜μŠ€κ°€ 단일 μ±…μž„ 원칙을 λ”°λ₯΄λ„둝 ꡬ쑰 κ°œμ„  -- [ ] else, switch/caseλ¬Έ κΈˆμ§€ -- [ ] Enum의 적용 +- [x] else, switch/caseλ¬Έ κΈˆμ§€ +- [x] Enum의 적용 ## πŸ€” μƒκ°μ˜ 흔적 From b09fb49f37601edf70488b5df164d415e01d2b4b Mon Sep 17 00:00:00 2001 From: gyuoo Date: Tue, 5 Nov 2024 02:14:33 +0900 Subject: [PATCH 77/79] docs(readme): add comments --- README.md | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/README.md b/README.md index 364078bb96..f2896d6d47 100644 --- a/README.md +++ b/README.md @@ -203,4 +203,8 @@ - 둜또 ꡬ맀 κ°€λŠ₯ κΈˆμ•‘μ„ intλ‚˜ long으둜 ν•  것인가, ν˜„μ‹€μ²˜λŸΌ 10만 μ›κΉŒμ§€ μ œν•œν•  것인가 - 10만 μ›μœΌλ‘œ μ œν•œ -- Validator.validateκ°€ λ§˜μ— μ•ˆ λ“œλŠ”λ° μ–΄μ©”κΉŒ.. \ No newline at end of file +- Validator.validateκ°€ λ§˜μ— μ•ˆ λ“œλŠ”λ° μ–΄μ©”κΉŒ.. + +### 자기 λ°˜μ„± + +- 3μ‹œκ°„ λ§Œμ— ν•˜λ €λ‹ˆκΉŒ λ„ˆλ¬΄ μ΄‰λ°•ν–ˆλ‹€. λ‹€μŒμ—” μ‹œκ°„μ„ 쑰금 더 λ‚΄μ„œ ν•˜μž.. \ No newline at end of file From 641d1aaabe7eabcb730acfb7e75dfe3fbf8c9eed Mon Sep 17 00:00:00 2001 From: gyuoo Date: Tue, 5 Nov 2024 02:20:22 +0900 Subject: [PATCH 78/79] docs(readme): update package structure --- README.md | 30 +++++++++++++++++++++++++----- 1 file changed, 25 insertions(+), 5 deletions(-) diff --git a/README.md b/README.md index f2896d6d47..5c1178d36a 100644 --- a/README.md +++ b/README.md @@ -55,19 +55,36 @@ ``` 🌐 src.main.java.lotto β”‚ +β”œβ”€β”€ πŸ“¦ constants +β”‚ └── LottoConstantNumbers +β”‚ β”œβ”€β”€ πŸ“¦ controller β”‚ └── LottoController β”‚ β”œβ”€β”€ πŸ“¦ domain β”‚ β”œβ”€β”€ Lotto -β”‚ β”œβ”€β”€ LottoGame β”‚ β”œβ”€β”€ LottoResult β”‚ β”œβ”€β”€ Prize β”‚ └── WinningNumber β”‚ β”œβ”€β”€ πŸ“¦ exception -β”‚ β”œβ”€β”€ ErrorMessage -β”‚ └── LottoException +β”‚ β”‚ +β”‚ β”œβ”€β”€πŸ“¦ lottoticketexception +β”‚ β”‚ β”œβ”€β”€ DuplicateException +β”‚ β”‚ └── LottoNumberSizeException +β”‚ β”‚ +β”‚ β”œβ”€β”€πŸ“¦ numberexception +β”‚ β”‚ β”œβ”€β”€ InvalidNumberException +β”‚ β”‚ └── OutOfRangeNumberException +β”‚ β”‚ +β”‚ β”œβ”€β”€πŸ“¦ purchaseamountexception +β”‚ β”‚ β”œβ”€β”€ InvalidPurchaseAmountException +β”‚ β”‚ β”œβ”€β”€ MaxPurchaseExceedException +β”‚ β”‚ β”œβ”€β”€ NegativePurchaseAmountException +β”‚ β”‚ └── NotDivisibleByLottoPriceException +β”‚ β”‚ +β”‚ β”œβ”€β”€ ErrorConstants +β”‚ └── ErrorMessage β”‚ β”œβ”€β”€ πŸ“¦ factory β”‚ └── LottoTicketStore @@ -79,9 +96,12 @@ β”‚ └── LottoStatisticsService β”‚ β”œβ”€β”€ πŸ“¦ util +β”‚ β”œβ”€β”€ DuplicateValidator β”‚ β”œβ”€β”€ LottoNumberSorter -β”‚ β”œβ”€β”€ LottoNumberValidator -β”‚ └── RandomNumberGenerator +β”‚ β”œβ”€β”€ NumberValidator +β”‚ β”œβ”€β”€ PurchaseAmountValidator +β”‚ β”œβ”€β”€ RandomNumberGenerator +β”‚ └── WinningNumberSeparator β”‚ β”œβ”€β”€ πŸ“¦ view β”‚ β”œβ”€β”€ ConsoleMessage From f481890434c97787c1a462596cd301d976a71e70 Mon Sep 17 00:00:00 2001 From: gyuoo Date: Tue, 5 Nov 2024 02:30:52 +0900 Subject: [PATCH 79/79] fix(view): remove unnecessary newline --- src/main/java/lotto/view/OutputView.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/main/java/lotto/view/OutputView.java b/src/main/java/lotto/view/OutputView.java index 6b2106cba1..6eeb0411a7 100644 --- a/src/main/java/lotto/view/OutputView.java +++ b/src/main/java/lotto/view/OutputView.java @@ -74,7 +74,7 @@ public void printPrizeStatistics(Map prizeCounts) { .append('\n') .append(String.format(ConsoleMessage.MATCH_6.getMessage(), prizeCounts.get(Prize.FIRST))) .append('\n'); - System.out.println(statisticBuilder); + System.out.print(statisticBuilder); } public void printTotalYield(double yield) {