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

## 구현할 기능 목록

### 입력
- `Console.readLine()`으로 입력 받기
- ',' 구분자로 문자열 분리
- 이름은 최대 5자
- 두번 째 라인은 숫자 입력

### 전진 처리
- 각 차수별 각 차에 대하여 실행
- 'Randoms.pickNumberInRange()'으로 0~9 사이 랜덤 값 추출
- 4 이상인 경우에 대하여 무작위 전진
- 전진할 때 마다 카운트
- 각 차수마다 카운트 가장 많이 한 사람 카운트

### 결과 출력
- 총 차수에 대하여 가장 카운트 많이 한 사람 출력(중복 가능)

### 예외 처리
- 잘못된 값 입력시 IllegalArgumentException 발생
5 changes: 4 additions & 1 deletion src/main/java/racingcar/Application.java
Original file line number Diff line number Diff line change
Expand Up @@ -2,6 +2,9 @@

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

Racingcar racingcar = new Racingcar();
racingcar.run();

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

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

import java.util.*;

public class Racingcar {

public void run() {

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

System.out.println("시도할 횟수는 몇 회인가요?");
String countInput = Console.readLine();
int tryCount = validateCount(countInput);

Map<String, String> racingMap = new LinkedHashMap<>();

for(String name : carNames){
racingMap.put(name, "");
}

System.out.println("\n실행 결과");
for(int i=0; i<tryCount; i++){
executeRound(carNames, racingMap);
printRacing(racingMap);
}

printResult(racingMap);
}

private void printResult(Map<String, String> racingMap) {
List<String> winners = new ArrayList<>();
int maxDistance = findMaxDistance(racingMap);
addWinner(winners, racingMap, maxDistance);

System.out.println("최종 우승자 : " + String.join(", ", winners));
}

private void addWinner(List<String> winners, Map<String, String> racingMap, int maxDistance) {
for(String key: racingMap.keySet() ){
addIfWinner(winners, key, racingMap, maxDistance);
}
}

private void addIfWinner(List<String> winners, String name, Map<String, String> racingMap, int maxDistance) {
if(racingMap.get(name).length() == maxDistance){
winners.add(name);
}
}

private int findMaxDistance(Map<String, String> racingMap) {
int max = 0;
for(String key : racingMap.keySet()){
max = Math.max(max, racingMap.get(key).length());
}

return max;
}

private void printRacing(Map<String, String> map) {
for(String key : map.keySet()){
System.out.printf("%s : %s\n", key, map.get(key));
}
System.out.println();
}

private void executeRound(String[] carNames, Map<String, String> racingMap) {
for(String name : carNames){
int rand = Randoms.pickNumberInRange(0, 9);
boolean shouldMove = shouldMoveForward(rand);
moveCar(name, shouldMove, racingMap);
}
}

private void moveCar(String name, boolean shouldMove, Map<String, String> racingMap) {
if(shouldMove){
moveForward(name, racingMap);
}
}

private void moveForward(String name, Map<String, String> racingMap) {
racingMap.put(name, racingMap.getOrDefault(name, "")+"-");
}

private boolean shouldMoveForward(int rand) {
return rand >= 4;
}

private int validateCount(String val) {
int count = parseCount(val);
validateCountIsPositive(count);
return count;
}

private void validateCountIsPositive(int count) {
if (count < 0) {
throw new IllegalArgumentException();
}
}

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

private String[] parseAndValidateCarNames(String input) {
String[] carNames = Arrays.stream(input.split(","))
.map(String::trim)
.toArray(String[]::new);

for(String name : carNames) {
validateCarName(name);
}

return carNames;
}

private void validateCarName(String name) {
if(name.isEmpty()) {
throw new IllegalArgumentException();
}
if(name.length() > 5) {
throw new IllegalArgumentException();
}
}
}