Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
10 changes: 9 additions & 1 deletion README.md
Original file line number Diff line number Diff line change
@@ -1 +1,9 @@
# java-racingcar-precourse
## 기능 목록

1. 경주할 자동차 이름을 입력받는다. (이름은 쉼표로, 각 이름은 5자 이하)
2. 시도할 횟수를 입력받는다. (양의 정수)
3. 각 자동차가 0~9 중에 4 이상이면 전진한다.
4. 매 시도마다 자동차의 이동 결과를 출력한다.
5. 모든 시도 후 최종 우승자를 출력한다. (공동 우승자는 쉼표로 구분)
6. 잘못된 입력 시 IllegalArgumentException 발생 후 프로그램 종료.

5 changes: 4 additions & 1 deletion src/main/java/racingcar/Application.java
Original file line number Diff line number Diff line change
@@ -1,7 +1,10 @@
package racingcar;

import racingcar.controller.RacingController;

public class Application {
public static void main(String[] args) {
// TODO: 프로그램 구현
RacingController controller = new RacingController();
controller.run();
}
}
39 changes: 39 additions & 0 deletions src/main/java/racingcar/controller/RacingController.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,39 @@
package racingcar.controller;

import racingcar.domain.Car;
import racingcar.domain.Cars;
import racingcar.view.InputView;
import racingcar.view.OutputView;

import java.util.ArrayList;
import java.util.List;

public class RacingController {
public void run() {

String[] names = InputView.readCarNames();
int attemptCount = InputView.readAttemptCount();


List<Car> carList = new ArrayList<>();
for (String name : names) {
carList.add(new Car(name.trim()));
}
Cars cars = new Cars(carList);


OutputView.printResultTitle();


for (int i = 0; i < attemptCount; i++) {
for (Car car : cars.getCars()) {
car.move();
}
OutputView.printRoundResult(cars.getCars());
}


OutputView.printWinners(cars.getWinners());
}

}
29 changes: 29 additions & 0 deletions src/main/java/racingcar/domain/Car.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,29 @@
package racingcar.domain;

import camp.nextstep.edu.missionutils.Randoms;

public class Car {
private static final int MOVE_THRESHOLD = 4;

private final String name;
private int position = 0;

public Car(String name) {
this.name = name;
}

public void move() {
int randomNumber = Randoms.pickNumberInRange(0, 9);
if (randomNumber >= MOVE_THRESHOLD) {
position++;
}
}

public String getName() {
return name;
}

public int getPosition() {
return position;
}
}
32 changes: 32 additions & 0 deletions src/main/java/racingcar/domain/Cars.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,32 @@
package racingcar.domain;

import java.util.ArrayList;
import java.util.Collections;
import java.util.List;

public class Cars {
private final List<Car> cars;

public Cars(List<Car> cars) {
this.cars = cars;
}

public List<Car> getCars() {
return Collections.unmodifiableList(cars);
}

public List<String> getWinners() {
int maxPosition = cars.stream()
.mapToInt(Car::getPosition)
.max()
.orElse(0);

List<String> winners = new ArrayList<>();
for (Car car : cars) {
if (car.getPosition() == maxPosition) {
winners.add(car.getName());
}
}
return winners;
}
}
34 changes: 34 additions & 0 deletions src/main/java/racingcar/view/InputView.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,34 @@
package racingcar.view;

import camp.nextstep.edu.missionutils.Console;

public class InputView {
public static String[] readCarNames() {
System.out.println("경주할 자동차 이름을 입력하세요.(이름은 쉼표(,) 기준으로 구분)");
String input = Console.readLine();
String[] names = input.split(",");

for (String name : names) {
String trimmed = name.trim();
if (trimmed.isEmpty() || trimmed.length() > 5) {
throw new IllegalArgumentException("자동차 이름은 1~5자여야 합니다: " + trimmed);
}
}
return names;
}

public static int readAttemptCount() {
System.out.println("시도할 횟수는 몇 회인가요?");
String input = Console.readLine();

try {
int count = Integer.parseInt(input.trim());
if (count <= 0) {
throw new IllegalArgumentException("시도 횟수는 1 이상의 정수여야 합니다.");
}
return count;
} catch (NumberFormatException e) {
throw new IllegalArgumentException("시도 횟수는 숫자로 입력해야 합니다.");
}
}
}
26 changes: 26 additions & 0 deletions src/main/java/racingcar/view/OutputView.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,26 @@
package racingcar.view;

import racingcar.domain.Car;
import java.util.List;
import java.util.stream.Collectors;

public class OutputView {

public static void printRoundResult(List<Car> cars) {
for (Car car : cars) {
String progress = "-".repeat(car.getPosition());
System.out.println(car.getName() + " : " + progress);
}
System.out.println();
}

public static void printResultTitle() {
System.out.println("\n실행 결과");
}

public static void printWinners(List<String> winners) {
String result = winners.stream()
.collect(Collectors.joining(", "));
System.out.println("최종 우승자 : " + result);
}
}