diff --git a/src/main/java/racingcar/Application.java b/src/main/java/racingcar/Application.java index a17a52e..f1b0a18 100644 --- a/src/main/java/racingcar/Application.java +++ b/src/main/java/racingcar/Application.java @@ -1,7 +1,21 @@ package racingcar; +import java.util.List; + public class Application { public static void main(String[] args) { - // TODO: 프로그램 구현 + + InputCarName Names = new InputCarName(); + InputTotalMoves Moves = new InputTotalMoves(); + + List cars = Names.getCars(); + int MoveCount = Moves.getTotalMoves(); + System.out.println(); + + Racing race = new Racing(cars, MoveCount); + race.StartRacing(); + + OutputWinner Winner = new OutputWinner(cars); + Winner.printWinner(); } -} +} \ No newline at end of file diff --git a/src/main/java/racingcar/Car.java b/src/main/java/racingcar/Car.java new file mode 100644 index 0000000..dd60c0a --- /dev/null +++ b/src/main/java/racingcar/Car.java @@ -0,0 +1,24 @@ +package racingcar; // 이 선언이 없으면 Car 클래스를 찾지 못합니다. + + +public class Car { + private String name; + private int movement = 0; + + public Car(String name) { + this.name = name; + } + + public void Move() { + movement++; + } + + public String getName() { + return this.name; + } + + public int getMovement() { + return this.movement; + } + +} diff --git a/src/main/java/racingcar/InputCarName.java b/src/main/java/racingcar/InputCarName.java new file mode 100644 index 0000000..aa63cfd --- /dev/null +++ b/src/main/java/racingcar/InputCarName.java @@ -0,0 +1,25 @@ +package racingcar; + +import camp.nextstep.edu.missionutils.Console; + +import java.util.ArrayList; +import java.util.List; + +public class InputCarName { + + public List getCars() { + System.out.println("경주할 자동차 이름을 입력하세요.(이름은 쉼표(,) 기준으로 구분)"); + String input = Console.readLine(); + String[] names = input.split(","); + + Validator.CheckNames(names); + + List carList = new ArrayList<>(); + + for (int i = 0; i < names.length; i++) { + carList.add(new Car(names[i])); + } + + return carList; + } +} diff --git a/src/main/java/racingcar/InputTotalMoves.java b/src/main/java/racingcar/InputTotalMoves.java new file mode 100644 index 0000000..27be98f --- /dev/null +++ b/src/main/java/racingcar/InputTotalMoves.java @@ -0,0 +1,17 @@ +package racingcar; + +import camp.nextstep.edu.missionutils.Console; +import camp.nextstep.edu.missionutils.Randoms; +import java.util.ArrayList; +import java.util.List; + +public class InputTotalMoves { + public int getTotalMoves() { + System.out.println("시도할 회수는 몇회인가요?"); + String input = Console.readLine(); + + Validator.CheckCount(input); + + return Integer.parseInt(input); + } +} diff --git a/src/main/java/racingcar/OutputWinner.java b/src/main/java/racingcar/OutputWinner.java new file mode 100644 index 0000000..f2f0e70 --- /dev/null +++ b/src/main/java/racingcar/OutputWinner.java @@ -0,0 +1,26 @@ +package racingcar; + +import java.util.Comparator; +import java.util.List; + +public class OutputWinner { + private List cars; + private int boundary; + + OutputWinner(List cars) { + this.cars = cars; + } + + public void printWinner() { + cars.sort(Comparator.comparingInt(Car::getMovement).reversed()); + boundary = cars.get(0).getMovement(); + String winner = "최종 우승자 : "; + for (int i = 0; i < cars.size(); i++) { + if (cars.get(i).getMovement() == boundary) + winner += cars.get(i).getName() + ", "; + } + winner = winner.substring(0, winner.length() - 2); + System.out.println(winner); + } + +} diff --git a/src/main/java/racingcar/Racing.java b/src/main/java/racingcar/Racing.java new file mode 100644 index 0000000..b9741df --- /dev/null +++ b/src/main/java/racingcar/Racing.java @@ -0,0 +1,43 @@ +package racingcar; + +import camp.nextstep.edu.missionutils.Randoms; + +import java.util.List; + +public class Racing { + private List cars; + private int MoveCount; + + Racing(List cars, int MoveCount) { + this.cars = cars; + this.MoveCount = MoveCount; + } + + public void StartRacing() { + System.out.println("실행 결과"); + + for (int i = 0; i < MoveCount; i++) { + + playOneRound(); + printCars(); + } + } + + private void playOneRound(){ + for (Car car : cars) { + if (Randoms.pickNumberInRange(0, 9) >= 4) { + car.Move(); + } + } + } + + private void printCars() { + for (Car car : cars) { + String str = car.getName() + " : " + "-".repeat(car.getMovement()); + System.out.println(str); + } + System.out.println(); + } + + +} diff --git a/src/main/java/racingcar/Validator.java b/src/main/java/racingcar/Validator.java new file mode 100644 index 0000000..7e3c30f --- /dev/null +++ b/src/main/java/racingcar/Validator.java @@ -0,0 +1,39 @@ +package racingcar; // 이 선언이 없으면 Car 클래스를 찾지 못합니다. + +import java.util.List; // List 타입을 사용하기 위해 필요합니다. +import java.util.ArrayList; + +public class Validator { + + public static void CheckNames(String[] names) { + for (int i = 0; i < names.length; i++) { + String name = names[i]; + if (name.isEmpty()) throw new IllegalArgumentException("이름은 빈 값일 수 없습니다."); + if (name.length() > 5) throw new IllegalArgumentException("이름은 5자 이하만 가능합니다."); + if (name.contains(" ")) throw new IllegalArgumentException("이름에 공백이 포함될 수 없습니다."); + } + + for (int i = 0; i < names.length; i++) { + for (int j = i + 1; j < names.length; j++) { + if (names[i].equals(names[j])) { + throw new IllegalArgumentException("중복된 이름이 있습니다."); + } + } + } + } + + public static void CheckCount(String number) { + + int count; + + try { + count = Integer.parseInt(number); + } catch (NumberFormatException e) { + throw new IllegalArgumentException("시도 횟수는 숫자여야 합니다."); + } + + if (count <= 0) { + throw new IllegalArgumentException("시도 횟수는 1 이상이어야 합니다."); + } + } +}