diff --git a/src/main/java/Controller/CarRaceController.java b/src/main/java/Controller/CarRaceController.java new file mode 100644 index 00000000..113d86d4 --- /dev/null +++ b/src/main/java/Controller/CarRaceController.java @@ -0,0 +1,39 @@ +package Controller; + +import Model.Car; +import View.Output; +import View.Validation; + +import java.util.ArrayList; + +public class CarRaceController { + Validation validation = new Validation(); + Output output = new Output(); + ArrayList carList; // 자동차 이름 + int cnt; // 횟수 + + public void run() { + // 입력한 값 검증 (자동차 이름, 횟수) + carList = validation.carNameException(); + cnt = validation.countException(); + + // 자동차 경주수행 + runRace(); + + // 결과 출력 + output.printFinalWinner(carList); + } + + public void runRace() { + System.out.println("\n실행결과"); + + int i=0; + while (i < cnt) { + for (Car car : carList) { + car.move(); + } + i++; + output.printRslt(carList); + } + } +} diff --git a/src/main/java/Model/Car.java b/src/main/java/Model/Car.java new file mode 100644 index 00000000..29acba03 --- /dev/null +++ b/src/main/java/Model/Car.java @@ -0,0 +1,53 @@ +package Model; + +import java.util.Random; + +public class Car { + + private String name; + public int distance; + + public String getName() { + return name; + } + + public void setName(String name) { + this.name = name; + } + + public int getDistance() { + return distance; + } + + public void setDistance(int distance) { + this.distance = distance; + } + + public Car(String name) { + this.name = name; + this.distance = 0; + } + + public void move() { + Random rand = new Random(); + int n = rand.nextInt(10); + if(n >= 4) { + distance++; + } + } + + public void move(int N) { + if(N >= 4) { + distance++; + } + } + + public String toString() { + String str = ""; + + for(int i=0; i < distance; i++) { + str = str.concat("-"); + } + return name + " : " + str; + } +} diff --git a/src/main/java/SpringApplication.java b/src/main/java/SpringApplication.java new file mode 100644 index 00000000..be26cec6 --- /dev/null +++ b/src/main/java/SpringApplication.java @@ -0,0 +1,8 @@ +import Controller.CarRaceController; + +public class SpringApplication { + public static void main(String[] args) { + CarRaceController carRaceController = new CarRaceController(); + carRaceController.run(); + } +} diff --git a/src/main/java/View/Input.java b/src/main/java/View/Input.java new file mode 100644 index 00000000..f9fb1151 --- /dev/null +++ b/src/main/java/View/Input.java @@ -0,0 +1,52 @@ +package View; + +import Model.Car; + +import java.util.ArrayList; +import java.util.Scanner; +import java.util.StringTokenizer; + +import static java.lang.System.*; + +public class Input { + Scanner sc = new Scanner(System.in); + + public ArrayList getName() throws Exception { + String carName; + ArrayList carList= new ArrayList(); + + System.out.println("경주할 자동차 이름을 입력하세요. (이름은 쉼표(,) 기준으로 구분)"); + + try { + carName = sc.next(); + } catch (Exception e) { + throw new IllegalArgumentException(); + } + + StringTokenizer stk = new StringTokenizer(carName, ","); + while (stk.hasMoreTokens()) { + String token = stk.nextToken(); + + // 자동차 이름이 5자 이상일 경우 예외처리 + if(token.length() > 5) { + throw new Exception("[ERROR] NAME CAN BE UP TO 5 CHARACTERS LONG"); + } + carList.add(new Car(token)); + } + + return carList; + } + + public int getCount() { + System.out.println("시도할 횟수는 몇회인가요?"); + + int cntNum; + + try{ + cntNum = sc.nextInt(); + } catch (Exception e) { + throw new IllegalArgumentException(); + } + return cntNum; + } +} diff --git a/src/main/java/View/Output.java b/src/main/java/View/Output.java new file mode 100644 index 00000000..89371a0a --- /dev/null +++ b/src/main/java/View/Output.java @@ -0,0 +1,37 @@ +package View; + +import Model.Car; +import java.util.ArrayList; + +public class Output { + + public void printRslt(ArrayList carList) { + for (Car car : carList) { + System.out.println(car.toString()); + } + System.out.println(" "); + } + + public void printFinalWinner(ArrayList carList) { + ArrayList winnerList = new ArrayList<>(); + int maxDist = carList.get(0).getDistance(); + + for (Car car : carList) { + if(maxDist > car.getDistance()) continue; + if(maxDist < car.getDistance()) { + winnerList.clear(); + maxDist = car.getDistance(); + } + winnerList.add(car.getName()); + } + + System.out.print("최종 우승자 : "); + + for(int i=0; i carNameException(){ + Input input = new Input(); + + while(true){ + try { + return input.getName(); + } catch (IllegalArgumentException e) { + System.out.println("[ERROR] WRONG DATA INPUT!"); + } catch (Exception e) { + System.out.println(e.getMessage()); + } + } + } + + public int countException() { + while(true){ + Input input = new Input(); + try { + return input.getCount(); + } catch (IllegalArgumentException e) { + System.out.println("[ERROR] WRONG DATA INPUT!"); + } + } + } +} diff --git a/src/test/java/carRace/carRaceTest.java b/src/test/java/carRace/carRaceTest.java new file mode 100644 index 00000000..6386cb52 --- /dev/null +++ b/src/test/java/carRace/carRaceTest.java @@ -0,0 +1,51 @@ +package carRace; + +import Model.Car; +import View.Input; +import org.junit.jupiter.api.BeforeEach; +import org.junit.jupiter.api.Test; + +import static org.assertj.core.api.Assertions.assertThat; + +public class carRaceTest { + + public Car car; + public Input input; + + @BeforeEach + void setUp() { + car = new Car(""); + car.setName("TEST"); + } + + // 초기화 테스트 + @Test + void initializationTest() { + car.setName("TEST"); + car.setDistance(3); + assertThat(car.getName()).isEqualTo("TEST"); + assertThat(car.getDistance()).isEqualTo(3); + } + + // 차량이동 테스트 + @Test + void moveTest() { + car.setName("TEST"); + car.setDistance(4); + assertThat(car.toString()).isEqualTo("TEST : ----"); + } + + // 4 이상에서 전진하는지 테스트 + @Test + void moveAboveFourTest() { + car.move(4); + assertThat(car.getDistance()).isEqualTo(1); + + car.move(2); + assertThat(car.getDistance()).isEqualTo(1); + + car.move(8); + assertThat(car.getDistance()).isEqualTo(2); + } + +}