From c2bb50e03e5a84af58ca19deb0d9b7933ae849d6 Mon Sep 17 00:00:00 2001 From: Sini0206 Date: Mon, 3 Nov 2025 23:27:19 +0900 Subject: [PATCH 01/18] =?UTF-8?q?docs(README):=20=ED=94=84=EB=A1=9C?= =?UTF-8?q?=EA=B7=B8=EB=9E=A8=20=EC=84=A4=EB=AA=85=20=EB=B0=8F=20=EA=B8=B0?= =?UTF-8?q?=EB=8A=A5=20=EB=AA=A9=EB=A1=9D=20=EC=9E=91=EC=84=B1?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- README.md | 70 +++++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 70 insertions(+) diff --git a/README.md b/README.md index 5fa2560b46..a0c719cd9b 100644 --- a/README.md +++ b/README.md @@ -1 +1,71 @@ # java-lotto-precourse +- 개요: 간단한 로또 발매기 프로그램 +- 프로그램 흐름 (사용자 입장) + - 구입 금액 입력 + - 구입 금액에 따라 발행된 로또 개수 및 로또별 번호 확인 + - 당첨 번호 입력 + - 보너스 번호 입력 + - 당첨 통계(당첨 내역 및 수익률) 확인 +- 당첨 정책 + - 1등: 6개 번호 일치 / 2,000,000,000원 + - 2등: 5개 번호 + 보너스 번호 일치 / 30,000,000원 + - 3등: 5개 번호 일치 / 1,500,000원 + - 4등: 4개 번호 일치 / 50,000원 + - 5등: 3개 번호 일치 / 5,000원 + +## 실행 결과 예시 +``` +구입금액을 입력해 주세요. +8000 + +8개를 구매했습니다. +[8, 21, 23, 41, 42, 43] +[3, 5, 11, 16, 32, 38] +[7, 11, 16, 35, 36, 44] +[1, 8, 11, 31, 41, 42] +[13, 14, 16, 38, 42, 45] +[7, 11, 30, 40, 42, 43] +[2, 13, 22, 32, 38, 45] +[1, 3, 5, 14, 22, 45] + +당첨 번호를 입력해 주세요. +1,2,3,4,5,6 + +보너스 번호를 입력해 주세요. +7 + +당첨 통계 +--- +3개 일치 (5,000원) - 1개 +4개 일치 (50,000원) - 0개 +5개 일치 (1,500,000원) - 0개 +5개 일치, 보너스 볼 일치 (30,000,000원) - 0개 +6개 일치 (2,000,000,000원) - 0개 +총 수익률은 62.5%입니다. +``` + +## 기능 목록 +- [ ] 로또 구입 금액 입력값 검증 + - 입력 형식이 숫자여야 함 + - 로또 1장의 가격(1000원)으로 나누어 떨어져야 함 +- [ ] 구입 금액에 해당하는 로또 수 계산 +- [ ] 중복되지 않는 무작위 번호 6개로 구성된 단일 로또 발행 + - 단, 로또 번호 정렬 +- [ ] 로또 수 만큼 로또 발행 +- [ ] 문자열 입력값에서 당첨 번호 추출 + - 쉼표 기준으로 구분 +- [ ] 입력 받은 보너스 번호 검증 + - 당첨 번호 입력값들과 중복되면 안 됨 +- [ ] 로또 번호의 숫자 범위 검증 (1~45) +- [ ] 당첨 번호 추첨 (중복되지 않는 숫자 6개와 보너스 번호 1개) +- [ ] 발행된 로또 수량 및 번호 출력 +- [ ] 사용자가 구매한 로또 번호와 당첨 번호를 비교 +- [ ] 당첨 내역 계산 +- [ ] 당첨 내역 출력 +- [ ] 총 상금 계산 +- [ ] 수익률 계산 +- [ ] 수익률 출력 + - 소수점 둘째 자리에서 반올림 (ex. 100.0%, 51.5%, 1,000,000.0%) + +- [ ] 사용자가 잘못된 값을 입력할 경우 `IllegalArgumentException` 발생, 에러 메시지 출력 후 그 부분부터 입력을 다시 받기 + - 단, 출력 메세지는 "[ERROR]"로 시작 \ No newline at end of file From 4cf888b1b683f150d59edfd210139872ba5a9aaf Mon Sep 17 00:00:00 2001 From: Sini0206 Date: Mon, 3 Nov 2025 23:30:39 +0900 Subject: [PATCH 02/18] =?UTF-8?q?feat:=20=EB=A1=9C=EB=98=90=20=EA=B5=AC?= =?UTF-8?q?=EC=9E=85=20=EA=B8=88=EC=95=A1=20=EC=9E=85=EB=A0=A5=EA=B0=92=20?= =?UTF-8?q?=EA=B2=80=EC=A6=9D?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- README.md | 2 +- .../java/lotto/validator/LottoValidator.java | 32 +++++++++++++++++++ src/main/java/lotto/view/InputView.java | 19 +++++++++++ 3 files changed, 52 insertions(+), 1 deletion(-) create mode 100644 src/main/java/lotto/validator/LottoValidator.java create mode 100644 src/main/java/lotto/view/InputView.java diff --git a/README.md b/README.md index a0c719cd9b..8682c659c4 100644 --- a/README.md +++ b/README.md @@ -45,7 +45,7 @@ ``` ## 기능 목록 -- [ ] 로또 구입 금액 입력값 검증 +- [X] 로또 구입 금액 입력값 검증 - 입력 형식이 숫자여야 함 - 로또 1장의 가격(1000원)으로 나누어 떨어져야 함 - [ ] 구입 금액에 해당하는 로또 수 계산 diff --git a/src/main/java/lotto/validator/LottoValidator.java b/src/main/java/lotto/validator/LottoValidator.java new file mode 100644 index 0000000000..17e455cc2e --- /dev/null +++ b/src/main/java/lotto/validator/LottoValidator.java @@ -0,0 +1,32 @@ +package lotto.validator; + +import lotto.enums.ErrorMessage; + +import static lotto.validator.InputValidator.canParseToNumber; +import static lotto.validator.InputValidator.validateInput; + +public class LottoValidator { + public static final int LOTTO_PRICE = 1000; + public static final int LOTTO_SIZE = 6; + public static final int LOTTO_MIN_NUMBER = 1; + public static final int LOTTO_MAX_NUMBER = 45; + + /** + * 로또 구입 금액 입력값 검증 + * @param input 사용자 입력 문자열 + * @return 유효하면 true, 아니면 false + */ + public static void isValidPurchaseAmounts(String input) { + validateInput(input); + int amount = canParseToNumber(input); + + if (amount < LOTTO_PRICE) { + throw new IllegalArgumentException(ErrorMessage.NOT_MINIMUM_PURCHASE_AMOUNTS.getMessage()); + } + + if (amount % LOTTO_PRICE != 0) { + throw new IllegalArgumentException(ErrorMessage.NOT_DIVIDED_BY_LOTTO_PRICE.getMessage()); + } + } + +} diff --git a/src/main/java/lotto/view/InputView.java b/src/main/java/lotto/view/InputView.java new file mode 100644 index 0000000000..16e954a9ee --- /dev/null +++ b/src/main/java/lotto/view/InputView.java @@ -0,0 +1,19 @@ +package lotto.view; + +import camp.nextstep.edu.missionutils.Console; + +import static lotto.validator.InputValidator.validateInput; + +public class InputView { + public static void guideInput(String need) { + System.out.println(need + "을 입력해 주세요."); + } + + public static String ReadInput(String guide) { + guideInput(guide); + String input = Console.readLine(); + validateInput(input); + + return input; + } +} From 4bc1acfcf501aca6f7efb332f9261fd7f6efc491 Mon Sep 17 00:00:00 2001 From: Sini0206 Date: Mon, 3 Nov 2025 23:35:12 +0900 Subject: [PATCH 03/18] =?UTF-8?q?feat:=20=EA=B5=AC=EC=9E=85=20=EA=B8=88?= =?UTF-8?q?=EC=95=A1=EC=97=90=20=ED=95=B4=EB=8B=B9=ED=95=98=EB=8A=94=20?= =?UTF-8?q?=EB=A1=9C=EB=98=90=20=EC=88=98=20=EA=B3=84=EC=82=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- README.md | 2 +- src/main/java/lotto/enums/ErrorMessage.java | 26 +++++++++++++++++++ .../java/lotto/service/LottoCalculator.java | 9 +++++++ 3 files changed, 36 insertions(+), 1 deletion(-) create mode 100644 src/main/java/lotto/enums/ErrorMessage.java create mode 100644 src/main/java/lotto/service/LottoCalculator.java diff --git a/README.md b/README.md index 8682c659c4..6e8d1d016c 100644 --- a/README.md +++ b/README.md @@ -48,7 +48,7 @@ - [X] 로또 구입 금액 입력값 검증 - 입력 형식이 숫자여야 함 - 로또 1장의 가격(1000원)으로 나누어 떨어져야 함 -- [ ] 구입 금액에 해당하는 로또 수 계산 +- [x] 구입 금액에 해당하는 로또 수 계산 - [ ] 중복되지 않는 무작위 번호 6개로 구성된 단일 로또 발행 - 단, 로또 번호 정렬 - [ ] 로또 수 만큼 로또 발행 diff --git a/src/main/java/lotto/enums/ErrorMessage.java b/src/main/java/lotto/enums/ErrorMessage.java new file mode 100644 index 0000000000..4d965b4f6d --- /dev/null +++ b/src/main/java/lotto/enums/ErrorMessage.java @@ -0,0 +1,26 @@ +package lotto.enums; + +import static lotto.validator.LottoValidator.*; + +public enum ErrorMessage { + EMPTY_INPUT("빈 칸은 입력 불가합니다."), + NOT_NUMBER("숫자 형식이어야 합니다."), + NOT_DIVIDED_BY_LOTTO_PRICE("단위가 아닙니다."), + NOT_MINIMUM_PURCHASE_AMOUNTS("최소 구매 가격은 " + LOTTO_PRICE + "원 입니다."), + WRONG_LOTTO_NUMBER_RANGE("로또 번호는 " + LOTTO_MIN_NUMBER + "~ " + LOTTO_MAX_NUMBER + "이내의 숫자여야 합니다."), + WRONG_LOTTO_NUMBER_SIZE("로또 번호는 " + LOTTO_SIZE + "개여야 합니다."), + CAN_NOT_MATCH_BONUS_NUMBER("보너스 번호는 당첨 번호들과 불일치해야 합니다."), + LOTTO_NOT_EXIST("로또가 존재하지 않습니다."), + RANK_NOT_EXIST("존재하지 않는 등수입니다."); + + private final String prefix = "[ERROR]"; + private String message; + + ErrorMessage(String message) { + this.message = prefix + message; + } + + public String getMessage() { + return message; + } +} diff --git a/src/main/java/lotto/service/LottoCalculator.java b/src/main/java/lotto/service/LottoCalculator.java new file mode 100644 index 0000000000..4f46b8ff23 --- /dev/null +++ b/src/main/java/lotto/service/LottoCalculator.java @@ -0,0 +1,9 @@ +package lotto.service; + +import static lotto.validator.LottoValidator.LOTTO_PRICE; + +public class LottoCalculator { + public static int calculateLottoAmount(int purchaseAmounts) { + return purchaseAmounts / LOTTO_PRICE; + } +} From 4de53ddca711658d1912a956827413315b877af2 Mon Sep 17 00:00:00 2001 From: Sini0206 Date: Mon, 3 Nov 2025 23:39:24 +0900 Subject: [PATCH 04/18] =?UTF-8?q?feat:=20=EB=8B=A8=EC=9D=BC=20=EB=A1=9C?= =?UTF-8?q?=EB=98=90=20=EB=B0=9C=ED=96=89?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - 로또 생성 책임을 LottoFactory에 분배 --- README.md | 2 +- src/main/java/lotto/service/LottoFactory.java | 18 ++++++++++++++++++ 2 files changed, 19 insertions(+), 1 deletion(-) create mode 100644 src/main/java/lotto/service/LottoFactory.java diff --git a/README.md b/README.md index 6e8d1d016c..ec01cbfc8d 100644 --- a/README.md +++ b/README.md @@ -49,7 +49,7 @@ - 입력 형식이 숫자여야 함 - 로또 1장의 가격(1000원)으로 나누어 떨어져야 함 - [x] 구입 금액에 해당하는 로또 수 계산 -- [ ] 중복되지 않는 무작위 번호 6개로 구성된 단일 로또 발행 +- [x] 중복되지 않는 무작위 번호 6개로 구성된 단일 로또 발행 - 단, 로또 번호 정렬 - [ ] 로또 수 만큼 로또 발행 - [ ] 문자열 입력값에서 당첨 번호 추출 diff --git a/src/main/java/lotto/service/LottoFactory.java b/src/main/java/lotto/service/LottoFactory.java new file mode 100644 index 0000000000..c400b42206 --- /dev/null +++ b/src/main/java/lotto/service/LottoFactory.java @@ -0,0 +1,18 @@ +package lotto.service; + +import camp.nextstep.edu.missionutils.Randoms; +import lotto.model.Lotto; + +import java.util.Collections; +import java.util.List; + +import static lotto.validator.LottoValidator.*; + +public class LottoFactory { + public static Lotto createRandomLotto() { + List nums = Randoms.pickUniqueNumbersInRange(LOTTO_MIN_NUMBER, LOTTO_MAX_NUMBER, LOTTO_SIZE); + Collections.sort(nums); + return new Lotto(nums); + } + +} From a3cd84eebe6ba5c19ddc84d4ade016c97490b326 Mon Sep 17 00:00:00 2001 From: Sini0206 Date: Mon, 3 Nov 2025 23:40:01 +0900 Subject: [PATCH 05/18] =?UTF-8?q?feat:=20=EB=A1=9C=EB=98=90=20=EC=88=98=20?= =?UTF-8?q?=EB=A7=8C=ED=81=BC=20=EB=A1=9C=EB=98=90=20=EB=B0=9C=ED=96=89?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- README.md | 2 +- src/main/java/lotto/service/LottoFactory.java | 10 ++++++++++ 2 files changed, 11 insertions(+), 1 deletion(-) diff --git a/README.md b/README.md index ec01cbfc8d..018195ad47 100644 --- a/README.md +++ b/README.md @@ -51,7 +51,7 @@ - [x] 구입 금액에 해당하는 로또 수 계산 - [x] 중복되지 않는 무작위 번호 6개로 구성된 단일 로또 발행 - 단, 로또 번호 정렬 -- [ ] 로또 수 만큼 로또 발행 +- [x] 로또 수 만큼 로또 발행 - [ ] 문자열 입력값에서 당첨 번호 추출 - 쉼표 기준으로 구분 - [ ] 입력 받은 보너스 번호 검증 diff --git a/src/main/java/lotto/service/LottoFactory.java b/src/main/java/lotto/service/LottoFactory.java index c400b42206..66fcaeb391 100644 --- a/src/main/java/lotto/service/LottoFactory.java +++ b/src/main/java/lotto/service/LottoFactory.java @@ -3,6 +3,7 @@ import camp.nextstep.edu.missionutils.Randoms; import lotto.model.Lotto; +import java.util.ArrayList; import java.util.Collections; import java.util.List; @@ -15,4 +16,13 @@ public static Lotto createRandomLotto() { return new Lotto(nums); } + public static List createLottos(int totalAmount) { + List lottos = new ArrayList<>(); + for (int i=0; i Date: Mon, 3 Nov 2025 23:41:40 +0900 Subject: [PATCH 06/18] =?UTF-8?q?feat:=20=EB=8B=B9=EC=B2=A8=20=EB=B2=88?= =?UTF-8?q?=ED=98=B8=20=EC=B6=94=EC=B6=9C?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - 중복되지 않는 숫자 6개와 보너스 번호 1개를 담은 데이터 클래스 생성 --- README.md | 2 +- src/main/java/lotto/dto/WinnerLotto.java | 9 +++++++++ src/main/java/lotto/service/LottoFactory.java | 14 ++++++++++++++ 3 files changed, 24 insertions(+), 1 deletion(-) create mode 100644 src/main/java/lotto/dto/WinnerLotto.java diff --git a/README.md b/README.md index 018195ad47..7ee66a4f44 100644 --- a/README.md +++ b/README.md @@ -57,7 +57,7 @@ - [ ] 입력 받은 보너스 번호 검증 - 당첨 번호 입력값들과 중복되면 안 됨 - [ ] 로또 번호의 숫자 범위 검증 (1~45) -- [ ] 당첨 번호 추첨 (중복되지 않는 숫자 6개와 보너스 번호 1개) +- [x] 당첨 번호 추첨 (중복되지 않는 숫자 6개와 보너스 번호 1개) - [ ] 발행된 로또 수량 및 번호 출력 - [ ] 사용자가 구매한 로또 번호와 당첨 번호를 비교 - [ ] 당첨 내역 계산 diff --git a/src/main/java/lotto/dto/WinnerLotto.java b/src/main/java/lotto/dto/WinnerLotto.java new file mode 100644 index 0000000000..d32748c1e8 --- /dev/null +++ b/src/main/java/lotto/dto/WinnerLotto.java @@ -0,0 +1,9 @@ +package lotto.dto; + +import java.util.List; + +public record WinnerLotto( + List lottoNumbers, + int bonusNumber +) { +} \ No newline at end of file diff --git a/src/main/java/lotto/service/LottoFactory.java b/src/main/java/lotto/service/LottoFactory.java index 66fcaeb391..8d960b3820 100644 --- a/src/main/java/lotto/service/LottoFactory.java +++ b/src/main/java/lotto/service/LottoFactory.java @@ -2,6 +2,7 @@ import camp.nextstep.edu.missionutils.Randoms; import lotto.model.Lotto; +import lotto.dto.WinnerLotto; import java.util.ArrayList; import java.util.Collections; @@ -25,4 +26,17 @@ public static List createLottos(int totalAmount) { return lottos; } + public static WinnerLotto createRandomWinnerLotto() { + List nums = Randoms.pickUniqueNumbersInRange(LOTTO_MIN_NUMBER, LOTTO_MAX_NUMBER, LOTTO_SIZE+1); + + int bonusNumber = nums.getLast(); + nums.removeLast(); + + return new WinnerLotto(nums, bonusNumber); + } + + public static WinnerLotto createWinnerLotto(List nums, int bonusNumber) { + return new WinnerLotto(nums, bonusNumber); + } + } From 016579c62f082f5b852e5cb11d9b467e05c135b7 Mon Sep 17 00:00:00 2001 From: Sini0206 Date: Mon, 3 Nov 2025 23:43:05 +0900 Subject: [PATCH 07/18] =?UTF-8?q?feat:=20=EB=AC=B8=EC=9E=90=EC=97=B4=20?= =?UTF-8?q?=EC=9E=85=EB=A0=A5=EA=B0=92=EC=97=90=EC=84=9C=20=EB=8B=B9?= =?UTF-8?q?=EC=B2=A8=20=EB=B2=88=ED=98=B8=20=EC=B6=94=EC=B6=9C?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- README.md | 2 +- .../java/lotto/validator/InputValidator.java | 20 +++++++++++++++++++ src/main/java/lotto/view/InputView.java | 14 +++++++++++++ 3 files changed, 35 insertions(+), 1 deletion(-) create mode 100644 src/main/java/lotto/validator/InputValidator.java diff --git a/README.md b/README.md index 7ee66a4f44..1055ebc904 100644 --- a/README.md +++ b/README.md @@ -52,7 +52,7 @@ - [x] 중복되지 않는 무작위 번호 6개로 구성된 단일 로또 발행 - 단, 로또 번호 정렬 - [x] 로또 수 만큼 로또 발행 -- [ ] 문자열 입력값에서 당첨 번호 추출 +- [x] 문자열 입력값에서 당첨 번호 추출 - 쉼표 기준으로 구분 - [ ] 입력 받은 보너스 번호 검증 - 당첨 번호 입력값들과 중복되면 안 됨 diff --git a/src/main/java/lotto/validator/InputValidator.java b/src/main/java/lotto/validator/InputValidator.java new file mode 100644 index 0000000000..b3b7e8904c --- /dev/null +++ b/src/main/java/lotto/validator/InputValidator.java @@ -0,0 +1,20 @@ +package lotto.validator; + +import lotto.enums.ErrorMessage; + +import java.util.List; + +public class InputValidator { + public static void validateInput(String input) { + if (input == null) { // !input.matches("\\d+") + throw new IllegalArgumentException(ErrorMessage.EMPTY_INPUT.getMessage()); + } + } + public static int canParseToNumber(String input) { + try { + return Integer.parseInt(input); + } catch (NumberFormatException e) { + throw new IllegalArgumentException(ErrorMessage.NOT_NUMBER.getMessage()); + } + } +} diff --git a/src/main/java/lotto/view/InputView.java b/src/main/java/lotto/view/InputView.java index 16e954a9ee..affabfc693 100644 --- a/src/main/java/lotto/view/InputView.java +++ b/src/main/java/lotto/view/InputView.java @@ -2,6 +2,10 @@ import camp.nextstep.edu.missionutils.Console; +import java.util.ArrayList; +import java.util.List; + +import static lotto.validator.InputValidator.canParseToNumber; import static lotto.validator.InputValidator.validateInput; public class InputView { @@ -16,4 +20,14 @@ public static String ReadInput(String guide) { return input; } + + public static List parseNumbers(String input) { + List numbers = new ArrayList<>(); + + for (String s : input.split(",")) { + int num = canParseToNumber(s); + numbers.add(num); + } + return numbers; + } } From 3ca8faddc13bfd47195a6753508c13144908b00c Mon Sep 17 00:00:00 2001 From: Sini0206 Date: Mon, 3 Nov 2025 23:45:49 +0900 Subject: [PATCH 08/18] =?UTF-8?q?feat:=20=EC=9E=85=EB=A0=A5=20=EB=B0=9B?= =?UTF-8?q?=EC=9D=80=20=EB=B3=B4=EB=84=88=EC=8A=A4=20=EB=B2=88=ED=98=B8=20?= =?UTF-8?q?=EA=B2=80=EC=A6=9D?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- README.md | 2 +- src/main/java/lotto/validator/InputValidator.java | 13 +++++++++++++ 2 files changed, 14 insertions(+), 1 deletion(-) diff --git a/README.md b/README.md index 1055ebc904..8166cdfb4d 100644 --- a/README.md +++ b/README.md @@ -54,7 +54,7 @@ - [x] 로또 수 만큼 로또 발행 - [x] 문자열 입력값에서 당첨 번호 추출 - 쉼표 기준으로 구분 -- [ ] 입력 받은 보너스 번호 검증 +- [x] 입력 받은 보너스 번호 검증 - 당첨 번호 입력값들과 중복되면 안 됨 - [ ] 로또 번호의 숫자 범위 검증 (1~45) - [x] 당첨 번호 추첨 (중복되지 않는 숫자 6개와 보너스 번호 1개) diff --git a/src/main/java/lotto/validator/InputValidator.java b/src/main/java/lotto/validator/InputValidator.java index b3b7e8904c..45e9119472 100644 --- a/src/main/java/lotto/validator/InputValidator.java +++ b/src/main/java/lotto/validator/InputValidator.java @@ -17,4 +17,17 @@ public static int canParseToNumber(String input) { throw new IllegalArgumentException(ErrorMessage.NOT_NUMBER.getMessage()); } } + + public static int validateBonusNumber(String input, List numbers) { + validateInput(input); + int bonus = canParseToNumber(input); + + for (int num : numbers) { + if (bonus == num) { + throw new IllegalArgumentException(ErrorMessage.CAN_NOT_MATCH_BONUS_NUMBER.getMessage()); + } + } + + return bonus; + } } From 0639f90012c3201eb40e3344e92db0ce93a2353f Mon Sep 17 00:00:00 2001 From: Sini0206 Date: Mon, 3 Nov 2025 23:46:56 +0900 Subject: [PATCH 09/18] =?UTF-8?q?feat:=20=EB=A1=9C=EB=98=90=20=EB=B2=88?= =?UTF-8?q?=ED=98=B8=EC=9D=98=20=EC=88=AB=EC=9E=90=20=EB=B2=94=EC=9C=84=20?= =?UTF-8?q?=EA=B2=80=EC=A6=9D=20(1~45)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- README.md | 2 +- src/main/java/lotto/validator/LottoValidator.java | 9 +++++++++ 2 files changed, 10 insertions(+), 1 deletion(-) diff --git a/README.md b/README.md index 8166cdfb4d..9d4a80214f 100644 --- a/README.md +++ b/README.md @@ -56,7 +56,7 @@ - 쉼표 기준으로 구분 - [x] 입력 받은 보너스 번호 검증 - 당첨 번호 입력값들과 중복되면 안 됨 -- [ ] 로또 번호의 숫자 범위 검증 (1~45) +- [x] 로또 번호의 숫자 범위 검증 (1~45) - [x] 당첨 번호 추첨 (중복되지 않는 숫자 6개와 보너스 번호 1개) - [ ] 발행된 로또 수량 및 번호 출력 - [ ] 사용자가 구매한 로또 번호와 당첨 번호를 비교 diff --git a/src/main/java/lotto/validator/LottoValidator.java b/src/main/java/lotto/validator/LottoValidator.java index 17e455cc2e..f1c26702de 100644 --- a/src/main/java/lotto/validator/LottoValidator.java +++ b/src/main/java/lotto/validator/LottoValidator.java @@ -2,6 +2,8 @@ import lotto.enums.ErrorMessage; +import java.util.List; + import static lotto.validator.InputValidator.canParseToNumber; import static lotto.validator.InputValidator.validateInput; @@ -29,4 +31,11 @@ public static void isValidPurchaseAmounts(String input) { } } + public static void validateRange(List numbers) { + ; + for (int num : numbers) { + if (num < LOTTO_MIN_NUMBER || num > LOTTO_MAX_NUMBER) + throw new IllegalArgumentException(ErrorMessage.WRONG_LOTTO_NUMBER_RANGE.getMessage()); + } + } } From c649bb6085172f0768c0c9a93200969f3788eb58 Mon Sep 17 00:00:00 2001 From: Sini0206 Date: Mon, 3 Nov 2025 23:47:53 +0900 Subject: [PATCH 10/18] =?UTF-8?q?feat:=20=EB=A1=9C=EB=98=90=20=EB=B2=88?= =?UTF-8?q?=ED=98=B8=20=EA=B0=9C=EC=88=98=20=EA=B2=80=EC=A6=9D?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- README.md | 1 + src/main/java/lotto/model/Lotto.java | 23 +++++++++++++++++++ .../java/lotto/validator/LottoValidator.java | 6 +++++ 3 files changed, 30 insertions(+) create mode 100644 src/main/java/lotto/model/Lotto.java diff --git a/README.md b/README.md index 9d4a80214f..c1c3eb04ad 100644 --- a/README.md +++ b/README.md @@ -57,6 +57,7 @@ - [x] 입력 받은 보너스 번호 검증 - 당첨 번호 입력값들과 중복되면 안 됨 - [x] 로또 번호의 숫자 범위 검증 (1~45) +- [x] 로또 번호 개수 검증 - [x] 당첨 번호 추첨 (중복되지 않는 숫자 6개와 보너스 번호 1개) - [ ] 발행된 로또 수량 및 번호 출력 - [ ] 사용자가 구매한 로또 번호와 당첨 번호를 비교 diff --git a/src/main/java/lotto/model/Lotto.java b/src/main/java/lotto/model/Lotto.java new file mode 100644 index 0000000000..63515b54d9 --- /dev/null +++ b/src/main/java/lotto/model/Lotto.java @@ -0,0 +1,23 @@ +package lotto.model; + +import java.util.List; + +import static lotto.validator.LottoValidator.*; + +public class Lotto { + private final List numbers; + + public Lotto(List numbers) { + validate(numbers); + this.numbers = numbers; + } + + public void validate(List numbers) { + validateSize(numbers); + validateRange(numbers); + } + + public List getNumbers() { + return numbers; + } +} diff --git a/src/main/java/lotto/validator/LottoValidator.java b/src/main/java/lotto/validator/LottoValidator.java index f1c26702de..c08974b658 100644 --- a/src/main/java/lotto/validator/LottoValidator.java +++ b/src/main/java/lotto/validator/LottoValidator.java @@ -31,6 +31,12 @@ public static void isValidPurchaseAmounts(String input) { } } + public static void validateSize(List numbers) { + if (numbers.size() != LOTTO_SIZE) { + throw new IllegalArgumentException(ErrorMessage.WRONG_LOTTO_NUMBER_SIZE.getMessage()); + } + } + public static void validateRange(List numbers) { ; for (int num : numbers) { From 0e77ad97ffcb87c3f2bc8f48f5182fa819b34399 Mon Sep 17 00:00:00 2001 From: Sini0206 Date: Mon, 3 Nov 2025 23:49:03 +0900 Subject: [PATCH 11/18] =?UTF-8?q?feat:=20=EB=8B=B9=EC=B2=A8=20=EB=82=B4?= =?UTF-8?q?=EC=97=AD=20=EA=B3=84=EC=82=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- README.md | 2 +- .../java/lotto/service/LottoCalculator.java | 34 +++++++++++++++++++ 2 files changed, 35 insertions(+), 1 deletion(-) diff --git a/README.md b/README.md index c1c3eb04ad..0f76e8cbfe 100644 --- a/README.md +++ b/README.md @@ -61,7 +61,7 @@ - [x] 당첨 번호 추첨 (중복되지 않는 숫자 6개와 보너스 번호 1개) - [ ] 발행된 로또 수량 및 번호 출력 - [ ] 사용자가 구매한 로또 번호와 당첨 번호를 비교 -- [ ] 당첨 내역 계산 +- [x] 당첨 내역 계산 - [ ] 당첨 내역 출력 - [ ] 총 상금 계산 - [ ] 수익률 계산 diff --git a/src/main/java/lotto/service/LottoCalculator.java b/src/main/java/lotto/service/LottoCalculator.java index 4f46b8ff23..62d651dcd3 100644 --- a/src/main/java/lotto/service/LottoCalculator.java +++ b/src/main/java/lotto/service/LottoCalculator.java @@ -1,9 +1,43 @@ package lotto.service; +import lotto.enums.Rank; +import lotto.model.Lotto; +import lotto.dto.WinnerLotto; + +import java.util.*; +import java.util.stream.Collectors; + import static lotto.validator.LottoValidator.LOTTO_PRICE; public class LottoCalculator { public static int calculateLottoAmount(int purchaseAmounts) { return purchaseAmounts / LOTTO_PRICE; } + + public static List getWinningRanks(List purchasedLotto, WinnerLotto inputLotto, WinnerLotto winnerLotto) { + List ranks = new ArrayList<>(); + for (Lotto lotto : purchasedLotto) { + int matchCount = (int) lotto.getNumbers().stream() + .filter(winnerLotto.lottoNumbers()::contains) + .count(); + boolean isBonusMatched = lotto.getNumbers().contains(winnerLotto.bonusNumber()); + + try { + Rank rank = Rank.calculateRank(matchCount, isBonusMatched); + ranks.add(rank); + } catch (IllegalArgumentException e) { + // 의도적으로 무시: 해당 로또는 당첨 등수 없음 + } + } + return ranks; + } + + public static Map getRankStatistics(List ranks) { + Map statistics = Arrays.stream(Rank.values()) + .collect(Collectors.toMap(rank -> rank, rank -> 0)); + + ranks.forEach(rank -> statistics.merge(rank, 1, Integer::sum)); + + return statistics; + } } From 18d8b7379676a1424e705b1b37c0dc87da9ce262 Mon Sep 17 00:00:00 2001 From: Sini0206 Date: Mon, 3 Nov 2025 23:49:37 +0900 Subject: [PATCH 12/18] =?UTF-8?q?feat:=20=EC=B4=9D=20=EC=83=81=EA=B8=88=20?= =?UTF-8?q?=EA=B3=84=EC=82=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- README.md | 4 +- src/main/java/lotto/enums/Rank.java | 44 +++++++++++++++++++ .../java/lotto/service/LottoCalculator.java | 14 ++++++ 3 files changed, 60 insertions(+), 2 deletions(-) create mode 100644 src/main/java/lotto/enums/Rank.java diff --git a/README.md b/README.md index 0f76e8cbfe..8a18ccfcac 100644 --- a/README.md +++ b/README.md @@ -62,8 +62,8 @@ - [ ] 발행된 로또 수량 및 번호 출력 - [ ] 사용자가 구매한 로또 번호와 당첨 번호를 비교 - [x] 당첨 내역 계산 -- [ ] 당첨 내역 출력 -- [ ] 총 상금 계산 +- [x] 당첨 내역 출력 +- [x] 총 상금 계산 - [ ] 수익률 계산 - [ ] 수익률 출력 - 소수점 둘째 자리에서 반올림 (ex. 100.0%, 51.5%, 1,000,000.0%) diff --git a/src/main/java/lotto/enums/Rank.java b/src/main/java/lotto/enums/Rank.java new file mode 100644 index 0000000000..07a1eb2ce2 --- /dev/null +++ b/src/main/java/lotto/enums/Rank.java @@ -0,0 +1,44 @@ +package lotto.enums; + +import java.util.Arrays; +import java.util.List; + +public enum Rank { + FIRST(6, 2000000000, false), + SECOND(5, 30000000, true), + THIRD(5, 1500000, false), + FOURTH(4, 50000, false), + FIFTH(3, 5000, false); + + private final int matchCount; + private final int prize; + private final boolean isBonusRequired; + + Rank(int machCount, int prize, boolean isBonusRequired) { + this.matchCount = machCount; + this.prize = prize; + this.isBonusRequired = isBonusRequired; + } + + public int getMatchCount() { + return matchCount; + } + + public int getPrize() { + return prize; + } + + public boolean isBonusRequired() { + return isBonusRequired; + } + + public static Rank calculateRank(int matchCount, boolean isBonusMatched) { + return Arrays + .stream(Rank.values()) + .filter(rank -> (rank.matchCount == matchCount) && (rank.isBonusRequired == isBonusMatched)) + .findFirst() // (matchCount, isBonusMatched) 조합으로는 정확히 하나의 Rank만 매칭 + .orElseThrow(() -> new IllegalArgumentException( + ErrorMessage.RANK_NOT_EXIST.getMessage() + )); + } +} diff --git a/src/main/java/lotto/service/LottoCalculator.java b/src/main/java/lotto/service/LottoCalculator.java index 62d651dcd3..4ab8835dda 100644 --- a/src/main/java/lotto/service/LottoCalculator.java +++ b/src/main/java/lotto/service/LottoCalculator.java @@ -40,4 +40,18 @@ public static Map getRankStatistics(List ranks) { return statistics; } + + private static int calculateTotalPrize(List ranks) { + if (ranks.isEmpty()) { + return 0; + } + + int totalPrize = 0; + + for (Rank rank : ranks) { + totalPrize += rank.getPrize(); + } + + return totalPrize; + } } From f8ad39228bbddf82d40065fb20178335848981ba Mon Sep 17 00:00:00 2001 From: Sini0206 Date: Mon, 3 Nov 2025 23:50:00 +0900 Subject: [PATCH 13/18] =?UTF-8?q?feat:=20=EC=88=98=EC=9D=B5=EB=A5=A0=20?= =?UTF-8?q?=EA=B3=84=EC=82=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- README.md | 2 +- src/main/java/lotto/service/LottoCalculator.java | 5 +++++ 2 files changed, 6 insertions(+), 1 deletion(-) diff --git a/README.md b/README.md index 8a18ccfcac..73f7e67ef1 100644 --- a/README.md +++ b/README.md @@ -64,7 +64,7 @@ - [x] 당첨 내역 계산 - [x] 당첨 내역 출력 - [x] 총 상금 계산 -- [ ] 수익률 계산 +- [x] 수익률 계산 - [ ] 수익률 출력 - 소수점 둘째 자리에서 반올림 (ex. 100.0%, 51.5%, 1,000,000.0%) diff --git a/src/main/java/lotto/service/LottoCalculator.java b/src/main/java/lotto/service/LottoCalculator.java index 4ab8835dda..9dab2216f7 100644 --- a/src/main/java/lotto/service/LottoCalculator.java +++ b/src/main/java/lotto/service/LottoCalculator.java @@ -54,4 +54,9 @@ private static int calculateTotalPrize(List ranks) { return totalPrize; } + + public static double calculateProfitRate(int purchaseAmount, List ranks) { + int totalPrize = calculateTotalPrize(ranks); + return (double) purchaseAmount / totalPrize * 100; + } } From 82a601e23597cc347f727996ffaa672ad89cb275 Mon Sep 17 00:00:00 2001 From: Sini0206 Date: Mon, 3 Nov 2025 23:51:37 +0900 Subject: [PATCH 14/18] =?UTF-8?q?feat:=20=EB=A1=9C=EB=98=90=20=EC=88=98?= =?UTF-8?q?=EB=9F=89=20=EB=B0=8F=20=EB=B2=88=ED=98=B8=20=EC=B6=9C=EB=A0=A5?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- README.md | 6 ++--- src/main/java/lotto/view/OutputView.java | 31 ++++++++++++++++++++++++ 2 files changed, 34 insertions(+), 3 deletions(-) create mode 100644 src/main/java/lotto/view/OutputView.java diff --git a/README.md b/README.md index 73f7e67ef1..b9167193bb 100644 --- a/README.md +++ b/README.md @@ -59,10 +59,10 @@ - [x] 로또 번호의 숫자 범위 검증 (1~45) - [x] 로또 번호 개수 검증 - [x] 당첨 번호 추첨 (중복되지 않는 숫자 6개와 보너스 번호 1개) -- [ ] 발행된 로또 수량 및 번호 출력 -- [ ] 사용자가 구매한 로또 번호와 당첨 번호를 비교 +- [x] 발행된 로또 수량 및 번호 출력 +- [x] 사용자가 구매한 로또 번호와 당첨 번호를 비교 - [x] 당첨 내역 계산 -- [x] 당첨 내역 출력 +- [ ] 당첨 내역 출력 - [x] 총 상금 계산 - [x] 수익률 계산 - [ ] 수익률 출력 diff --git a/src/main/java/lotto/view/OutputView.java b/src/main/java/lotto/view/OutputView.java new file mode 100644 index 0000000000..408a0f136c --- /dev/null +++ b/src/main/java/lotto/view/OutputView.java @@ -0,0 +1,31 @@ +package lotto.view; + +import lotto.enums.ErrorMessage; +import lotto.enums.Rank; +import lotto.model.Lotto; + +import java.util.List; +import java.util.Map; + +public class OutputView { + + public static void printPurchasedLotto(List lottos) { + printLottoCount(lottos); + printLottoNumbers(lottos); + } + + public static void printLottoCount(List lottos) { + System.out.println("\n" + lottos.size() + "개를 구매했습니다."); + } + + public static void printLottoNumbers(List lottos) { + if (lottos.isEmpty()) { + throw new IllegalArgumentException(ErrorMessage.LOTTO_NOT_EXIST.getMessage()); + } + + for (Lotto lotto: lottos) { + lotto.validate(lotto.getNumbers()); + System.out.println(lotto.getNumbers()); + } + } +} From f50b26f338e80e64354028332c833eb8ef0af465 Mon Sep 17 00:00:00 2001 From: Sini0206 Date: Mon, 3 Nov 2025 23:52:18 +0900 Subject: [PATCH 15/18] =?UTF-8?q?feat:=20=EC=88=98=EC=9D=B5=EB=A5=A0=20?= =?UTF-8?q?=EC=B6=9C=EB=A0=A5?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- README.md | 2 +- src/main/java/lotto/view/OutputView.java | 4 ++++ 2 files changed, 5 insertions(+), 1 deletion(-) diff --git a/README.md b/README.md index b9167193bb..b936c6628c 100644 --- a/README.md +++ b/README.md @@ -65,7 +65,7 @@ - [ ] 당첨 내역 출력 - [x] 총 상금 계산 - [x] 수익률 계산 -- [ ] 수익률 출력 +- [x] 수익률 출력 - 소수점 둘째 자리에서 반올림 (ex. 100.0%, 51.5%, 1,000,000.0%) - [ ] 사용자가 잘못된 값을 입력할 경우 `IllegalArgumentException` 발생, 에러 메시지 출력 후 그 부분부터 입력을 다시 받기 diff --git a/src/main/java/lotto/view/OutputView.java b/src/main/java/lotto/view/OutputView.java index 408a0f136c..f90247805b 100644 --- a/src/main/java/lotto/view/OutputView.java +++ b/src/main/java/lotto/view/OutputView.java @@ -28,4 +28,8 @@ public static void printLottoNumbers(List lottos) { System.out.println(lotto.getNumbers()); } } + + public static void printProfitRate(Double profitRate) { + System.out.println("총 수익률은 " + String.format("%.1f", profitRate) + "%입니다."); + } } From 06e1e1501dbd9cff158c048347526a50c683f386 Mon Sep 17 00:00:00 2001 From: Sini0206 Date: Mon, 3 Nov 2025 23:52:51 +0900 Subject: [PATCH 16/18] =?UTF-8?q?feat:=20=EB=8B=B9=EC=B2=A8=20=ED=86=B5?= =?UTF-8?q?=EA=B3=84=20=EC=B6=9C=EB=A0=A5?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- README.md | 2 +- src/main/java/lotto/view/OutputView.java | 11 ++++++++++- 2 files changed, 11 insertions(+), 2 deletions(-) diff --git a/README.md b/README.md index b936c6628c..3c321e89e0 100644 --- a/README.md +++ b/README.md @@ -62,7 +62,7 @@ - [x] 발행된 로또 수량 및 번호 출력 - [x] 사용자가 구매한 로또 번호와 당첨 번호를 비교 - [x] 당첨 내역 계산 -- [ ] 당첨 내역 출력 +- [x] 당첨 내역 출력 - [x] 총 상금 계산 - [x] 수익률 계산 - [x] 수익률 출력 diff --git a/src/main/java/lotto/view/OutputView.java b/src/main/java/lotto/view/OutputView.java index f90247805b..e841d57fd4 100644 --- a/src/main/java/lotto/view/OutputView.java +++ b/src/main/java/lotto/view/OutputView.java @@ -28,7 +28,16 @@ public static void printLottoNumbers(List lottos) { System.out.println(lotto.getNumbers()); } } - + + public static void printStatistics(double profitRate, Map rankAndCount) { + System.out.println("당첨 통계\n" + "---"); + for (Rank rank: rankAndCount.keySet()) { + System.out.println(rank.getMatchCount() + "개 일치 " + "(" + rank.getPrize() + ") " + + "- " + rankAndCount.get(rank) + "개"); + } + printProfitRate(profitRate); + } + public static void printProfitRate(Double profitRate) { System.out.println("총 수익률은 " + String.format("%.1f", profitRate) + "%입니다."); } From 2eeda412093ed4c6151d79cbf7ec0be24ba47787 Mon Sep 17 00:00:00 2001 From: Sini0206 Date: Mon, 3 Nov 2025 23:53:31 +0900 Subject: [PATCH 17/18] =?UTF-8?q?feat:=20=ED=94=84=EB=A1=9C=EA=B7=B8?= =?UTF-8?q?=EB=9E=A8=20=ED=9D=90=EB=A6=84=20=EC=A0=95=EC=9D=98?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/main/java/lotto/Application.java | 4 +- .../lotto/controller/LottoController.java | 42 +++++++++++++++++++ 2 files changed, 45 insertions(+), 1 deletion(-) create mode 100644 src/main/java/lotto/controller/LottoController.java diff --git a/src/main/java/lotto/Application.java b/src/main/java/lotto/Application.java index d190922ba4..f517cd9855 100644 --- a/src/main/java/lotto/Application.java +++ b/src/main/java/lotto/Application.java @@ -1,7 +1,9 @@ package lotto; +import lotto.controller.LottoController; + public class Application { public static void main(String[] args) { - // TODO: 프로그램 구현 + LottoController.run(); } } diff --git a/src/main/java/lotto/controller/LottoController.java b/src/main/java/lotto/controller/LottoController.java new file mode 100644 index 0000000000..4d48787795 --- /dev/null +++ b/src/main/java/lotto/controller/LottoController.java @@ -0,0 +1,42 @@ +package lotto.controller; + +import lotto.enums.Rank; +import lotto.model.Lotto; +import lotto.dto.WinnerLotto; +import lotto.service.LottoCalculator; +import lotto.service.LottoFactory; +import lotto.validator.InputValidator; +import lotto.validator.LottoValidator; +import lotto.view.InputView; +import lotto.view.OutputView; + +import java.util.List; +import java.util.Map; + +public class LottoController { + public static void run() { + int purchaseAmount = readPurchaseAmount(); + List lottos = LottoFactory.createLottos(LottoCalculator.calculateLottoAmount(purchaseAmount)); + OutputView.printPurchasedLotto(lottos); + + WinnerLotto inputLotto = readWinnerLotto(); + List ranks = LottoCalculator.getWinningRanks(lottos, inputLotto, LottoFactory.createRandomWinnerLotto()); + Map statistics = LottoCalculator.getRankStatistics(ranks); + + OutputView.printStatistics(LottoCalculator.calculateProfitRate(purchaseAmount, ranks), statistics); + } + + private static int readPurchaseAmount() { + String input = InputView.ReadInput("구입금액"); + LottoValidator.isValidPurchaseAmounts(input); + return Integer.parseInt(input); + } + + private static WinnerLotto readWinnerLotto() { + String input = InputView.ReadInput("당첨 번호"); + List winNumbers = InputView.parseNumbers(input); + input = InputView.ReadInput("보너스 번호"); + int bonus = InputValidator.validateBonusNumber(input, winNumbers); + return LottoFactory.createWinnerLotto(winNumbers, bonus); + } +} From 49dbb3f8479849c157faf418579e0f9c18018329 Mon Sep 17 00:00:00 2001 From: Sini0206 Date: Mon, 3 Nov 2025 23:53:41 +0900 Subject: [PATCH 18/18] =?UTF-8?q?chore:=20=EB=A1=9C=EB=98=90=20=ED=8C=A8?= =?UTF-8?q?=ED=82=A4=EC=A7=80=20=EC=9D=B4=EB=8F=99?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/main/java/lotto/Lotto.java | 20 -------------------- src/test/java/lotto/LottoTest.java | 1 + 2 files changed, 1 insertion(+), 20 deletions(-) delete mode 100644 src/main/java/lotto/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/test/java/lotto/LottoTest.java b/src/test/java/lotto/LottoTest.java index 309f4e50ae..c8ca9d63e1 100644 --- a/src/test/java/lotto/LottoTest.java +++ b/src/test/java/lotto/LottoTest.java @@ -1,5 +1,6 @@ package lotto; +import lotto.model.Lotto; import org.junit.jupiter.api.DisplayName; import org.junit.jupiter.api.Test;