From d883185be1609b3b92b2053ee050e80a9912cf22 Mon Sep 17 00:00:00 2001 From: 20011730 Date: Sun, 31 Mar 2024 20:37:32 +0900 Subject: [PATCH 1/6] =?UTF-8?q?=EC=9E=90=EB=8F=99=EC=B0=A8=20=EC=9D=B4?= =?UTF-8?q?=EB=A6=84=20=EC=9E=85=EB=A0=A5?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/main/java/RacingMain.java | 16 +++++++-- .../java/controller/RacingController.java | 20 +++++++++++ src/main/java/domain/Car.java | 34 ++++++++++++++++++ src/main/java/domain/CarName.java | 16 +++++++++ src/main/java/domain/CarPosition.java | 21 +++++++++++ src/main/java/domain/Cars.java | 36 +++++++++++++++++++ src/main/java/view/InputView.java | 21 +++++++++++ src/main/java/view/OutputView.java | 4 +++ 8 files changed, 166 insertions(+), 2 deletions(-) create mode 100644 src/main/java/controller/RacingController.java create mode 100644 src/main/java/domain/Car.java create mode 100644 src/main/java/domain/CarName.java create mode 100644 src/main/java/domain/CarPosition.java create mode 100644 src/main/java/domain/Cars.java create mode 100644 src/main/java/view/InputView.java create mode 100644 src/main/java/view/OutputView.java diff --git a/src/main/java/RacingMain.java b/src/main/java/RacingMain.java index 4394287..0764afa 100644 --- a/src/main/java/RacingMain.java +++ b/src/main/java/RacingMain.java @@ -1,7 +1,19 @@ +import controller.RacingController; + +import java.io.BufferedReader; +import java.io.IOException; +import java.io.InputStreamReader; +import java.util.Arrays; +import java.util.List; + public class RacingMain { - public static void main(String[] args) { + public static void main(String[] args) throws IOException { // TODO: MVC 패턴을 기반으로 자동차 경주 미션 구현해보기 - System.out.println("Hello, World!"); + + RacingController rcController = new RacingController(); + + rcController.run(); + } } diff --git a/src/main/java/controller/RacingController.java b/src/main/java/controller/RacingController.java new file mode 100644 index 0000000..af341d0 --- /dev/null +++ b/src/main/java/controller/RacingController.java @@ -0,0 +1,20 @@ +package controller; + +import domain.Cars; +import view.InputView; + +import java.io.BufferedReader; +import java.io.IOException; +import java.io.InputStreamReader; +import java.util.Arrays; +import java.util.List; + +public class RacingController { + + public void run() throws IOException { + Cars cars = new Cars(InputView.setCarName()); + + + } + +} diff --git a/src/main/java/domain/Car.java b/src/main/java/domain/Car.java new file mode 100644 index 0000000..a8575c4 --- /dev/null +++ b/src/main/java/domain/Car.java @@ -0,0 +1,34 @@ +package domain; + +// 자동차 +public class Car { + private static final int RANDOM_MINIMUM = 4; + private final CarName name; + private final CarPosition position; + + // 차량 초기 설정 + public Car(String name){ + this.name = new CarName(name); + this.position = new CarPosition(); + } + + // 차량 이름 반환 + public String getCarName(){ + return name.getCarName(); + } + + // 차량 위치 반환 + public int getCarPosition(){ + return position.getCarPosition(); + } + + // 차량 한칸 이동 (전진) + public void moveCar(){ + int random_number = (int)(Math.random() * 9); + + if (random_number >= RANDOM_MINIMUM){ + position.movePosition(); + } + + } +} diff --git a/src/main/java/domain/CarName.java b/src/main/java/domain/CarName.java new file mode 100644 index 0000000..fd0a456 --- /dev/null +++ b/src/main/java/domain/CarName.java @@ -0,0 +1,16 @@ +package domain; + +public class CarName { + private final String carName; + + public CarName(String name){ + if (name.length() > 5) + throw new IllegalArgumentException("[ERROR]"); + + this.carName = name; + } + + public String getCarName(){ + return carName; + } +} diff --git a/src/main/java/domain/CarPosition.java b/src/main/java/domain/CarPosition.java new file mode 100644 index 0000000..ba7ca2b --- /dev/null +++ b/src/main/java/domain/CarPosition.java @@ -0,0 +1,21 @@ +package domain; + +public class CarPosition { + private static final int START_POSITION = 0; + private int myPosition; + + public CarPosition(){ + // 자동차 초기 위치 설정 + myPosition = START_POSITION; + } + + // 차량 위치 반환 + public int getCarPosition(){ + return myPosition; + } + + // 차량 전진 + public void movePosition(){ + myPosition++; + } +} diff --git a/src/main/java/domain/Cars.java b/src/main/java/domain/Cars.java new file mode 100644 index 0000000..3e09f00 --- /dev/null +++ b/src/main/java/domain/Cars.java @@ -0,0 +1,36 @@ +package domain; + +import java.util.ArrayList; +import java.util.Arrays; +import java.util.List; + +// 자동차 모음 +public class Cars { + private final List cars; + + public Cars(List carNames){ + cars = new ArrayList<>(); + + + } + + // 차량 리스트 생성 + public void createCarList(List carNames){ + for (String carName : carNames){ + Car car = new Car(carName); + cars.add(car); + } + } + + // 차량 목록 반환 + public List getCars(){ + return cars; + } + + // 차량 목록 이동 + public void moveCars(){ + for (Car car : cars){ + car.moveCar(); + } + } +} diff --git a/src/main/java/view/InputView.java b/src/main/java/view/InputView.java new file mode 100644 index 0000000..b405075 --- /dev/null +++ b/src/main/java/view/InputView.java @@ -0,0 +1,21 @@ +package view; + +import java.io.BufferedReader; +import java.io.IOException; +import java.io.InputStreamReader; +import java.util.Arrays; +import java.util.List; + +public class InputView { + private static final BufferedReader br + = new BufferedReader(new InputStreamReader(System.in)); + + public static List setCarName() throws IOException { + System.out.println("경주할 자동차 이름을 입력하세요(이름은 쉼표(,)를 기준으로 구분)."); + + String str = br.readLine(); + List carNames = Arrays.asList(str.split(",")); + + return carNames; + } +} diff --git a/src/main/java/view/OutputView.java b/src/main/java/view/OutputView.java new file mode 100644 index 0000000..d8f9743 --- /dev/null +++ b/src/main/java/view/OutputView.java @@ -0,0 +1,4 @@ +package view; + +public class OutputView { +} From 0aade1f9d0aa16dd16ca6466dc6b52550fedb059 Mon Sep 17 00:00:00 2001 From: 20011730 Date: Sun, 31 Mar 2024 20:58:55 +0900 Subject: [PATCH 2/6] =?UTF-8?q?=EC=8B=9C=EB=8F=84=20=ED=9A=9F=EC=88=98=20?= =?UTF-8?q?=EC=9E=85=EB=A0=A5?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../java/controller/RacingController.java | 4 ++++ src/main/java/domain/CarName.java | 2 +- src/main/java/domain/Cars.java | 2 +- src/main/java/domain/TryCount.java | 24 +++++++++++++++++++ src/main/java/view/InputView.java | 11 +++++++-- 5 files changed, 39 insertions(+), 4 deletions(-) create mode 100644 src/main/java/domain/TryCount.java diff --git a/src/main/java/controller/RacingController.java b/src/main/java/controller/RacingController.java index af341d0..b0b59d1 100644 --- a/src/main/java/controller/RacingController.java +++ b/src/main/java/controller/RacingController.java @@ -1,6 +1,7 @@ package controller; import domain.Cars; +import domain.TryCount; import view.InputView; import java.io.BufferedReader; @@ -12,8 +13,11 @@ public class RacingController { public void run() throws IOException { + // 차량 이름 입력 Cars cars = new Cars(InputView.setCarName()); + // 시도 횟수 입력 + TryCount tryCount = new TryCount(InputView.setTryCount()); } diff --git a/src/main/java/domain/CarName.java b/src/main/java/domain/CarName.java index fd0a456..e53454f 100644 --- a/src/main/java/domain/CarName.java +++ b/src/main/java/domain/CarName.java @@ -4,7 +4,7 @@ public class CarName { private final String carName; public CarName(String name){ - if (name.length() > 5) + if (name.length() > 7) throw new IllegalArgumentException("[ERROR]"); this.carName = name; diff --git a/src/main/java/domain/Cars.java b/src/main/java/domain/Cars.java index 3e09f00..dbcdeab 100644 --- a/src/main/java/domain/Cars.java +++ b/src/main/java/domain/Cars.java @@ -11,7 +11,7 @@ public class Cars { public Cars(List carNames){ cars = new ArrayList<>(); - + createCarList(carNames); } // 차량 리스트 생성 diff --git a/src/main/java/domain/TryCount.java b/src/main/java/domain/TryCount.java new file mode 100644 index 0000000..68520af --- /dev/null +++ b/src/main/java/domain/TryCount.java @@ -0,0 +1,24 @@ +package domain; + +public class TryCount { + private static final int MINIMUM = 1; + private int tryCount; + + // 시도 횟수 + public TryCount(int count){ + if (count < MINIMUM) + throw new IllegalArgumentException("[ERROR]"); + + this.tryCount = count; + } + + // 시도 횟수 반환 + public int getTryCount(){ + return tryCount; + } + + // 시도 횟수 감소 + public void decreaseCount(){ + tryCount--; + } +} diff --git a/src/main/java/view/InputView.java b/src/main/java/view/InputView.java index b405075..1c29d14 100644 --- a/src/main/java/view/InputView.java +++ b/src/main/java/view/InputView.java @@ -14,8 +14,15 @@ public static List setCarName() throws IOException { System.out.println("경주할 자동차 이름을 입력하세요(이름은 쉼표(,)를 기준으로 구분)."); String str = br.readLine(); - List carNames = Arrays.asList(str.split(",")); - return carNames; + return Arrays.asList(str.split(",")); + } + + public static int setTryCount() throws IOException { + System.out.println("시도할 회수는 몇회인가요?"); + + String str = br.readLine(); + + return Integer.parseInt(str); } } From 91960d5c0652f3aa4fd79162215d4491d725069a Mon Sep 17 00:00:00 2001 From: 20011730 Date: Sun, 31 Mar 2024 21:33:08 +0900 Subject: [PATCH 3/6] =?UTF-8?q?=EC=8B=A4=ED=96=89=20=EA=B2=B0=EA=B3=BC=20?= =?UTF-8?q?=EC=B6=9C=EB=A0=A5?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/main/java/controller/RacingController.java | 13 +++++++++++++ src/main/java/view/OutputView.java | 14 ++++++++++++++ 2 files changed, 27 insertions(+) diff --git a/src/main/java/controller/RacingController.java b/src/main/java/controller/RacingController.java index b0b59d1..131422d 100644 --- a/src/main/java/controller/RacingController.java +++ b/src/main/java/controller/RacingController.java @@ -1,8 +1,10 @@ package controller; +import domain.Car; import domain.Cars; import domain.TryCount; import view.InputView; +import view.OutputView; import java.io.BufferedReader; import java.io.IOException; @@ -19,6 +21,17 @@ public void run() throws IOException { // 시도 횟수 입력 TryCount tryCount = new TryCount(InputView.setTryCount()); + printResult(cars, tryCount); + } + + public void printResult(Cars cars, TryCount tryCount){ + for (int i = 0; i < tryCount.getTryCount(); i++){ + for (Car car : cars.getCars()){ + car.moveCar(); + } + + OutputView.printRacing(cars.getCars()); + } } } diff --git a/src/main/java/view/OutputView.java b/src/main/java/view/OutputView.java index d8f9743..0f47891 100644 --- a/src/main/java/view/OutputView.java +++ b/src/main/java/view/OutputView.java @@ -1,4 +1,18 @@ package view; +import domain.Car; + +import java.util.List; + public class OutputView { + + public static void printRacing(List cars){ + for (Car car : cars){ + System.out.print(car.getCarName() + " : "); + for (int i = 0; i < car.getCarPosition(); i++) + System.out.print("-"); + System.out.println(); + } + System.out.println(); + } } From 74bfb4cfa635ac4d542303da2d56615471403edd Mon Sep 17 00:00:00 2001 From: 20011730 Date: Sun, 31 Mar 2024 22:19:44 +0900 Subject: [PATCH 4/6] =?UTF-8?q?=EC=9A=B0=EC=8A=B9=EC=9E=90=20=EC=B6=9C?= =?UTF-8?q?=EB=A0=A5?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../java/controller/RacingController.java | 6 +++++ src/main/java/domain/TryCount.java | 5 ---- src/main/java/view/InputView.java | 2 ++ src/main/java/view/OutputView.java | 23 +++++++++++++++++++ 4 files changed, 31 insertions(+), 5 deletions(-) diff --git a/src/main/java/controller/RacingController.java b/src/main/java/controller/RacingController.java index 131422d..d77c19a 100644 --- a/src/main/java/controller/RacingController.java +++ b/src/main/java/controller/RacingController.java @@ -22,8 +22,11 @@ public void run() throws IOException { TryCount tryCount = new TryCount(InputView.setTryCount()); printResult(cars, tryCount); + + findWinner(cars); } + // 결과 출력 public void printResult(Cars cars, TryCount tryCount){ for (int i = 0; i < tryCount.getTryCount(); i++){ for (Car car : cars.getCars()){ @@ -34,4 +37,7 @@ public void printResult(Cars cars, TryCount tryCount){ } } + public void findWinner(Cars cars){ + OutputView.printWinner(cars.getCars()); + } } diff --git a/src/main/java/domain/TryCount.java b/src/main/java/domain/TryCount.java index 68520af..d9a8d3e 100644 --- a/src/main/java/domain/TryCount.java +++ b/src/main/java/domain/TryCount.java @@ -16,9 +16,4 @@ public TryCount(int count){ public int getTryCount(){ return tryCount; } - - // 시도 횟수 감소 - public void decreaseCount(){ - tryCount--; - } } diff --git a/src/main/java/view/InputView.java b/src/main/java/view/InputView.java index 1c29d14..abef62a 100644 --- a/src/main/java/view/InputView.java +++ b/src/main/java/view/InputView.java @@ -10,6 +10,7 @@ public class InputView { private static final BufferedReader br = new BufferedReader(new InputStreamReader(System.in)); + // 차량 이름 입력 public static List setCarName() throws IOException { System.out.println("경주할 자동차 이름을 입력하세요(이름은 쉼표(,)를 기준으로 구분)."); @@ -18,6 +19,7 @@ public static List setCarName() throws IOException { return Arrays.asList(str.split(",")); } + // 시도 횟수 입력 public static int setTryCount() throws IOException { System.out.println("시도할 회수는 몇회인가요?"); diff --git a/src/main/java/view/OutputView.java b/src/main/java/view/OutputView.java index 0f47891..cea8fb9 100644 --- a/src/main/java/view/OutputView.java +++ b/src/main/java/view/OutputView.java @@ -1,11 +1,14 @@ package view; import domain.Car; +import domain.Cars; +import java.util.ArrayList; import java.util.List; public class OutputView { + // 결과 출력 public static void printRacing(List cars){ for (Car car : cars){ System.out.print(car.getCarName() + " : "); @@ -15,4 +18,24 @@ public static void printRacing(List cars){ } System.out.println(); } + + // 우승자 출력 + public static void printWinner(List cars){ + int max = 0; + List winners = new ArrayList<>(); + + for (Car car : cars){ + if (car.getCarPosition() > max) + max = car.getCarPosition(); + } + + for (Car car : cars){ + if (car.getCarPosition() == max) + winners.add(car.getCarName()); + } + + String winnerResult = String.join(", ", winners); + + System.out.println(winnerResult + "가 최종 우승했습니다."); + } } From 116cb27322b720b0f7971a90f3b0077a5d58dc0a Mon Sep 17 00:00:00 2001 From: 20011730 Date: Sun, 31 Mar 2024 22:20:25 +0900 Subject: [PATCH 5/6] =?UTF-8?q?=EC=9A=B0=EC=8A=B9=EC=9E=90=20=EC=B6=9C?= =?UTF-8?q?=EB=A0=A5?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/main/java/RacingMain.java | 4 ---- 1 file changed, 4 deletions(-) diff --git a/src/main/java/RacingMain.java b/src/main/java/RacingMain.java index 0764afa..c97a27a 100644 --- a/src/main/java/RacingMain.java +++ b/src/main/java/RacingMain.java @@ -1,10 +1,6 @@ import controller.RacingController; -import java.io.BufferedReader; import java.io.IOException; -import java.io.InputStreamReader; -import java.util.Arrays; -import java.util.List; public class RacingMain { From 5d18f6d7afcaf526fd34274bbdb0f28031d156e3 Mon Sep 17 00:00:00 2001 From: 20011730 Date: Sun, 31 Mar 2024 22:53:54 +0900 Subject: [PATCH 6/6] =?UTF-8?q?=ED=85=8C=EC=8A=A4=ED=8A=B8=20=EC=9E=91?= =?UTF-8?q?=EC=84=B1?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/main/java/domain/Car.java | 2 +- src/main/java/domain/CarName.java | 2 +- src/test/java/domain/CarNameTest.java | 30 ++++++++++++++++++++++++++ src/test/java/domain/CarTest.java | 23 ++++++++++++++++++++ src/test/java/domain/CarsTest.java | 19 ++++++++++++++++ src/test/java/domain/TryCountTest.java | 24 +++++++++++++++++++++ 6 files changed, 98 insertions(+), 2 deletions(-) create mode 100644 src/test/java/domain/CarNameTest.java create mode 100644 src/test/java/domain/CarTest.java create mode 100644 src/test/java/domain/CarsTest.java create mode 100644 src/test/java/domain/TryCountTest.java diff --git a/src/main/java/domain/Car.java b/src/main/java/domain/Car.java index a8575c4..eb501e5 100644 --- a/src/main/java/domain/Car.java +++ b/src/main/java/domain/Car.java @@ -29,6 +29,6 @@ public void moveCar(){ if (random_number >= RANDOM_MINIMUM){ position.movePosition(); } - + } } diff --git a/src/main/java/domain/CarName.java b/src/main/java/domain/CarName.java index e53454f..036553e 100644 --- a/src/main/java/domain/CarName.java +++ b/src/main/java/domain/CarName.java @@ -4,7 +4,7 @@ public class CarName { private final String carName; public CarName(String name){ - if (name.length() > 7) + if (name.length() > 5 || name.length() < 1) throw new IllegalArgumentException("[ERROR]"); this.carName = name; diff --git a/src/test/java/domain/CarNameTest.java b/src/test/java/domain/CarNameTest.java new file mode 100644 index 0000000..5c463a6 --- /dev/null +++ b/src/test/java/domain/CarNameTest.java @@ -0,0 +1,30 @@ +package domain; + +import org.junit.jupiter.api.DisplayName; +import org.junit.jupiter.params.ParameterizedTest; +import org.junit.jupiter.params.provider.CsvSource; + +import static org.assertj.core.api.AssertionsForClassTypes.assertThatCode; +import static org.assertj.core.api.AssertionsForClassTypes.assertThatThrownBy; + +public class CarNameTest { + @DisplayName("차량 이름은 1~5자 사이여야 한다") + @ParameterizedTest + @CsvSource(value = {"'', 차량 이름이 존재해야 합니다.", + "123456, 차량 이름은 5글자 이하여야 합니다.", + "123456789, 이름은 5글자 이하여야 합니다."}) + + void 이름_예외_발생(String carName, String errorMessage) { + assertThatThrownBy(() -> new CarName(carName)) + .isInstanceOf(IllegalArgumentException.class) + .hasMessage(errorMessage); + } + + @DisplayName("1~5글자 이름은 유효") + @ParameterizedTest + @CsvSource(value = {"1", "123", "123", "1234"}) + void 유효한_이름(String carName) { + assertThatCode(() -> new CarName(carName)) + .doesNotThrowAnyException(); + } +} diff --git a/src/test/java/domain/CarTest.java b/src/test/java/domain/CarTest.java new file mode 100644 index 0000000..de39bf5 --- /dev/null +++ b/src/test/java/domain/CarTest.java @@ -0,0 +1,23 @@ +package domain; + +import org.junit.jupiter.api.DisplayName; +import org.junit.jupiter.params.ParameterizedTest; +import org.junit.jupiter.params.provider.CsvSource; + +import static org.assertj.core.api.FactoryBasedNavigableListAssert.assertThat; + +public class CarTest { + @DisplayName("랜덤 숫자가 0~3일 때는 움직이지 않음") + @ParameterizedTest + @CsvSource(value = {"0,0", "1,0", "2,0", "3,0"}) + void 움직이지_않음(int number, int position) { + + } + + @DisplayName("랜덤 숫자가 4~9일 때는 움직임") + @ParameterizedTest + @CsvSource(value = {"4,1", "5,1", "6,1", "7,1", "8,1", "9,1"}) + void 움직임(int number, int distance) { + + } +} diff --git a/src/test/java/domain/CarsTest.java b/src/test/java/domain/CarsTest.java new file mode 100644 index 0000000..28da1dc --- /dev/null +++ b/src/test/java/domain/CarsTest.java @@ -0,0 +1,19 @@ +package domain; + +import org.junit.jupiter.api.DisplayName; +import org.junit.jupiter.params.ParameterizedTest; +import org.junit.jupiter.params.provider.CsvSource; + +import java.util.ArrayList; +import java.util.List; + +import static org.assertj.core.api.AssertionsForClassTypes.assertThatThrownBy; + +public class CarsTest { + @DisplayName("자동차 이름이 중복되면 예외 처리") + @ParameterizedTest + @CsvSource(value = {"1", "1", "2"}) + void 차량_이름_중복(int size) { + + } +} diff --git a/src/test/java/domain/TryCountTest.java b/src/test/java/domain/TryCountTest.java new file mode 100644 index 0000000..c37eba4 --- /dev/null +++ b/src/test/java/domain/TryCountTest.java @@ -0,0 +1,24 @@ +package domain; + +import org.junit.jupiter.api.DisplayName; +import org.junit.jupiter.params.ParameterizedTest; +import org.junit.jupiter.params.provider.CsvSource; + +import static org.assertj.core.api.AssertionsForClassTypes.assertThatCode; +import static org.assertj.core.api.AssertionsForClassTypes.assertThatThrownBy; + +public class TryCountTest { + @DisplayName("시도 횟수가 양의 정수면 유효") + @ParameterizedTest + @CsvSource(value = {"1", "10", "100", "1000"}) + void 시도_횟수_양수(int number) { + + } + + @DisplayName("시도 횟수가 0 이하 혹은 음수면 예외를 던진다") + @ParameterizedTest + @CsvSource(value = {"0", "-1", "-100", "-1000"}) + void 시도_횟수_음수(int number) { + + } +}