Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

[LBP] 박세은 자동차 미션 1-3단계 제출합니다. #91

Merged
merged 4 commits into from
Feb 16, 2025
Merged
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
26 changes: 26 additions & 0 deletions src/main/java/Car.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,26 @@
import java.util.Random;

public class Car {
private int position = 0;
private String carName;

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

public void tryMove() {
Random rand = new Random();
if (rand.nextInt(10) > 3) {
this.position++;
}
}

public int getPosition() {
return position;
}

public String getCarName() {
return carName;
}

}
52 changes: 52 additions & 0 deletions src/main/java/CarRace.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,52 @@
import java.util.*;
import java.util.stream.Collectors;

public class CarRace {
private final List<Car> cars = new ArrayList<>();
private List<String> carNames;
private int raceAttemptCount;
private List<String> winnerCarNames;
private final CarRaceResultPrinter printer = new CarRaceResultPrinter();

public void initializeRace() {
carNames = CarRaceInputHandler.getCarNames();
raceAttemptCount = CarRaceInputHandler.getRaceAttemptCount();
makeCarObjects();
}

private void makeCarObjects() {
for (String name : carNames) {
cars.add(new Car(name));
}
}

public void startRace() {
for (int i = 0; i < raceAttemptCount; i++) {
moveCars();
printer.printRaceResult(cars);
}
determineWinners();
printer.printWinnerCarNames(winnerCarNames);
}

private void moveCars() {
for (Car car : cars) {
car.tryMove();
}
}

private int getMaxPosition() {
return cars.stream()
.mapToInt(Car::getPosition)
.max()
.orElseThrow(NoSuchElementException::new);
}

private void determineWinners() {
winnerCarNames = cars.stream()
.filter(car -> car.getPosition() == getMaxPosition())
.map(Car::getCarName)
.collect(Collectors.toUnmodifiableList());
}

}
41 changes: 41 additions & 0 deletions src/main/java/CarRaceInputHandler.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,41 @@
import java.util.Arrays;
import java.util.List;
import java.util.Scanner;
import java.util.stream.Collectors;

public class CarRaceInputHandler {
private static final int MAX_CAR_NAME_LENGTH = 5;

public static List<String> getCarNames() {
Scanner scanner = new Scanner(System.in);
System.out.println("경주할 자동차 이름을 입력하세요(이름은 쉼표(,)를 기준으로 구분).");
String value = scanner.nextLine();

if (value.isEmpty()) {
throw new IllegalArgumentException("경주할 자동차 이름을 반드시 입력해주세요.");
}

List<String> carNames = Arrays.stream(value.split(","))
.map(String::trim)
.filter(name -> !name.isEmpty())
.distinct()
.collect(Collectors.toList());

if (carNames.isEmpty()) {
throw new IllegalArgumentException("경주할 자동차 이름을 올바르게 입력해주세요.");
}

if (carNames.stream().anyMatch(name -> name.length() > MAX_CAR_NAME_LENGTH)) {
throw new IllegalArgumentException("자동차 이름은 5글자 이하로 작성해주세요.");
}

return carNames;
}

public static int getRaceAttemptCount() {
Scanner scanner = new Scanner(System.in);
System.out.println("시도할 회수는 몇회인가요?");
return scanner.nextInt();
}

}
17 changes: 17 additions & 0 deletions src/main/java/CarRaceResultPrinter.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,17 @@
import java.util.List;

public class CarRaceResultPrinter {
public void printRaceResult(List<Car> cars) {
for (Car car : cars) {
System.out.println(car.getCarName() + " : " + "-".repeat(car.getPosition()));
}
System.out.println();
}

public void printWinnerCarNames(List<String> winnerCarNames) {
System.out.println("실행 결과");
System.out.print(String.join(", ", winnerCarNames));
System.out.println("가 최종 우승했습니다.");
}

}
8 changes: 8 additions & 0 deletions src/main/java/Main.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,8 @@
public class Main {
public static void main(String[] args) {
CarRace carRace = new CarRace();
carRace.initializeRace();
carRace.startRace();
}

}
34 changes: 34 additions & 0 deletions src/test/java/CarRaceTest.java
Original file line number Diff line number Diff line change
@@ -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();
// }
// }

}