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
109 changes: 109 additions & 0 deletions README.md
Original file line number Diff line number Diff line change
@@ -1 +1,110 @@
# java-racingcar-precourse

---
## 기능 목록

- 필요한 기능
- 경주할 자동차 이름을 입력 받는다.
- 여기에서 정규 표현식을 사용하여 사용자가 옳은 값을 입력했는지 체크
- 자동차 이름은 쉼표(,)를 기준으로 구분하며 이름은 5자 이하만 가능
- 시도할 횟수를 입력 받기
- 숫자인지 체크하기(양수)
- 입력받은 수만큼 실행
- 전진 혹은 멈춤 메소드 실행
- 전진 결과 출력 메소드 실행
- 우승자 발표

- 전진 혹은 멈춤 메소드
- 자동차를 매개변수로 받기
- 자동차 마다
- 랜덤함수를 실행
- 4이상이면 전진
- 전진결과 출력 메소드
- 자동차를 매개변수로 받기
- 자동차 이름, 전진횟수를 출력
---
## 과제 진행 요구 사항

---
- 미션은 자동차 경주 저장소를 포크하고 클론하는 것으로 시작한다.
- 기능을 구현하기 전 README.md에 구현할 기능 목록을 정리해 추가한다.
- Git의 커밋 단위는 앞 단계에서 README.md에 정리한 기능 목록 단위로 추가한다.
- AngularJS Git Commit Message Conventions을 참고해 커밋 메시지를 작성한다.
- 자세한 과제 진행 방법은 프리코스 진행 가이드 문서를 참고한다.


## 기능 요구 사항

---
초간단 자동차 경주 게임을 구현한다.

- 주어진 횟수 동안 n대의 자동차는 전진 또는 멈출 수 있다.
- 각 자동차에 이름을 부여할 수 있다. 전진하는 자동차를 출력할 때 자동차 이름을 같이 출력한다.
- 자동차 이름은 쉼표(,)를 기준으로 구분하며 이름은 5자 이하만 가능하다.
- 사용자는 몇 번의 이동을 할 것인지를 입력할 수 있어야 한다.
- 전진하는 조건은 0에서 9 사이에서 무작위 값을 구한 후 무작위 값이 4 이상일 경우이다.
- 자동차 경주 게임을 완료한 후 누가 우승했는지를 알려준다. 우승자는 한 명 이상일 수 있다.
- 우승자가 여러 명일 경우 쉼표(,)를 이용하여 구분한다.
- 사용자가 잘못된 값을 입력할 경우 IllegalArgumentException을 발생시킨 후 애플리케이션은 종료되어야 한다.

## 입출력 요구 사항

### 입력

- 경주할 자동차 이름(이름은 쉼표(,) 기준으로 구분)

```
pobi,woni,jun
```
- 시도할 횟수
```
5
```

### 출력

- 차수별 실행 결과
```
pobi : --
woni : ----
jun : ---
```
- 단독 우승자 안내 문구
```
최종 우승자 : pobi
```
- 공동 우승자 안내 문구
```
최종 우승자 : pobi, jun
```

### 실행 결과 예시
```
경주할 자동차 이름을 입력하세요.(이름은 쉼표(,) 기준으로 구분)
pobi,woni,jun
시도할 횟수는 몇 회인가요?
5

실행 결과
pobi : -
woni :
jun : -

pobi : --
woni : -
jun : --

pobi : ---
woni : --
jun : ---

pobi : ----
woni : ---
jun : ----

pobi : -----
woni : ----
jun : -----

최종 우승자 : pobi, jun
```
94 changes: 94 additions & 0 deletions src/main/java/racingcar/Application.java
Original file line number Diff line number Diff line change
@@ -1,7 +1,101 @@
package racingcar;

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

import java.util.HashMap;
import java.util.regex.Matcher;
import java.util.regex.Pattern;
import java.util.List;
import java.util.ArrayList;

public class Application {
public static void main(String[] args) {
// TODO: 프로그램 구현

System.out.println("경주할 자동차 이름을 입력하세요.(이름은 쉼표(,) 기준으로 구분)");
String nameOfCars = Console.readLine();
checkInput(nameOfCars, "string");

System.out.println("시도할 횟수는 몇 회인가요?");
String tryCountString = Console.readLine();
checkInput(tryCountString, "number");
int tryCount = Integer.parseInt(tryCountString);

HashMap<String, Integer> cars = new HashMap<String, Integer>();
for (String name : nameOfCars.split(",")) {
cars.put(name.trim(), 0);
}

System.out.println("실행 결과");
for (int i = 0; i < tryCount; i++) {
goOrStop(cars);
printRoundResult(cars);
}
printFinalWinner(cars);
}

private static void printFinalWinner(HashMap<String, Integer> cars) {
int maxValue = 0;
List<String> maxKeys = new ArrayList<>();

for (String key : cars.keySet()) {
int value = cars.get(key);

if (value > maxValue) {
maxValue = value;
maxKeys.clear();
maxKeys.add(key);
} else if (value == maxValue) {
maxKeys.add(key);
}
}

System.out.print("최종 우승자 : " + maxKeys.get(0));
for (int i = 1; i < maxKeys.size(); i++) {
System.out.print(", " + maxKeys.get(i));
}

}


private static void printRoundResult(HashMap<String, Integer> cars) {
for (String key : cars.keySet()) {
StringBuilder meter = new StringBuilder();
for (int i = 0; i < cars.get(key); i++) {
meter.append("-");
}
System.out.println(key + " : " + meter);
}
System.out.println();
}

private static void goOrStop(HashMap<String, Integer> cars) {
for (String key : cars.keySet()) {
int RandomNum = Randoms.pickNumberInRange(0, 9);
if (RandomNum >= 4) {
cars.put(key, cars.get(key) + 1);
}
}
}

static void checkInput(String stringInput, String type) {
String regex = "";

switch (type) {
case "string":
regex = "^([가-힣a-zA-Z]{1,5})(,([가-힣a-zA-Z]{1,5}))*$";
break;
case "number":
regex = "^\\d+$";
break;
}

Pattern pattern = Pattern.compile(regex);
Matcher matcher = pattern.matcher(stringInput);

if (!matcher.matches()) {
throw new IllegalArgumentException();
}
}
}