diff --git a/README.md b/README.md new file mode 100644 index 00000000..108458b4 --- /dev/null +++ b/README.md @@ -0,0 +1,11 @@ +# 자동차 경주 + +## 설명 +1. 자동차 이름 입력받기 +2. 4이상-> 전진, 4미만->멈춤 + +## 조건 +1. indent(인덴트, 들여쓰기) depth를 2를 넘지 않도록 +2. 3항 연산자, else, switch/case 모두 금지 +3. 함수(메서드) 길이 15라인 넘지 않도록 +4. 함수가 한 가지 일만 할 수 있게 \ No newline at end of file diff --git a/src/main/java/.gitkeep b/src/main/java/.gitkeep deleted file mode 100644 index e69de29b..00000000 diff --git a/src/main/java/Car.java b/src/main/java/Car.java new file mode 100644 index 00000000..e3335d84 --- /dev/null +++ b/src/main/java/Car.java @@ -0,0 +1,24 @@ +public class Car { + private static final int MOVE_THRESHOLD = 4; + + private final String name; + private int position=0; + + public Car(String name) { + this.name = name; + } + + public String getName(){ + return name; + } + + public int getPosition(){ + return position; + } + + public void move(int randomNumber){ + if(randomNumber>=MOVE_THRESHOLD){ + position++; + } + } +} \ No newline at end of file diff --git a/src/main/java/Cars.java b/src/main/java/Cars.java new file mode 100644 index 00000000..4c2b72ef --- /dev/null +++ b/src/main/java/Cars.java @@ -0,0 +1,18 @@ +import java.util.List; + +public class Cars { + private final List cars; + + public Cars(List carList) { + this.cars = carList; + } + + public Car[] getCars() { + return cars.toArray(new Car[0]); + } + + public StringBuilder findWinnerNames() { + WinnerFinder winnerFinder = new WinnerFinder(); + return winnerFinder.findWinners(cars); + } +} \ No newline at end of file diff --git a/src/main/java/MoveCondition.java b/src/main/java/MoveCondition.java new file mode 100644 index 00000000..b49195f8 --- /dev/null +++ b/src/main/java/MoveCondition.java @@ -0,0 +1,9 @@ +import java.util.Random; + +public class MoveCondition { + private static final int MAX_NUMBER = 10; + Random random = new Random(); + public int randomMove(){ + return random.nextInt(MAX_NUMBER); + } +} \ No newline at end of file diff --git a/src/main/java/RaceController.java b/src/main/java/RaceController.java new file mode 100644 index 00000000..f9cf6c66 --- /dev/null +++ b/src/main/java/RaceController.java @@ -0,0 +1,23 @@ +public class RaceController { + public void startRace(Cars car, int rounds) { + MoveCondition moveCondition = new MoveCondition(); + + for (int round = 0; round < rounds; round++) { + runRound(car, moveCondition); + } + System.out.println(); + } + + private void runRound(Cars cars, MoveCondition moveCondition) { + for (Car car : cars.getCars()) { + int randomNumber = moveCondition.randomMove(); + car.move(randomNumber); + } + + for (Car car : cars.getCars()) { + String dashes = "-".repeat(car.getPosition()); + System.out.println(car.getName() + " : " + dashes); + } + System.out.println(); + } +} \ No newline at end of file diff --git a/src/main/java/RaceStart.java b/src/main/java/RaceStart.java new file mode 100644 index 00000000..f77b302f --- /dev/null +++ b/src/main/java/RaceStart.java @@ -0,0 +1,27 @@ +import java.util.Scanner; +import java.util.Arrays; + +public class RaceStart { + public static void main(String[] args) { + Scanner scanner = new Scanner(System.in); + + int rounds = scanner.nextInt(); //라운드 횟수 입력 + int n = scanner.nextInt(); // 차 갯수 입력 + Car[] cars = new Car[n]; + + for (int i = 0; i < n; i++) { + String name = scanner.next(); + cars[i] = new Car(name); + } + + Cars carsList = new Cars(Arrays.asList(cars)); + + RaceController raceController = new RaceController(); + raceController.startRace(carsList, rounds); + + Winner winner = new Winner(); + winner.findWinner(carsList); + + scanner.close(); + } +} \ No newline at end of file diff --git a/src/main/java/Winner.java b/src/main/java/Winner.java new file mode 100644 index 00000000..b219e039 --- /dev/null +++ b/src/main/java/Winner.java @@ -0,0 +1,7 @@ +public class Winner { + + public void findWinner(Cars cars) { + StringBuilder result = cars.findWinnerNames(); + System.out.println(result + "가 최종 우승했습니다."); + } +} diff --git a/src/main/java/WinnerFinder.java b/src/main/java/WinnerFinder.java new file mode 100644 index 00000000..b1baf428 --- /dev/null +++ b/src/main/java/WinnerFinder.java @@ -0,0 +1,31 @@ +import java.util.List; + +public class WinnerFinder { + + public StringBuilder findWinners(List cars) { + int maxPosition = findMaxPosition(cars); + return buildWinnerNames(cars, maxPosition); + } + + private int findMaxPosition(List cars){ + int maxPosition = 0; + for (Car car : cars) { + maxPosition = Math.max(maxPosition, car.getPosition()); + } + return maxPosition; + } + + private StringBuilder buildWinnerNames(List cars, int maxPosition) { + StringBuilder winnerNames = new StringBuilder(); + for(Car car : cars){ + appendWinnerName(car, maxPosition, winnerNames); + } + return winnerNames; + } + + private void appendWinnerName(Car car, int maxPosition, StringBuilder winnerNames){ + if(car.getPosition() == maxPosition){ + winnerNames.append(car.getName()); + } + } +} diff --git a/src/test/java/.gitkeep b/src/test/java/.gitkeep deleted file mode 100644 index e69de29b..00000000 diff --git a/src/test/java/TestRace.java b/src/test/java/TestRace.java new file mode 100644 index 00000000..e9172ff8 --- /dev/null +++ b/src/test/java/TestRace.java @@ -0,0 +1,29 @@ +import org.junit.jupiter.api.DisplayName; +import org.junit.jupiter.api.Test; + +import static org.assertj.core.api.AssertionsForClassTypes.assertThat; +import static org.junit.jupiter.api.Assertions.assertEquals; + +public class TestRace { + + @Test + @DisplayName("4이상인 경우 전진하는지 확인") + void CarMove(){ + //given + Car f1 = new Car("f1"); + //when + f1.move(4); + //then + assertThat(f1.getPosition()).isEqualTo(1); + } + @Test + @DisplayName("4미만인 경우 멈추는지 확인") + void CarStop(){ + //given + Car f1 = new Car("f1"); + //when + f1.move(3); + //then + assertThat(f1.getPosition()).isEqualTo(0); + } +} \ No newline at end of file