-
Notifications
You must be signed in to change notification settings - Fork 829
Expand file tree
/
Copy pathRacingcar.java
More file actions
133 lines (105 loc) · 3.82 KB
/
Copy pathRacingcar.java
File metadata and controls
133 lines (105 loc) · 3.82 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
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();
}
}
}