From 47f6f1a171b5596446107c21109ad1592c13164a Mon Sep 17 00:00:00 2001 From: hyun0618 <163616398+hyun0618@users.noreply.github.com> Date: Mon, 27 Oct 2025 22:36:15 +0900 Subject: [PATCH 1/7] Update README.md --- README.md | 10 +++++++++- 1 file changed, 9 insertions(+), 1 deletion(-) diff --git a/README.md b/README.md index d0286c859f..d355363234 100644 --- a/README.md +++ b/README.md @@ -1 +1,9 @@ -# java-racingcar-precourse +## 기능 목록 + +1. 경주할 자동차 이름을 입력받는다. (이름은 쉼표로, 각 이름은 5자 이하) +2. 시도할 횟수를 입력받는다. (양의 정수) +3. 각 자동차가 0~9 중에 4 이상이면 전진한다. +4. 매 시도마다 자동차의 이동 결과를 출력한다. +5. 모든 시도 후 최종 우승자를 출력한다. (공동 우승자는 쉼표로 구분) +6. 잘못된 입력 시 IllegalArgumentException 발생 후 프로그램 종료. + From 69e40e54212601cf13102cc5e311fd41623bc406 Mon Sep 17 00:00:00 2001 From: hyun0618 Date: Mon, 27 Oct 2025 22:54:53 +0900 Subject: [PATCH 2/7] =?UTF-8?q?feat:=20=EA=B2=BD=EC=A3=BC=ED=95=A0=20?= =?UTF-8?q?=EC=9E=90=EB=8F=99=EC=B0=A8=20=EC=9D=B4=EB=A6=84=EC=9D=84=20?= =?UTF-8?q?=EC=9E=85=EB=A0=A5=EB=B0=9B=EA=B3=A0=20=EA=B2=80=EC=A6=9D?= =?UTF-8?q?=ED=95=98=EB=8A=94=20=EA=B8=B0=EB=8A=A5=20=EC=B6=94=EA=B0=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/main/java/racingcar/view/InputView.java | 19 +++++++++++++++++++ 1 file changed, 19 insertions(+) create mode 100644 src/main/java/racingcar/view/InputView.java diff --git a/src/main/java/racingcar/view/InputView.java b/src/main/java/racingcar/view/InputView.java new file mode 100644 index 0000000000..dd3d9b82ca --- /dev/null +++ b/src/main/java/racingcar/view/InputView.java @@ -0,0 +1,19 @@ +package racingcar.view; + +import camp.nextstep.edu.missionutils.Console; + +public class InputView { + public static String[] readCarNames() { + System.out.println("경주할 자동차 이름을 입력하세요.(이름은 쉼표(,) 기준으로 구분)"); + String input = Console.readLine(); + String[] names = input.split(","); + + for (String name : names) { + String trimmed = name.trim(); + if (trimmed.isEmpty() || trimmed.length() > 5) { + throw new IllegalArgumentException("자동차 이름은 1~5자여야 합니다: " + trimmed); + } + } + return names; + } +} From 855419e19afde6626ec72b8d978bf5abfd2be6aa Mon Sep 17 00:00:00 2001 From: hyun0618 Date: Mon, 27 Oct 2025 23:14:14 +0900 Subject: [PATCH 3/7] feat: add attempt count input --- src/main/java/racingcar/view/InputView.java | 15 +++++++++++++++ 1 file changed, 15 insertions(+) diff --git a/src/main/java/racingcar/view/InputView.java b/src/main/java/racingcar/view/InputView.java index dd3d9b82ca..03ee3de40b 100644 --- a/src/main/java/racingcar/view/InputView.java +++ b/src/main/java/racingcar/view/InputView.java @@ -16,4 +16,19 @@ public static String[] readCarNames() { } return names; } + + public static int readAttemptCount() { + System.out.println("시도할 횟수는 몇 회인가요?"); + String input = Console.readLine(); + + try { + int count = Integer.parseInt(input.trim()); + if (count <= 0) { + throw new IllegalArgumentException("시도 횟수는 1 이상의 정수여야 합니다."); + } + return count; + } catch (NumberFormatException e) { + throw new IllegalArgumentException("시도 횟수는 숫자로 입력해야 합니다."); + } + } } From aebb05ebe722391bb3ae2ef745f4ddd19ab18b86 Mon Sep 17 00:00:00 2001 From: hyun0618 Date: Mon, 27 Oct 2025 23:16:35 +0900 Subject: [PATCH 4/7] feat: add car movement logic based on random number --- src/main/java/racingcar/domain/Car.java | 29 +++++++++++++++++++++++++ 1 file changed, 29 insertions(+) create mode 100644 src/main/java/racingcar/domain/Car.java diff --git a/src/main/java/racingcar/domain/Car.java b/src/main/java/racingcar/domain/Car.java new file mode 100644 index 0000000000..70dd292567 --- /dev/null +++ b/src/main/java/racingcar/domain/Car.java @@ -0,0 +1,29 @@ +package racingcar.domain; + +import camp.nextstep.edu.missionutils.Randoms; + +public class Car { + private static final int MOVE_THRESHOLD = 4; + + private final String name; + private int position = 0; + + public Car(String name) { + this.name = name; + } + + public void move() { + int randomNumber = Randoms.pickNumberInRange(0, 9); + if (randomNumber >= MOVE_THRESHOLD) { + position++; + } + } + + public String getName() { + return name; + } + + public int getPosition() { + return position; + } +} From 4865ad7dc8148d170001583627f4559b14ce5172 Mon Sep 17 00:00:00 2001 From: hyun0618 Date: Mon, 27 Oct 2025 23:21:17 +0900 Subject: [PATCH 5/7] feat: print race rount result --- src/main/java/racingcar/view/OutputView.java | 19 +++++++++++++++++++ 1 file changed, 19 insertions(+) create mode 100644 src/main/java/racingcar/view/OutputView.java diff --git a/src/main/java/racingcar/view/OutputView.java b/src/main/java/racingcar/view/OutputView.java new file mode 100644 index 0000000000..5db6efdd4b --- /dev/null +++ b/src/main/java/racingcar/view/OutputView.java @@ -0,0 +1,19 @@ +package racingcar.view; + +import racingcar.domain.Car; +import java.util.List; + +public class OutputView { + + public static void printRoundResult(List cars) { + for (Car car : cars) { + String progress = "-".repeat(car.getPosition()); + System.out.println(car.getName() + " : " + progress); + } + System.out.println(); + } + + public static void printResultTitle() { + System.out.println("\n실행 결과"); + } +} From 972f9fcc635e1e76c903dbab8d65dcef99886d08 Mon Sep 17 00:00:00 2001 From: hyun0618 Date: Mon, 27 Oct 2025 23:26:21 +0900 Subject: [PATCH 6/7] feat: print final winners after all rounds --- src/main/java/racingcar/domain/Cars.java | 32 ++++++++++++++++++++ src/main/java/racingcar/view/OutputView.java | 7 +++++ 2 files changed, 39 insertions(+) create mode 100644 src/main/java/racingcar/domain/Cars.java diff --git a/src/main/java/racingcar/domain/Cars.java b/src/main/java/racingcar/domain/Cars.java new file mode 100644 index 0000000000..d50add8e7b --- /dev/null +++ b/src/main/java/racingcar/domain/Cars.java @@ -0,0 +1,32 @@ +package racingcar.domain; + +import java.util.ArrayList; +import java.util.Collections; +import java.util.List; + +public class Cars { + private final List cars; + + public Cars(List cars) { + this.cars = cars; + } + + public List getCars() { + return Collections.unmodifiableList(cars); + } + + public List getWinners() { + int maxPosition = cars.stream() + .mapToInt(Car::getPosition) + .max() + .orElse(0); + + List winners = new ArrayList<>(); + for (Car car : cars) { + if (car.getPosition() == maxPosition) { + winners.add(car.getName()); + } + } + return winners; + } +} diff --git a/src/main/java/racingcar/view/OutputView.java b/src/main/java/racingcar/view/OutputView.java index 5db6efdd4b..8ebecb5a27 100644 --- a/src/main/java/racingcar/view/OutputView.java +++ b/src/main/java/racingcar/view/OutputView.java @@ -2,6 +2,7 @@ import racingcar.domain.Car; import java.util.List; +import java.util.stream.Collectors; public class OutputView { @@ -16,4 +17,10 @@ public static void printRoundResult(List cars) { public static void printResultTitle() { System.out.println("\n실행 결과"); } + + public static void printWinners(List winners) { + String result = winners.stream() + .collect(Collectors.joining(", ")); + System.out.println("최종 우승자 : " + result); + } } From b13ca048474a035f164da3669c81d632697f2e26 Mon Sep 17 00:00:00 2001 From: hyun0618 Date: Mon, 27 Oct 2025 23:49:30 +0900 Subject: [PATCH 7/7] feat: controller --- src/main/java/racingcar/Application.java | 5 ++- .../controller/RacingController.java | 39 +++++++++++++++++++ 2 files changed, 43 insertions(+), 1 deletion(-) create mode 100644 src/main/java/racingcar/controller/RacingController.java diff --git a/src/main/java/racingcar/Application.java b/src/main/java/racingcar/Application.java index a17a52e724..56bacad74a 100644 --- a/src/main/java/racingcar/Application.java +++ b/src/main/java/racingcar/Application.java @@ -1,7 +1,10 @@ package racingcar; +import racingcar.controller.RacingController; + public class Application { public static void main(String[] args) { - // TODO: 프로그램 구현 + RacingController controller = new RacingController(); + controller.run(); } } diff --git a/src/main/java/racingcar/controller/RacingController.java b/src/main/java/racingcar/controller/RacingController.java new file mode 100644 index 0000000000..86098dd5b4 --- /dev/null +++ b/src/main/java/racingcar/controller/RacingController.java @@ -0,0 +1,39 @@ +package racingcar.controller; + +import racingcar.domain.Car; +import racingcar.domain.Cars; +import racingcar.view.InputView; +import racingcar.view.OutputView; + +import java.util.ArrayList; +import java.util.List; + +public class RacingController { + public void run() { + + String[] names = InputView.readCarNames(); + int attemptCount = InputView.readAttemptCount(); + + + List carList = new ArrayList<>(); + for (String name : names) { + carList.add(new Car(name.trim())); + } + Cars cars = new Cars(carList); + + + OutputView.printResultTitle(); + + + for (int i = 0; i < attemptCount; i++) { + for (Car car : cars.getCars()) { + car.move(); + } + OutputView.printRoundResult(cars.getCars()); + } + + + OutputView.printWinners(cars.getWinners()); + } + +}