diff --git a/src/main/java/racingcar/Application.java b/src/main/java/racingcar/Application.java index a17a52e..855f48c 100644 --- a/src/main/java/racingcar/Application.java +++ b/src/main/java/racingcar/Application.java @@ -1,7 +1,28 @@ package racingcar; +import java.util.List; + public class Application { public static void main(String[] args) { - // TODO: 프로그램 구현 + try { + InputManager inputManager = new InputManager(); + OutputManager outputManager = new OutputManager(); + + List carNames = inputManager.getCarNames(); + int numberOfRounds = inputManager.getNumberOfRounds(); + + RacingGame game = new RacingGame(carNames); + + System.out.println("\n실행 결과"); + for (int i = 0; i < numberOfRounds; i++) { + game.playRound(); + outputManager.printRoundResult(game.getCars()); + } + + outputManager.printWinners(game.getWinners()); + } catch (IllegalArgumentException e) { + System.out.println("[ERROR] " + e.getMessage()); + throw e; + } } } diff --git a/src/main/java/racingcar/Car.java b/src/main/java/racingcar/Car.java new file mode 100644 index 0000000..4dd9f50 --- /dev/null +++ b/src/main/java/racingcar/Car.java @@ -0,0 +1,31 @@ +package racingcar; + +public class Car { + private final String name; + private int position = 0; + + public Car(String name) { + if (name == null || name.isBlank() || name.length() > 5) { + throw new IllegalArgumentException("자동차 이름은 1자 이상 5자 이하만 가능합니다."); + } + this.name = name; + } + + public void move(int randomNumber) { + if (randomNumber >= 4) { + position++; + } + } + + public String getName() { + return name; + } + + public int getPosition() { + return position; + } + + public String getPositionString() { + return "-".repeat(position); + } +} diff --git a/src/main/java/racingcar/InputManager.java b/src/main/java/racingcar/InputManager.java new file mode 100644 index 0000000..e6f427d --- /dev/null +++ b/src/main/java/racingcar/InputManager.java @@ -0,0 +1,34 @@ +package racingcar; + +import camp.nextstep.edu.missionutils.Console; +import java.util.Arrays; +import java.util.List; + +public class InputManager { + + public List getCarNames() { + System.out.println("경주할 자동차 이름을 입력하세요.(이름은 쉼표(,) 기준으로 구분)"); + String input = Console.readLine(); + List carNames = Arrays.asList(input.split(",")); + validateCarNames(carNames); + return carNames; + } + + public int getNumberOfRounds() { + System.out.println("시도할 회수는 몇회인가요?"); + String input = Console.readLine(); + try { + return Integer.parseInt(input); + } catch (NumberFormatException e) { + throw new IllegalArgumentException("시도 횟수는 숫자여야 합니다."); + } + } + + private void validateCarNames(List carNames) { + for (String name : carNames) { + if (name.isBlank() || name.length() > 5) { + throw new IllegalArgumentException("자동차 이름은 1자 이상 5자 이하만 가능합니다."); + } + } + } +} diff --git a/src/main/java/racingcar/OutputManager.java b/src/main/java/racingcar/OutputManager.java new file mode 100644 index 0000000..1c0bd7b --- /dev/null +++ b/src/main/java/racingcar/OutputManager.java @@ -0,0 +1,18 @@ +package racingcar; + +import java.util.List; +import java.util.stream.Collectors; + +public class OutputManager { + + public void printRoundResult(List cars) { + for (Car car : cars) { + System.out.println(car.getName() + " : " + car.getPositionString()); + } + System.out.println(); + } + + public void printWinners(List winners) { + System.out.println("최종 우승자 : " + String.join(", ", winners)); + } +} diff --git a/src/main/java/racingcar/RacingGame.java b/src/main/java/racingcar/RacingGame.java new file mode 100644 index 0000000..d755277 --- /dev/null +++ b/src/main/java/racingcar/RacingGame.java @@ -0,0 +1,38 @@ +package racingcar; + +import camp.nextstep.edu.missionutils.Randoms; +import java.util.ArrayList; +import java.util.List; +import java.util.stream.Collectors; + +public class RacingGame { + private final List cars; + + public RacingGame(List carNames) { + this.cars = carNames.stream() + .map(Car::new) + .collect(Collectors.toList()); + } + + public void playRound() { + for (Car car : cars) { + car.move(Randoms.pickNumberInRange(0, 9)); + } + } + + public List getCars() { + return cars; + } + + public List getWinners() { + int maxPosition = cars.stream() + .mapToInt(Car::getPosition) + .max() + .orElse(0); + + return cars.stream() + .filter(car -> car.getPosition() == maxPosition) + .map(Car::getName) + .collect(Collectors.toList()); + } +}