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

Cho1ys #2381

Open
wants to merge 14 commits into
base: main
Choose a base branch
from
14 changes: 14 additions & 0 deletions docs/README.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,14 @@
1. 사용자로부터 입력을 받기
2. 입력받은 자동차 이름들을 검증하고, 중복을 제거한 후 유효한 이름 배열을 반환
3. 자동차 이름의 길이가 유효한지 확인
4. 시도 횟수가 유효한지 확인
5. 이동 및 위치 및 이름 정보 관리
6. 레이스를 진행하고 결과를 계산
7. 주어진 자동차 이름 배열로 Car 객체 배열 생성
8. 주어진 시도 횟수만큼 레이스를 진행하고 결과 출력
9. 자동차의 이동 상태를 결과에 추가
10. 레이스 결과 출력
11. 최종 우승자 계산 및 출력
12. 자동차 중 최대 위치 반환
13. 최대 위치를 가진 우승자를 찾아 반환
14. 우승자 메시지 출력
152 changes: 150 additions & 2 deletions src/main/java/racingcar/Application.java
Original file line number Diff line number Diff line change
@@ -1,7 +1,155 @@
package racingcar;

import camp.nextstep.edu.missionutils.Console;
import camp.nextstep.edu.missionutils.Randoms;

import java.util.*;

public class Application {
private static final int MIN_CAR_NAME_LENGTH = 1;
private static final int MAX_CAR_NAME_LENGTH = 5;

public static void main(String[] args) {
// TODO: 프로그램 구현
Application game = new Application();
game.start();
}

private void start() {
String inputNames = getUserInput("경주할 자동차 이름을 입력하세요 (이름은 쉼표(,)로 구분):");
String[] carNames = validateCarNames(inputNames);

int tryCount = Integer.parseInt(getUserInput("시도할 회수는 몇 회인가요?"));
validateTryCount(tryCount);

Race race = new Race(carNames, tryCount);
race.startRace();
}

private String getUserInput(String prompt) {
System.out.println(prompt);
return Console.readLine();
}


private String[] validateCarNames(String inputNames) {
String[] carNames = inputNames.split(",");
Set<String> uniqueCarNames = new HashSet<>();

for (String name : carNames) {
String trimmedName = name.trim();
validateCarNameLength(trimmedName);
uniqueCarNames.add(trimmedName);
}

if (uniqueCarNames.isEmpty()) {
throw new IllegalArgumentException("자동차 이름을 입력하세요.");
}

return uniqueCarNames.toArray(new String[0]);
}
private void validateCarNameLength(String name) {
if (name.length() < MIN_CAR_NAME_LENGTH || name.length() > MAX_CAR_NAME_LENGTH) {
throw new IllegalArgumentException("자동차 이름은 1에서 5자 사이여야 합니다.");
}
}
private void validateTryCount(int tryCount) {
if (tryCount <= 0) {
throw new IllegalArgumentException("시도 횟수는 1 이상이어야 합니다.");
}
}

public class Car {
private final String name;
private int position;

Car(String name) {
this.name = name;
this.position = 0;
}

void move() {
int randomValue = Randoms.pickNumberInRange(0, 9);
if (randomValue >= 4) {
position++;
}
}

int getPosition() {
return position;
}

String getName() {
return name;
}
}
public class Race {
private final Car[] cars;
private final int tryCount;

Race(String[] carNames, int tryCount) {
this.tryCount = tryCount;
this.cars = createCars(carNames);
}
private Car[] createCars(String[] carNames) {
Car[] cars = new Car[carNames.length];
for (int i = 0; i < carNames.length; i++) {
cars[i] = new Car(carNames[i]);
}
return cars;
}

void startRace() {
for (int tryNumber = 1; tryNumber <= tryCount; tryNumber++) {
StringBuilder raceResult = new StringBuilder("\n");
for (Car car : cars) {
car.move();
appendCarStatus(raceResult, car);
}
printRaceResult(raceResult.toString());
}
printWinners();
}

private void appendCarStatus(StringBuilder raceResult, Car car) {
raceResult.append(car.getName()).append(" : ");
for (int i = 0; i < car.getPosition(); i++) {
raceResult.append("-");
}
raceResult.append("\n");
}
private void printRaceResult(String result) {
System.out.print(result);
}

private void printWinners() {
int maxPosition = getMaxPosition();
String winners = findWinners(maxPosition);
printWinnersMessage(winners);
}

private int getMaxPosition() {
int maxPosition = 0;
for (Car car : cars) {
maxPosition = Math.max(maxPosition, car.getPosition());
}
return maxPosition;
}
private String findWinners(int maxPosition) {
List<String> winnerList = new ArrayList<>();
for (Car car : cars) {
if (car.getPosition() == maxPosition) {
winnerList.add(car.getName());
}
}
return String.join(", ", winnerList);
}
private void printWinnersMessage(String winners) {
StringBuilder result = new StringBuilder();
for (Car car : cars) {
result.append(car.getName()).append(" : - ");
}
result.append("최종 우승자 : ").append(winners);
System.out.print(result.toString() + "\n");
}
}
}
}