diff --git a/README.md b/README.md index 5fa2560b46..9fc6e55510 100644 --- a/README.md +++ b/README.md @@ -1 +1,23 @@ # java-lotto-precourse + +## 기능 목록 +1. **로또 구입 금액 입력 기능** + - 사용자에게 로또 구입 금액을 입력받고, 1,000원 단위로 나누어 떨어지는지 검증한다. + +2. **로또 번호 생성 기능** + - 로또 티켓을 구입할 수량을 계산하고, 티켓 당 중복되지 않는 6개의 번호와 하나의 보너스 번호를 생성하여 저장한다. + +3. **로또 번호 출력 기능** + - 사용자가 구입한 로또 티켓의 번호들을 오름차순으로 정렬하여 출력한다. + +4. **당첨 번호 입력 기능** + - 사용자에게 당첨 번호와 보너스 번호를 입력받고, 각각의 유효성을 검증한다. + +5. **당첨 결과 계산 기능** + - 사용자가 구입한 로또 번호와 당첨 번호를 비교하여 일치하는 번호 개수를 계산하고, 보너스 번호 일치 여부를 확인한다. + +6. **당첨 통계 출력 기능** + - 일치하는 번호 개수에 따라 등수를 계산하고, 등수별로 당첨 내역과 총 수익률을 출력한다. + +7. **예외 처리 기능** + - 잘못된 입력 값에 대해 예외를 처리하고, "[ERROR]"로 시작하는 에러 메시지를 출력한다. diff --git a/java-lotto-7 b/java-lotto-7 new file mode 160000 index 0000000000..99b1964798 --- /dev/null +++ b/java-lotto-7 @@ -0,0 +1 @@ +Subproject commit 99b196479883400e460aec0c89ca28e4cdd34549 diff --git a/src/main/java/lotto/Application.java b/src/main/java/lotto/Application.java index d190922ba4..da896a2a96 100644 --- a/src/main/java/lotto/Application.java +++ b/src/main/java/lotto/Application.java @@ -1,7 +1,103 @@ package lotto; +import camp.nextstep.edu.missionutils.Console; +import java.util.ArrayList; +import java.util.List; + public class Application { public static void main(String[] args) { - // TODO: 프로그램 구현 + System.out.println("구입금액을 입력해 주세요."); + int purchaseAmount = Integer.parseInt(Console.readLine()); + + try { + if (purchaseAmount % 1000 != 0) { + throw new IllegalArgumentException("[ERROR] 구입 금액은 1,000원 단위여야 합니다."); + } + int ticketCount = purchaseAmount / 1000; + System.out.println(ticketCount + "개를 구매했습니다."); + } catch (IllegalArgumentException e) { + System.out.println(e.getMessage()); + } + + List tickets = new ArrayList<>(); + for (int i = 0; i < ticketCount; i++) { + tickets.add(new Lotto(LottoMachine.drawNumbers())); + } + + System.out.println("당첨 번호를 입력해 주세요."); + List winningNumbers = parseNumbers(Console.readLine()); + + System.out.println("보너스 번호를 입력해 주세요."); + int bonusNumber = Integer.parseInt(Console.readLine()); + + LottoResult result = new LottoResult(); + for (Lotto ticket : tickets) { + int matchCount = (int) ticket.getNumbers().stream() + .filter(winningNumbers::contains).count(); + boolean bonusMatch = ticket.getNumbers().contains(bonusNumber); + result.addResult(LottoRank.valueOf(matchCount, bonusMatch)); + } + + printResult(result, purchaseAmount); + private static List parseNumbers(String input) { + String[] tokens = input.split(","); + List numbers = new ArrayList<>(); + for (String token : tokens) { + numbers.add(Integer.parseInt(token.trim())); + } + return numbers; + } + + private static void printResult(LottoResult result, int purchaseAmount) { + System.out.println("당첨 통계\n---"); + for (LottoRank rank : LottoRank.values()) { + if (rank == LottoRank.NONE) continue; + System.out.println(rank.name() + " - " + result.getResult().getOrDefault(rank, 0) + "개"); + } + System.out.printf("총 수익률은 %.1f%%입니다.\n", result.calculateProfitRate(purchaseAmount)); + } + + + } +} + +private static List parseNumbers(String input) { + String[] tokens = input.split(","); + List numbers = new ArrayList<>(); + for (String token : tokens) { + numbers.add(Integer.parseInt(token.trim())); } + return numbers; } + +private static void printResult(LottoResult result, int purchaseAmount) { + System.out.println("당첨 통계\n---"); + for (LottoRank rank : LottoRank.values()) { + if (rank == LottoRank.NONE) continue; + System.out.println(rank.name() + " - " + result.getResult().getOrDefault(rank, 0) + "개"); + } + System.out.printf("총 수익률은 %.1f%%입니다.\n", result.calculateProfitRate(purchaseAmount)); +} + +import java.util.HashMap; +import java.util.Map; + +public class LottoResult { + private final Map result = new HashMap<>(); + + public void addResult(LottoRank rank) { + result.put(rank, result.getOrDefault(rank, 0) + 1); + } + + public double calculateProfitRate(int purchaseAmount) { + int totalPrize = result.entrySet().stream() + .mapToInt(entry -> entry.getKey().getPrize() * entry.getValue()) + .sum(); + return (double) totalPrize / purchaseAmount * 100; + } + + public Map getResult() { + return result; + } +} + diff --git a/src/main/java/lotto/Lotto.java b/src/main/java/lotto/Lotto.java index 88fc5cf12b..f24f7b2375 100644 --- a/src/main/java/lotto/Lotto.java +++ b/src/main/java/lotto/Lotto.java @@ -1,5 +1,5 @@ package lotto; - +import java.util.Collections; import java.util.List; public class Lotto { @@ -7,6 +7,7 @@ public class Lotto { public Lotto(List numbers) { validate(numbers); + Collections.sort(numbers); // 번호를 오름차순으로 정렬 this.numbers = numbers; } @@ -14,7 +15,16 @@ private void validate(List numbers) { if (numbers.size() != 6) { throw new IllegalArgumentException("[ERROR] 로또 번호는 6개여야 합니다."); } + if (numbers.stream().anyMatch(num -> num < 1 || num > 45)) { + throw new IllegalArgumentException("[ERROR] 로또 번호는 1부터 45 사이의 숫자여야 합니다."); + } + if (numbers.stream().distinct().count() != numbers.size()) { + throw new IllegalArgumentException("[ERROR] 로또 번호는 중복될 수 없습니다."); + } } - // TODO: 추가 기능 구현 + public List getNumbers() { + return numbers; + } } + diff --git a/src/main/java/lotto/lottomachine.java b/src/main/java/lotto/lottomachine.java new file mode 100644 index 0000000000..29a86a24ec --- /dev/null +++ b/src/main/java/lotto/lottomachine.java @@ -0,0 +1,16 @@ +import camp.nextstep.edu.missionutils.Randoms; +import java.util.List; + +public class LottoMachine { + public static List drawNumbers() { + return Randoms.pickUniqueNumbersInRange(1, 45, 6); + } + + public static int drawBonusNumber(List mainNumbers) { + int bonusNumber; + do { + bonusNumber = Randoms.pickNumberInRange(1, 45); + } while (mainNumbers.contains(bonusNumber)); + return bonusNumber; + } +} \ No newline at end of file