diff --git a/docs/README.md b/docs/README.md index e69de29bb2d..1e9182ac525 100644 --- a/docs/README.md +++ b/docs/README.md @@ -0,0 +1,14 @@ +1. 사용자로부터 입력을 받기 +2. 입력받은 자동차 이름들을 검증하고, 중복을 제거한 후 유효한 이름 배열을 반환 +3. 자동차 이름의 길이가 유효한지 확인 +4. 시도 횟수가 유효한지 확인 +5. 이동 및 위치 및 이름 정보 관리 +6. 레이스를 진행하고 결과를 계산 +7. 주어진 자동차 이름 배열로 Car 객체 배열 생성 +8. 주어진 시도 횟수만큼 레이스를 진행하고 결과 출력 +9. 자동차의 이동 상태를 결과에 추가 +10. 레이스 결과 출력 +11. 최종 우승자 계산 및 출력 +12. 자동차 중 최대 위치 반환 +13. 최대 위치를 가진 우승자를 찾아 반환 +14. 우승자 메시지 출력 \ No newline at end of file diff --git a/src/main/java/racingcar/Application.java b/src/main/java/racingcar/Application.java index a17a52e7242..10cd186a5e5 100644 --- a/src/main/java/racingcar/Application.java +++ b/src/main/java/racingcar/Application.java @@ -1,7 +1,155 @@ package racingcar; +import camp.nextstep.edu.missionutils.Console; +import camp.nextstep.edu.missionutils.Randoms; + +import java.util.*; + public class Application { + private static final int MIN_CAR_NAME_LENGTH = 1; + private static final int MAX_CAR_NAME_LENGTH = 5; + public static void main(String[] args) { - // TODO: 프로그램 구현 + Application game = new Application(); + game.start(); + } + + private void start() { + String inputNames = getUserInput("경주할 자동차 이름을 입력하세요 (이름은 쉼표(,)로 구분):"); + String[] carNames = validateCarNames(inputNames); + + int tryCount = Integer.parseInt(getUserInput("시도할 회수는 몇 회인가요?")); + validateTryCount(tryCount); + + Race race = new Race(carNames, tryCount); + race.startRace(); + } + + private String getUserInput(String prompt) { + System.out.println(prompt); + return Console.readLine(); + } + + + private String[] validateCarNames(String inputNames) { + String[] carNames = inputNames.split(","); + Set uniqueCarNames = new HashSet<>(); + + for (String name : carNames) { + String trimmedName = name.trim(); + validateCarNameLength(trimmedName); + uniqueCarNames.add(trimmedName); + } + + if (uniqueCarNames.isEmpty()) { + throw new IllegalArgumentException("자동차 이름을 입력하세요."); + } + + return uniqueCarNames.toArray(new String[0]); + } + private void validateCarNameLength(String name) { + if (name.length() < MIN_CAR_NAME_LENGTH || name.length() > MAX_CAR_NAME_LENGTH) { + throw new IllegalArgumentException("자동차 이름은 1에서 5자 사이여야 합니다."); + } + } + private void validateTryCount(int tryCount) { + if (tryCount <= 0) { + throw new IllegalArgumentException("시도 횟수는 1 이상이어야 합니다."); + } + } + + public class Car { + private final String name; + private int position; + + Car(String name) { + this.name = name; + this.position = 0; + } + + void move() { + int randomValue = Randoms.pickNumberInRange(0, 9); + if (randomValue >= 4) { + position++; + } + } + + int getPosition() { + return position; + } + + String getName() { + return name; + } + } + public class Race { + private final Car[] cars; + private final int tryCount; + + Race(String[] carNames, int tryCount) { + this.tryCount = tryCount; + this.cars = createCars(carNames); + } + private Car[] createCars(String[] carNames) { + Car[] cars = new Car[carNames.length]; + for (int i = 0; i < carNames.length; i++) { + cars[i] = new Car(carNames[i]); + } + return cars; + } + + void startRace() { + for (int tryNumber = 1; tryNumber <= tryCount; tryNumber++) { + StringBuilder raceResult = new StringBuilder("\n"); + for (Car car : cars) { + car.move(); + appendCarStatus(raceResult, car); + } + printRaceResult(raceResult.toString()); + } + printWinners(); + } + + private void appendCarStatus(StringBuilder raceResult, Car car) { + raceResult.append(car.getName()).append(" : "); + for (int i = 0; i < car.getPosition(); i++) { + raceResult.append("-"); + } + raceResult.append("\n"); + } + private void printRaceResult(String result) { + System.out.print(result); + } + + private void printWinners() { + int maxPosition = getMaxPosition(); + String winners = findWinners(maxPosition); + printWinnersMessage(winners); + } + + private int getMaxPosition() { + int maxPosition = 0; + for (Car car : cars) { + maxPosition = Math.max(maxPosition, car.getPosition()); + } + return maxPosition; + } + private String findWinners(int maxPosition) { + List winnerList = new ArrayList<>(); + for (Car car : cars) { + if (car.getPosition() == maxPosition) { + winnerList.add(car.getName()); + } + } + return String.join(", ", winnerList); + } + private void printWinnersMessage(String winners) { + StringBuilder result = new StringBuilder(); + for (Car car : cars) { + result.append(car.getName()).append(" : - "); + } + result.append("최종 우승자 : ").append(winners); + System.out.print(result.toString() + "\n"); + } } -} + } \ No newline at end of file