diff --git a/docs/README.md b/docs/README.md index e69de29..dadf7b3 100644 --- a/docs/README.md +++ b/docs/README.md @@ -0,0 +1,26 @@ +1. 주어진 횟수 동안 n대의 자동차는 전진 또는 멈출 수 있다. +2. 각 자동차에 이름을 부여할 수 있다. 전진하는 자동차를 출력할 때 자동차 이름을 같이 출력한다. +3. 자동차 이름은 쉼표(,)를 기준으로 구분하며 이름은 5자 이하만 가능하다. +4. 사용자는 몇 번의 이동을 할 것인지를 입력할 수 있어야 한다. +5. 전진하는 조건은 0에서 9 사이에서 무작위 값을 구한 후 무작위 값이 4 이상일 경우이다. +6. 자동차 경주 게임을 완료한 후 누가 우승했는지를 알려준다. 우승자는 한 명 이상일 수 있다. +7. 우승자가 여러 명일 경우 쉼표(,)를 이용하여 구분한다. +8. 사용자가 잘못된 값을 입력할 경우 IllegalArgumentException을 발생시킨 후 애플리케이션은 종료되어야 한다. + + +Car class / Validator class / main(사용자 입출력/게임 실행) +1. Car +- 이름/위치 정보 +- move, getter 메서드 + +2. Validator +- 자동차 이름 입력값 검사 +- 횟수 입력값 검사 + +3. main +- 사용자로부터 입력받음 +- Validator로 검사 +- Car 객체 생성-> 레이스 동작 +- 결과 출력 + + diff --git a/src/main/java/racingcar/Application.java b/src/main/java/racingcar/Application.java index a17a52e..272d047 100644 --- a/src/main/java/racingcar/Application.java +++ b/src/main/java/racingcar/Application.java @@ -1,7 +1,69 @@ package racingcar; +import java.util.ArrayList; +import java.util.List; +import camp.nextstep.edu.missionutils.Console; + + +//3. main +//- 입력받음 -> Validator로 검사 +//- Car 객체 생성/레이스 동작 +//- 결과 출력 public class Application { public static void main(String[] args) { - // TODO: 프로그램 구현 + //1.사용자로부터 이름/횟수 입력받기 -> 검사 + System.out.println("경주할 자동차 이름을 입력하세요.(이름은 쉼표(,) 기준으로 구분)"); + String names = Console.readLine(); //내부적으로 Scanner.nextLine()과 동일하게 작동 + Validator.validateCarName(names); + + System.out.println("시도할 회수는 몇회인가요?"); + String times = Console.readLine(); + int tryCount = Validator.validateTry(times); + + //2.Car 객체 리스트 생성 + String[] nameList = names.split(",",-1); + List racingCars= new ArrayList<>(); + for (String name: nameList){ + racingCars.add(new Car(name)); + } + //4. 결과 출력(실행 결과, 최종 우승자) + System.out.println("\n실행 결과"); + for (int i = 0; i maxPosition) { + maxPosition = car.getPosition(); //최고 거리 갱신 + } + } + List winners = new ArrayList<>(); + for (Car car : racingCars) { + if (car.getPosition() == maxPosition) { + winners.add(car.getName()); + } + } + System.out.println("최종 우승자 : " + String.join(", ", winners)); + + + + + + + + + + + } } diff --git a/src/main/java/racingcar/Car.java b/src/main/java/racingcar/Car.java new file mode 100644 index 0000000..bd645ac --- /dev/null +++ b/src/main/java/racingcar/Car.java @@ -0,0 +1,34 @@ +package racingcar; + +import camp.nextstep.edu.missionutils.Randoms; + +/*Car +- 이름/위치 정보 +- move, getter 메서드*/ + +public class Car { + private final String name; + private int position; + + //정보를 넘겨받아 필드에 저장(생성자) + public Car(String name){ + this.name = name; + this.position = 0; + } + + //동작: move 메서드 + public int move(){ + if (Randoms.pickNumberInRange(0,9) >=4){ + position++; + } + return position; + } + + //현재 이름/위치 반환: getter 메서드 넘겨주기 위해 + public String getName(){ + return name; + } + public int getPosition(){ + return position; + } +} diff --git a/src/main/java/racingcar/Validator.java b/src/main/java/racingcar/Validator.java new file mode 100644 index 0000000..ab75826 --- /dev/null +++ b/src/main/java/racingcar/Validator.java @@ -0,0 +1,49 @@ +package racingcar; +import java.util.HashSet; +import java.util.Set; + +/*2. Validator +- 자동차 이름 입력값 검사 +- 횟수 입력값 검사*/ + + +public class Validator { + //이름 입력 검사 + public static String validateCarName(String names){ + if(names.isBlank()){ //1. 전체 검사 + throw new IllegalArgumentException("이름 입력값이 공백이거나 존재하지 않습니다."); + } + //입력을 ,를 기준으로 자른다. 배열로 저장. + String [] nameList = names.split(",",-1); + int name_max = 5; + Set equalNames = new HashSet<>(); //자바에서 문자열 중복 검사는 HashSet을 사용하면 편리하다. + //2. 개별 입력에 대한 검사 + for(String name:nameList){ + if(name.length() > 5) { //2.1 이름 길이 + throw new IllegalArgumentException("자동차 이름은 5자 이하로 입력해주세요."); + } + if(name.isBlank() || name.contains(" ")){ //2.2 이름 빈 값/공백 + throw new IllegalArgumentException(); + }if(!equalNames.add(name)){ //2.3 이름 중복 검사 + throw new IllegalArgumentException("자동차 이름은 중복될 수 없습니다."); + } + } + return names; + + } + + //시도 횟수 검사 + public static int validateTry(String times){ + int count; + try{ + count = Integer.parseInt(times); //Integer.parseInt(문자)일 경우, NumberException 에러 발생 ->try/catch + }catch(NumberFormatException e){ + throw new IllegalArgumentException("시도 횟수를 숫자로 입력해주세요."); + } + if (count < 1) { + throw new IllegalArgumentException("시도 횟수는 1 이상이어야 합니다."); + } + return count; + } + +} diff --git a/src/test/java/racingcar/ApplicationTest.java b/src/test/java/racingcar/ApplicationTest.java index 03aa74b..d89d605 100644 --- a/src/test/java/racingcar/ApplicationTest.java +++ b/src/test/java/racingcar/ApplicationTest.java @@ -19,7 +19,7 @@ class ApplicationTest extends NsTest { run("pobi,woni", "1"); assertThat(output()).contains("pobi : -", "woni : ", "최종 우승자 : pobi"); }, - MOVING_FORWARD, STOP + MOVING_FORWARD, STOP //난수 반환 설정 ); }