From 2df5592e9eecf69e1aee5278bdd72bcb52d1f82b Mon Sep 17 00:00:00 2001 From: TwooTwoo Date: Wed, 12 Feb 2025 19:31:45 +0900 Subject: [PATCH 1/4] =?UTF-8?q?1=EB=8B=A8=EA=B3=84-=EC=9B=80=EC=A7=81?= =?UTF-8?q?=EC=9D=B4=EB=8A=94=20=EC=9E=90=EB=8F=99=EC=B0=A8=20=EA=B5=AC?= =?UTF-8?q?=ED=98=84?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/main/java/CarRase.java | 14 ++++++++++++++ 1 file changed, 14 insertions(+) create mode 100644 src/main/java/CarRase.java diff --git a/src/main/java/CarRase.java b/src/main/java/CarRase.java new file mode 100644 index 00000000..57afd83c --- /dev/null +++ b/src/main/java/CarRase.java @@ -0,0 +1,14 @@ +public class CarRase { + + public int getRandom() { + double randomValue = Math.random(); + return (int) (randomValue * 9); + } + + public boolean getStatus() { + int randomValue = getRandom(); + boolean result = rsandomValue > 3; + + return result; + } +} \ No newline at end of file From 53b15fe083ee3a62b9f6cc6b47037344359e01b7 Mon Sep 17 00:00:00 2001 From: TwooTwoo Date: Thu, 13 Feb 2025 15:52:48 +0900 Subject: [PATCH 2/4] =?UTF-8?q?2=EB=8B=A8=EA=B3=84-=EC=9A=B0=EC=8A=B9=20?= =?UTF-8?q?=EC=9E=90=EB=8F=99=EC=B0=A8=20=EA=B5=AC=ED=95=98=EA=B8=B0=20?= =?UTF-8?q?=EA=B5=AC=ED=98=84?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/main/java/Car.java | 42 ++++++++++++++++++++++++++++++++++ src/main/java/CarRace.java | 37 ++++++++++++++++++++++++++++++ src/main/java/CarRase.java | 14 ------------ src/test/java/CarRaceTest.java | 21 +++++++++++++++++ 4 files changed, 100 insertions(+), 14 deletions(-) create mode 100644 src/main/java/Car.java create mode 100644 src/main/java/CarRace.java delete mode 100644 src/main/java/CarRase.java create mode 100644 src/test/java/CarRaceTest.java diff --git a/src/main/java/Car.java b/src/main/java/Car.java new file mode 100644 index 00000000..447a306c --- /dev/null +++ b/src/main/java/Car.java @@ -0,0 +1,42 @@ +public class Car { + int position = 0; + public int carNumber; + + public Car(int carNumber) { + this.carNumber = carNumber; + } + + // 0~9 랜덤값 구하기 + public int getRandom() { + double randomValue = Math.random(); + return (int) (randomValue * 9); + } + + // 3이하 정지, 4이상 전진 + public boolean canMoveForward() { + int randomValue = getRandom(); + boolean result = true; + + if (randomValue <= 3) { + result = false; + } + + return result; + } + + // 전진 시도 + public void tryMove() { + if(canMoveForward()) { + this.position++; + } + } + + public int getPosition() { + return position; + } + + public int getCarNumber() { + return carNumber; + } + +} diff --git a/src/main/java/CarRace.java b/src/main/java/CarRace.java new file mode 100644 index 00000000..76b7bc3a --- /dev/null +++ b/src/main/java/CarRace.java @@ -0,0 +1,37 @@ +import java.util.ArrayList; +import java.util.List; +import java.util.Comparator; +import java.util.NoSuchElementException; + +public class CarRace { + private final List cars = new ArrayList<>(); + + // 자동차 말의 개수 설정 및 자동차 번호 할당 + public void setCarCount(int num) { + for(int i = 0; i <= num; i++) { + cars.add(new Car(i)); + } + } + + // 모든 차가 한번씩 움직임 + public void moveCars() { + for (Car car : cars) { + car.tryMove(); + } + } + + // count 만큼 모든 차가 한번씩 움직임 + public void doRace(int count) { + for (int i = 0; i < count; i++) { + moveCars(); + } + } + + // 우승자 차량 번호 확인 + public int getWinnerCarNumber() { + return cars.stream() //스트림으로 변환 + .max(Comparator.comparingInt(Car::getPosition)) //임의 객체의 인스턴스 메소드 참조 이용 position 값 추출, position 값이 가장 높은 객체 선택 + .orElseThrow(NoSuchElementException::new) // 객체가 존재하면 Optional 벗겨서 반환, 없으면 예외 던짐 + .getCarNumber(); // 해당 객체의 차량 번호 반환 + } +} diff --git a/src/main/java/CarRase.java b/src/main/java/CarRase.java deleted file mode 100644 index 57afd83c..00000000 --- a/src/main/java/CarRase.java +++ /dev/null @@ -1,14 +0,0 @@ -public class CarRase { - - public int getRandom() { - double randomValue = Math.random(); - return (int) (randomValue * 9); - } - - public boolean getStatus() { - int randomValue = getRandom(); - boolean result = rsandomValue > 3; - - return result; - } -} \ No newline at end of file diff --git a/src/test/java/CarRaceTest.java b/src/test/java/CarRaceTest.java new file mode 100644 index 00000000..ee0100b4 --- /dev/null +++ b/src/test/java/CarRaceTest.java @@ -0,0 +1,21 @@ +import org.junit.jupiter.api.Nested; +import org.junit.jupiter.api.Test; + +import java.util.List; + +import static org.assertj.core.api.AssertionsForClassTypes.assertThatCode; + +public class CarRaceTest { + + private final CarRace cr = new CarRace(); + + @Nested + class testRace { + @Test + void shouldReturnSuccessOfCarRaceTest() { + cr.setCarCount(9); + cr.doRace(10); + System.out.println("우승자는" + cr.getWinnerCarNumber() + " 번 차량입니다"); + } + } +} From 9173f9ab269668a9924fcfb4a8f7b61d89772825 Mon Sep 17 00:00:00 2001 From: TwooTwoo Date: Thu, 13 Feb 2025 22:18:03 +0900 Subject: [PATCH 3/4] =?UTF-8?q?3=EB=8B=A8=EA=B3=84-=EA=B2=8C=EC=9E=84=20?= =?UTF-8?q?=EC=8B=A4=ED=96=89=20=EA=B5=AC=ED=98=84?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/main/java/Car.java | 20 ++++++---- src/main/java/CarRace.java | 67 ++++++++++++++++++++++++++-------- src/main/java/Main.java | 12 ++++++ src/test/java/CarRaceTest.java | 27 ++++++++++---- 4 files changed, 95 insertions(+), 31 deletions(-) create mode 100644 src/main/java/Main.java diff --git a/src/main/java/Car.java b/src/main/java/Car.java index 447a306c..2e3b8fa8 100644 --- a/src/main/java/Car.java +++ b/src/main/java/Car.java @@ -1,19 +1,23 @@ public class Car { int position = 0; public int carNumber; + public String carName; - public Car(int carNumber) { + public Car() { + this.position = 0; + } + + public Car(int carNumber, String carName) { this.carNumber = carNumber; + this.carName = carName; } - // 0~9 랜덤값 구하기 public int getRandom() { double randomValue = Math.random(); return (int) (randomValue * 9); } - // 3이하 정지, 4이상 전진 - public boolean canMoveForward() { + public boolean getStatus() { int randomValue = getRandom(); boolean result = true; @@ -24,9 +28,8 @@ public boolean canMoveForward() { return result; } - // 전진 시도 public void tryMove() { - if(canMoveForward()) { + if(getStatus()) { this.position++; } } @@ -35,8 +38,9 @@ public int getPosition() { return position; } - public int getCarNumber() { - return carNumber; + + public String getCarName() { + return carName; } } diff --git a/src/main/java/CarRace.java b/src/main/java/CarRace.java index 76b7bc3a..36f4541a 100644 --- a/src/main/java/CarRace.java +++ b/src/main/java/CarRace.java @@ -1,37 +1,72 @@ -import java.util.ArrayList; -import java.util.List; -import java.util.Comparator; -import java.util.NoSuchElementException; +import java.util.*; +import java.util.stream.Collectors; public class CarRace { private final List cars = new ArrayList<>(); + List carNames; + int raceAttemptCount; + List winnerCarNames; - // 자동차 말의 개수 설정 및 자동차 번호 할당 - public void setCarCount(int num) { - for(int i = 0; i <= num; i++) { - cars.add(new Car(i)); + public void setValue() { + Scanner scanner = new Scanner(System.in); + + System.out.println("경주할 자동차 이름을 입력하세요(이름은 쉼표(,)를 기준으로 구분)."); + String value = scanner.nextLine(); + if(value.isEmpty()) { + throw new IllegalArgumentException("경주할 자동차의 이름을 반드시 입력해주세요."); + } + carNames = Arrays.asList(value.split(",")); + + if(carNames.stream().anyMatch(cn -> cn.length()>5)) { + throw new IllegalArgumentException("자동차 이름은 5글자 이하로 작성해주세요."); + } + + System.out.println("시도할 회수는 몇회인가요?"); + raceAttemptCount = scanner.nextInt(); + } + + public void makeCarObject(int sizeOfList) { + for(int i = 0; i < sizeOfList; i++) { + cars.add(new Car(i, carNames.get(i))); } } - // 모든 차가 한번씩 움직임 public void moveCars() { for (Car car : cars) { car.tryMove(); } } - // count 만큼 모든 차가 한번씩 움직임 public void doRace(int count) { for (int i = 0; i < count; i++) { moveCars(); + printRaceResult(); } } - // 우승자 차량 번호 확인 - public int getWinnerCarNumber() { - return cars.stream() //스트림으로 변환 - .max(Comparator.comparingInt(Car::getPosition)) //임의 객체의 인스턴스 메소드 참조 이용 position 값 추출, position 값이 가장 높은 객체 선택 - .orElseThrow(NoSuchElementException::new) // 객체가 존재하면 Optional 벗겨서 반환, 없으면 예외 던짐 - .getCarNumber(); // 해당 객체의 차량 번호 반환 + public void printRaceResult() { + for (Car car : cars) { + System.out.println(car.getCarName() + " : " + "-".repeat(car.getPosition())); + } + System.out.println(); + } + + public void setWinnerCarNames() { + int maxPosition = cars.stream() + .max(Comparator.comparingInt(Car::getPosition)) + .orElseThrow(NoSuchElementException::new) + .getPosition(); + + winnerCarNames = cars.stream() + .filter(c -> c.getPosition() == maxPosition) + .map(Car::getCarName) + .collect(Collectors.toList()); } + + public void printWinnerCarNames() { + System.out.println("실행 결과"); + System.out.print(String.join(", ", winnerCarNames)); + System.out.println("가 최종 우승했습니다."); + } + } diff --git a/src/main/java/Main.java b/src/main/java/Main.java new file mode 100644 index 00000000..cb8d0f9d --- /dev/null +++ b/src/main/java/Main.java @@ -0,0 +1,12 @@ +public class Main { + public static void main(String[] args) { + CarRace cr = new CarRace(); + + cr.setValue(); + cr.makeCarObject(cr.carNames.size()); + cr.doRace(cr.raceAttemptCount); + cr.setWinnerCarNames(); + cr.printWinnerCarNames(); + } + +} diff --git a/src/test/java/CarRaceTest.java b/src/test/java/CarRaceTest.java index ee0100b4..c3a96a82 100644 --- a/src/test/java/CarRaceTest.java +++ b/src/test/java/CarRaceTest.java @@ -1,21 +1,34 @@ +import org.junit.jupiter.api.DisplayName; import org.junit.jupiter.api.Nested; import org.junit.jupiter.api.Test; - -import java.util.List; - +import java.util.ArrayList; +import java.util.Arrays; import static org.assertj.core.api.AssertionsForClassTypes.assertThatCode; public class CarRaceTest { private final CarRace cr = new CarRace(); + private final Car car = new Car(); @Nested class testRace { + @Test - void shouldReturnSuccessOfCarRaceTest() { - cr.setCarCount(9); - cr.doRace(10); - System.out.println("우승자는" + cr.getWinnerCarNumber() + " 번 차량입니다"); + @DisplayName("랜덤 값에 따라 true, false 반환하고 doesNotThrowAnyException 예외 발생 여부를 확인한다.") + void shouldReturnStatusOfCarRaceTest() { + System.out.println("3이하 false, 4이상 true : " + car.getStatus()); + assertThatCode(car::getStatus).doesNotThrowAnyException(); + } + + @Test + @DisplayName("자동차 경주 결과를 반환하고 doesNotThrowAnyException 예외 발생 여부를 확인한다.") + void shouldReturnResultOfCarRaceTest() { + cr.carNames = new ArrayList<>(Arrays.asList("neo", "brie", "brown")); + cr.raceAttemptCount = 5; + cr.makeCarObject(cr.carNames.size()); + cr.doRace(cr.raceAttemptCount); + assertThatCode(cr::setWinnerCarNames).doesNotThrowAnyException(); } } + } From f40cd8d219cc771aa8875c9b98982173e4a00b45 Mon Sep 17 00:00:00 2001 From: TwooTwoo Date: Thu, 13 Feb 2025 23:02:38 +0900 Subject: [PATCH 4/4] =?UTF-8?q?fix=20:=20=EC=9A=94=EA=B5=AC=20=EC=82=AC?= =?UTF-8?q?=ED=95=AD=EC=97=90=20=EB=A7=9E=EA=B2=8C=20=EC=B6=9C=EB=A0=A5=20?= =?UTF-8?q?=EC=88=98=EC=A0=95,=20=EA=B8=B8=EC=9D=B4=EA=B0=80=20=EA=B8=B4?= =?UTF-8?q?=20=EB=A9=94=EC=86=8C=EB=93=9C=EC=9D=98=20=EB=B6=84=EB=A6=AC,?= =?UTF-8?q?=20=EB=A9=94=EC=9D=B8=20=EB=A9=94=EC=86=8C=EB=93=9C=20=EC=88=98?= =?UTF-8?q?=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/main/java/CarRace.java | 9 +++++++-- src/main/java/Main.java | 3 ++- 2 files changed, 9 insertions(+), 3 deletions(-) diff --git a/src/main/java/CarRace.java b/src/main/java/CarRace.java index 36f4541a..c7c1a437 100644 --- a/src/main/java/CarRace.java +++ b/src/main/java/CarRace.java @@ -7,7 +7,7 @@ public class CarRace { int raceAttemptCount; List winnerCarNames; - public void setValue() { + public void receiveCarNamesInput() { Scanner scanner = new Scanner(System.in); System.out.println("경주할 자동차 이름을 입력하세요(이름은 쉼표(,)를 기준으로 구분)."); @@ -21,6 +21,11 @@ public void setValue() { throw new IllegalArgumentException("자동차 이름은 5글자 이하로 작성해주세요."); } + } + + public void recieveCarRaceAttemptCountInput() { + Scanner scanner = new Scanner(System.in); + System.out.println("시도할 회수는 몇회인가요?"); raceAttemptCount = scanner.nextInt(); } @@ -38,6 +43,7 @@ public void moveCars() { } public void doRace(int count) { + System.out.println("실행 결과"); for (int i = 0; i < count; i++) { moveCars(); printRaceResult(); @@ -64,7 +70,6 @@ public void setWinnerCarNames() { } public void printWinnerCarNames() { - System.out.println("실행 결과"); System.out.print(String.join(", ", winnerCarNames)); System.out.println("가 최종 우승했습니다."); } diff --git a/src/main/java/Main.java b/src/main/java/Main.java index cb8d0f9d..92541ab7 100644 --- a/src/main/java/Main.java +++ b/src/main/java/Main.java @@ -2,7 +2,8 @@ public class Main { public static void main(String[] args) { CarRace cr = new CarRace(); - cr.setValue(); + cr.receiveCarNamesInput(); + cr.recieveCarRaceAttemptCountInput(); cr.makeCarObject(cr.carNames.size()); cr.doRace(cr.raceAttemptCount); cr.setWinnerCarNames();