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
2 changes: 2 additions & 0 deletions .gitignore
Original file line number Diff line number Diff line change
Expand Up @@ -31,3 +31,5 @@ out/
### VS Code ###
.vscode/
.DS_Store
bin/
*.class
Binary file added bin/main/racingcar/Application.class
Binary file not shown.
Binary file added bin/test/racingcar/ApplicationTest.class
Binary file not shown.
3 changes: 2 additions & 1 deletion src/main/java/racingcar/Application.java
Original file line number Diff line number Diff line change
Expand Up @@ -2,6 +2,7 @@

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

public class Car {

private final String name;
private int position;

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

public void move(int number, int threshold) {
if (number >= threshold) {
position++;
}
}

public String getName() {
return name;
}

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

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

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

public class RacingGame {

private static final int MAX_CAR_NAME_LENGTH = 5;
private static final int MIN_TRY_COUNT = 1;
private static final int RANDOM_START = 0;
private static final int RANDOM_END = 9;
private static final int MOVE_THRESHOLD = 4;

public void start() {
List<Car> cars = createCars();
int tryCount = inputTryCount();

System.out.print('\n');
System.out.println("실행 결과");

for (int i = 0; i < tryCount; i++) {
moveCars(cars);
printCars(cars);
}

printWinners(cars);
}

private List<Car> createCars() {
System.out.println("경주할 자동차 이름을 입력하세요.(이름은 쉼표(,) 기준으로 구분)");
String input = Console.readLine();
String[] names = input.split(",");

validateNames(names);

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

private int inputTryCount() {
System.out.println("시도할 회수는 몇회인가요?");
String input = Console.readLine();
int count = parseTryCount(input);

if (count < MIN_TRY_COUNT) {
throw new IllegalArgumentException();
}

return count;
}

private int parseTryCount(String input) {
try {
return Integer.parseInt(input);
} catch (NumberFormatException e) {
throw new IllegalArgumentException();
}
}

private void validateNames(String[] names) {
List<String> used = new ArrayList<>();

for (String name : names) {
validateName(name);

if (used.contains(name)) {
throw new IllegalArgumentException();
}
used.add(name);
}
}

private void validateName(String name) {
if (name.isEmpty()) {
throw new IllegalArgumentException();
}

if (name.chars().anyMatch(Character::isWhitespace)) {
throw new IllegalArgumentException();
}

if (name.length() > MAX_CAR_NAME_LENGTH) {
throw new IllegalArgumentException();
}
}

private void moveCars(List<Car> cars) {
for (Car car : cars) {
int number = Randoms.pickNumberInRange(RANDOM_START, RANDOM_END);
car.move(number, MOVE_THRESHOLD);
}
}

private void printCars(List<Car> cars) {
for (Car car : cars) {
System.out.println(car.getName() + " : " + "-".repeat(car.getPosition()));
}
System.out.print('\n');
}

private void printWinners(List<Car> cars) {
int max = findMaxPosition(cars);
List<String> winners = findWinners(cars, max);
System.out.println("최종 우승자 : " + String.join(", ", winners));
}

private int findMaxPosition(List<Car> cars) {
int max = 0;
for (Car car : cars) {
max = Math.max(max, car.getPosition());
}
return max;
}

private List<String> findWinners(List<Car> cars, int max) {
List<String> winners = new ArrayList<>();

for (Car car : cars) {
if (car.getPosition() == max) {
winners.add(car.getName());
}
}

return winners;
}
}