diff --git a/src/main/java/Car.java b/src/main/java/Car.java new file mode 100644 index 00000000..2e3b8fa8 --- /dev/null +++ b/src/main/java/Car.java @@ -0,0 +1,46 @@ +public class Car { + int position = 0; + public int carNumber; + public String carName; + + public Car() { + this.position = 0; + } + + public Car(int carNumber, String carName) { + this.carNumber = carNumber; + this.carName = carName; + } + + public int getRandom() { + double randomValue = Math.random(); + return (int) (randomValue * 9); + } + + public boolean getStatus() { + int randomValue = getRandom(); + boolean result = true; + + if (randomValue <= 3) { + result = false; + } + + return result; + } + + public void tryMove() { + if(getStatus()) { + this.position++; + } + } + + public int getPosition() { + return position; + } + + + public String getCarName() { + return carName; + } + +} diff --git a/src/main/java/CarRace.java b/src/main/java/CarRace.java new file mode 100644 index 00000000..c7c1a437 --- /dev/null +++ b/src/main/java/CarRace.java @@ -0,0 +1,77 @@ +import java.util.*; +import java.util.stream.Collectors; + +public class CarRace { + private final List cars = new ArrayList<>(); + List carNames; + int raceAttemptCount; + List winnerCarNames; + + public void receiveCarNamesInput() { + Scanner scanner = new Scanner(System.in); + + System.out.println("경주할 자동차 이름을 입력하세요(이름은 쉼표(,)를 기준으로 구분)."); + String value = scanner.nextLine(); + if(value.isEmpty()) { + throw new IllegalArgumentException("경주할 자동차의 이름을 반드시 입력해주세요."); + } + carNames = Arrays.asList(value.split(",")); + + if(carNames.stream().anyMatch(cn -> cn.length()>5)) { + throw new IllegalArgumentException("자동차 이름은 5글자 이하로 작성해주세요."); + } + + } + + public void recieveCarRaceAttemptCountInput() { + Scanner scanner = new Scanner(System.in); + + System.out.println("시도할 회수는 몇회인가요?"); + raceAttemptCount = scanner.nextInt(); + } + + public void makeCarObject(int sizeOfList) { + for(int i = 0; i < sizeOfList; i++) { + cars.add(new Car(i, carNames.get(i))); + } + } + + public void moveCars() { + for (Car car : cars) { + car.tryMove(); + } + } + + public void doRace(int count) { + System.out.println("실행 결과"); + for (int i = 0; i < count; i++) { + moveCars(); + printRaceResult(); + } + } + + public void printRaceResult() { + for (Car car : cars) { + System.out.println(car.getCarName() + " : " + "-".repeat(car.getPosition())); + } + System.out.println(); + } + + public void setWinnerCarNames() { + int maxPosition = cars.stream() + .max(Comparator.comparingInt(Car::getPosition)) + .orElseThrow(NoSuchElementException::new) + .getPosition(); + + winnerCarNames = cars.stream() + .filter(c -> c.getPosition() == maxPosition) + .map(Car::getCarName) + .collect(Collectors.toList()); + } + + public void printWinnerCarNames() { + System.out.print(String.join(", ", winnerCarNames)); + System.out.println("가 최종 우승했습니다."); + } + +} diff --git a/src/main/java/Main.java b/src/main/java/Main.java new file mode 100644 index 00000000..92541ab7 --- /dev/null +++ b/src/main/java/Main.java @@ -0,0 +1,13 @@ +public class Main { + public static void main(String[] args) { + CarRace cr = new CarRace(); + + cr.receiveCarNamesInput(); + cr.recieveCarRaceAttemptCountInput(); + cr.makeCarObject(cr.carNames.size()); + cr.doRace(cr.raceAttemptCount); + cr.setWinnerCarNames(); + cr.printWinnerCarNames(); + } + +} diff --git a/src/test/java/CarRaceTest.java b/src/test/java/CarRaceTest.java new file mode 100644 index 00000000..c3a96a82 --- /dev/null +++ b/src/test/java/CarRaceTest.java @@ -0,0 +1,34 @@ +import org.junit.jupiter.api.DisplayName; +import org.junit.jupiter.api.Nested; +import org.junit.jupiter.api.Test; +import java.util.ArrayList; +import java.util.Arrays; +import static org.assertj.core.api.AssertionsForClassTypes.assertThatCode; + +public class CarRaceTest { + + private final CarRace cr = new CarRace(); + private final Car car = new Car(); + + @Nested + class testRace { + + @Test + @DisplayName("랜덤 값에 따라 true, false 반환하고 doesNotThrowAnyException 예외 발생 여부를 확인한다.") + void shouldReturnStatusOfCarRaceTest() { + System.out.println("3이하 false, 4이상 true : " + car.getStatus()); + assertThatCode(car::getStatus).doesNotThrowAnyException(); + } + + @Test + @DisplayName("자동차 경주 결과를 반환하고 doesNotThrowAnyException 예외 발생 여부를 확인한다.") + void shouldReturnResultOfCarRaceTest() { + cr.carNames = new ArrayList<>(Arrays.asList("neo", "brie", "brown")); + cr.raceAttemptCount = 5; + cr.makeCarObject(cr.carNames.size()); + cr.doRace(cr.raceAttemptCount); + assertThatCode(cr::setWinnerCarNames).doesNotThrowAnyException(); + } + } + +}