diff --git a/README.md b/README.md index d0286c859f..37e3cdf6d8 100644 --- a/README.md +++ b/README.md @@ -1 +1,22 @@ # java-racingcar-precourse + +## 구현할 기능 목록 + +### 입력 +- `Console.readLine()`으로 입력 받기 +- ',' 구분자로 문자열 분리 +- 이름은 최대 5자 +- 두번 째 라인은 숫자 입력 + +### 전진 처리 +- 각 차수별 각 차에 대하여 실행 +- 'Randoms.pickNumberInRange()'으로 0~9 사이 랜덤 값 추출 +- 4 이상인 경우에 대하여 무작위 전진 +- 전진할 때 마다 카운트 +- 각 차수마다 카운트 가장 많이 한 사람 카운트 + +### 결과 출력 + - 총 차수에 대하여 가장 카운트 많이 한 사람 출력(중복 가능) + +### 예외 처리 +- 잘못된 값 입력시 IllegalArgumentException 발생 diff --git a/src/main/java/racingcar/Application.java b/src/main/java/racingcar/Application.java index a17a52e724..303f95afda 100644 --- a/src/main/java/racingcar/Application.java +++ b/src/main/java/racingcar/Application.java @@ -2,6 +2,9 @@ public class Application { public static void main(String[] args) { - // TODO: 프로그램 구현 + + Racingcar racingcar = new Racingcar(); + racingcar.run(); + } } diff --git a/src/main/java/racingcar/Racingcar.java b/src/main/java/racingcar/Racingcar.java new file mode 100644 index 0000000000..8abbc04a64 --- /dev/null +++ b/src/main/java/racingcar/Racingcar.java @@ -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 racingMap = new LinkedHashMap<>(); + + for(String name : carNames){ + racingMap.put(name, ""); + } + + System.out.println("\n실행 결과"); + for(int i=0; i racingMap) { + List winners = new ArrayList<>(); + int maxDistance = findMaxDistance(racingMap); + addWinner(winners, racingMap, maxDistance); + + System.out.println("최종 우승자 : " + String.join(", ", winners)); + } + + private void addWinner(List winners, Map racingMap, int maxDistance) { + for(String key: racingMap.keySet() ){ + addIfWinner(winners, key, racingMap, maxDistance); + } + } + + private void addIfWinner(List winners, String name, Map racingMap, int maxDistance) { + if(racingMap.get(name).length() == maxDistance){ + winners.add(name); + } + } + + private int findMaxDistance(Map racingMap) { + int max = 0; + for(String key : racingMap.keySet()){ + max = Math.max(max, racingMap.get(key).length()); + } + + return max; + } + + private void printRacing(Map 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 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 racingMap) { + if(shouldMove){ + moveForward(name, racingMap); + } + } + + private void moveForward(String name, Map 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(); + } + } +}