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
26 changes: 26 additions & 0 deletions docs/README.md
Original file line number Diff line number Diff line change
@@ -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 객체 생성-> 레이스 동작
- 결과 출력


64 changes: 63 additions & 1 deletion src/main/java/racingcar/Application.java
Original file line number Diff line number Diff line change
@@ -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 <Car> racingCars= new ArrayList<>();
for (String name: nameList){
racingCars.add(new Car(name));
}
//4. 결과 출력(실행 결과, 최종 우승자)
System.out.println("\n실행 결과");
for (int i = 0; i<tryCount; i++){
for(Car car : racingCars){
car.move();
System.out.print(car.getName() + " : ");
for(int j = 0; j < car.getPosition(); j++){
System.out.print("-");
}
System.out.println();
}
System.out.println();

}
//최종 우승자
int maxPosition = 0; //최고 거리
for (Car car : racingCars){
if (car.getPosition() > maxPosition) {
maxPosition = car.getPosition(); //최고 거리 갱신
}
}
List<String> winners = new ArrayList<>();
for (Car car : racingCars) {
if (car.getPosition() == maxPosition) {
winners.add(car.getName());
}
}
System.out.println("최종 우승자 : " + String.join(", ", winners));











}
}
34 changes: 34 additions & 0 deletions src/main/java/racingcar/Car.java
Original file line number Diff line number Diff line change
@@ -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;
}
}
49 changes: 49 additions & 0 deletions src/main/java/racingcar/Validator.java
Original file line number Diff line number Diff line change
@@ -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<String> 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;
}

}
2 changes: 1 addition & 1 deletion src/test/java/racingcar/ApplicationTest.java
Original file line number Diff line number Diff line change
Expand Up @@ -19,7 +19,7 @@ class ApplicationTest extends NsTest {
run("pobi,woni", "1");
assertThat(output()).contains("pobi : -", "woni : ", "최종 우승자 : pobi");
},
MOVING_FORWARD, STOP
MOVING_FORWARD, STOP //난수 반환 설정
);
}

Expand Down