diff --git a/README.md b/README.md index d0286c859f..b0fc807a2e 100644 --- a/README.md +++ b/README.md @@ -1 +1,34 @@ -# java-racingcar-precourse +![img.png](img.png) + +# 프리코스 2주차 과제 - 자동차 경주 + +--- + +> 우아한 테크코스 7기 프리코스 2주차 과제 자동차 경주를 구현한 저장소입니다. + + +![img_1.png](img_1.png) + + + +## 기능목록 + +--- + +### 입력된 자동차들을 등록 + +- Map 으로 자동차의 이름과 전진 횟수를 저장 +- 이름은 5자 이하로 제한 +- 자동차들은 쉼표로 구분 + +### 시도할 횟수를 입력받아 반복 처리 + +- 넘겨받은 횟수 만큼 반복 처리 +- 차수별로 실행 결과를 출력 + +### 전진 조건을 검증하는 로직 구현 +- 0,9 사이에서 무작위로 추출한 값이 4 이상이면 전진, 아니면 정지 + +### 모든 차수 완료 후 우승자 안내 문구 출력 +- 가장 많은 전진 횟수를 기록한 자동차를 반환 +- 공동 우승자일 경우도 처리 \ No newline at end of file diff --git a/img.png b/img.png new file mode 100644 index 0000000000..340acf0630 Binary files /dev/null and b/img.png differ diff --git a/img_1.png b/img_1.png new file mode 100644 index 0000000000..7a3146e9f9 Binary files /dev/null and b/img_1.png differ diff --git a/src/main/java/racingcar/Application.java b/src/main/java/racingcar/Application.java index a17a52e724..801a74a62f 100644 --- a/src/main/java/racingcar/Application.java +++ b/src/main/java/racingcar/Application.java @@ -1,7 +1,15 @@ package racingcar; +import racingcar.config.AppConfig; +import racingcar.manager.RacingManager; + public class Application { + + public static void main(String[] args) { // TODO: 프로그램 구현 + AppConfig appConfig = new AppConfig(); + RacingCarLauncher racingCarLauncher = appConfig.racingCarLauncher(); + racingCarLauncher.start(); } } diff --git a/src/main/java/racingcar/RacingCarLauncher.java b/src/main/java/racingcar/RacingCarLauncher.java new file mode 100644 index 0000000000..e4c6dd187b --- /dev/null +++ b/src/main/java/racingcar/RacingCarLauncher.java @@ -0,0 +1,27 @@ +package racingcar; + +import camp.nextstep.edu.missionutils.Console; +import racingcar.manager.RacingManager; + +public class RacingCarLauncher { + + private final RacingManager racingManager; + + public RacingCarLauncher(RacingManager racingManager) { + this.racingManager = racingManager; + } + + public void start() { + System.out.println("경주할 자동차 이름을 입력하세요. 이름은 쉼표(,) 기준으로 구분"); + String carNames = Console.readLine(); + racingManager.registerCars(carNames); + + System.out.println("시도할 횟수는 몇 회인가요?"); + String count = Console.readLine(); + racingManager.race(count); + + racingManager.presentWinner(); + } + + +} diff --git a/src/main/java/racingcar/config/AppConfig.java b/src/main/java/racingcar/config/AppConfig.java new file mode 100644 index 0000000000..1368c87c17 --- /dev/null +++ b/src/main/java/racingcar/config/AppConfig.java @@ -0,0 +1,13 @@ +package racingcar.config; + +import racingcar.RacingCarLauncher; +import racingcar.manager.RacingManager; + +public class AppConfig { + + public RacingCarLauncher racingCarLauncher(){ + RacingManager racingManager = new RacingManager(); + return new RacingCarLauncher(racingManager); + } + +} diff --git a/src/main/java/racingcar/manager/RacingManager.java b/src/main/java/racingcar/manager/RacingManager.java new file mode 100644 index 0000000000..7a3f25fce0 --- /dev/null +++ b/src/main/java/racingcar/manager/RacingManager.java @@ -0,0 +1,62 @@ +package racingcar.manager; + +import camp.nextstep.edu.missionutils.Randoms; +import racingcar.model.Car; + +import java.util.ArrayList; +import java.util.List; + +public class RacingManager { + + private final List cars = new ArrayList<>(); + + public void registerCars(String carNames) { + + String[] split = carNames.split(","); + + for (String carName : split) { + + isDuplicatedName(carName); + cars.add(Car.of(carName)); + } + } + + public void race(String count) { + int parsedCount = Integer.parseInt(count); + System.out.println("실행 결과"); + + for (int i = 0; i < parsedCount; i++) { + cars.forEach( + car -> { + int picked = Randoms.pickNumberInRange(0, 9); + if (picked >= 4) { + car.move(); + } + System.out.println(car.getName() + " : " + car.getForwardMark()); + } + ); + System.out.println(); + } + } + + public void presentWinner() { + + int max = cars.stream().mapToInt(car -> car.getForward()).max().orElse(0); + + List winners = new ArrayList<>(); + + for(Car car : cars){ + if (car.getForward() == max) { + winners.add(car.getName()); + } + } + System.out.println("최종 우승자 : " + String.join(", ", winners)); + } + + private void isDuplicatedName(String carName) { + if (cars.stream().anyMatch(car -> car.getName().equals(carName))) { + throw new IllegalArgumentException("자동차 이름은 중복이 안됩니다."); + } + } + +} diff --git a/src/main/java/racingcar/model/Car.java b/src/main/java/racingcar/model/Car.java new file mode 100644 index 0000000000..83d1c108ea --- /dev/null +++ b/src/main/java/racingcar/model/Car.java @@ -0,0 +1,38 @@ +package racingcar.model; + +public class Car { + + private final static String FORWARD_MARK = "-"; + private String name; + private int forward; + + private Car(String name) { + if(name.length() > 5){ + throw new IllegalArgumentException("자동차 이름은 5자를 초과할 수 없습니다."); + } + this.name = name; + this.forward = 0; + } + + public static Car of(String name) { + return new Car(name); + } + + public String getName(){ + return name; + } + + public int getForward(){ + return forward; + } + + public String getForwardMark(){ + return FORWARD_MARK.repeat(forward); + } + + public void move(){ + forward++; + } + + +} diff --git a/src/test/java/racingcar/manager/RacingManagerTest.java b/src/test/java/racingcar/manager/RacingManagerTest.java new file mode 100644 index 0000000000..feb20c13a8 --- /dev/null +++ b/src/test/java/racingcar/manager/RacingManagerTest.java @@ -0,0 +1,19 @@ +package racingcar.manager; + +import org.junit.jupiter.api.Test; +import racingcar.config.AppConfig; + +import static org.junit.jupiter.api.Assertions.*; + +class RacingManagerTest { + + @Test + void racingManagerTest() { + RacingManager racingManager = new RacingManager(); + racingManager.registerCars("CarA,CarB,CarC"); + + racingManager.race("3"); + + racingManager.presentWinner(); + } +} \ No newline at end of file