diff --git a/README.md b/README.md index d0286c859f..17f2663c3b 100644 --- a/README.md +++ b/README.md @@ -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 +``` \ No newline at end of file diff --git a/src/main/java/racingcar/Application.java b/src/main/java/racingcar/Application.java index a17a52e724..417b92fa1e 100644 --- a/src/main/java/racingcar/Application.java +++ b/src/main/java/racingcar/Application.java @@ -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 cars = new HashMap(); + 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 cars) { + int maxValue = 0; + List 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 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 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(); + } } }