From 39401409466a498adaa4e0daf59c8a11da1a08ee Mon Sep 17 00:00:00 2001 From: jeongjeongming Date: Mon, 24 Mar 2025 12:22:08 +0900 Subject: [PATCH 1/8] =?UTF-8?q?feat=20:=20=EC=9E=90=EB=8F=99=EC=B0=A8=20?= =?UTF-8?q?=EA=B2=BD=EC=A3=BC?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/main/java/racingcar/Application.java | 108 ++++++++++++++++++++++- 1 file changed, 107 insertions(+), 1 deletion(-) diff --git a/src/main/java/racingcar/Application.java b/src/main/java/racingcar/Application.java index a17a52e7..b525f61e 100644 --- a/src/main/java/racingcar/Application.java +++ b/src/main/java/racingcar/Application.java @@ -1,7 +1,113 @@ package racingcar; +import camp.nextstep.edu.missionutils.Console; +import camp.nextstep.edu.missionutils.Randoms; + +import java.util.ArrayList; +import java.util.Arrays; +import java.util.List; + public class Application { + private static final int MOVE_THRESHOLD = 4; + private static final int MAX_NAME_LENGTH = 5; + public static void main(String[] args) { - // TODO: 프로그램 구현 + List carNames = getCarNames(); + int tryCount = getTryCount(); + + List cars = createCars(carNames); + + System.out.println(); + runRace(cars, tryCount); + printWinners(cars); + } + + private static List getCarNames() { + System.out.println("경주할 자동차 이름을 입력하세요.(이름은 쉼표(,) 기준으로 구분)"); + String input = Console.readLine(); + String[] names = input.split(","); + + for (String name : names) { + if (name.trim().length() > MAX_NAME_LENGTH) { + throw new IllegalArgumentException(); + } + } + + return Arrays.asList(names); + } + + private static int getTryCount() { + System.out.println("시도할 회수는 몇회인가요?"); + String input = Console.readLine(); + return Integer.parseInt(input); + } + + private static List createCars(List names) { + List cars = new ArrayList<>(); + for (String name : names) { + cars.add(new Car(name.trim())); + } + return cars; + } + + private static void runRace(List cars, int tryCount) { + for (int i = 0; i < tryCount; i++) { + for (Car car : cars) { + int number = Randoms.pickNumberInRange(0, 9); + if (number >= MOVE_THRESHOLD) { + car.move(); + } + } + printRaceResult(cars); + } + } + + private static void printRaceResult(List cars) { + for (Car car : cars) { + System.out.println(car); + } + System.out.println(); + } + + private static void printWinners(List cars) { + int max = cars.stream() + .mapToInt(Car::getPosition) + .max() + .orElse(0); + + List winners = new ArrayList<>(); + for (Car car : cars) { + if (car.getPosition() == max) { + winners.add(car.getName()); + } + } + + System.out.println("최종 우승자 : " + String.join(", ", winners)); + } +} + +class Car { + private final String name; + private int position = 0; + + public Car(String name) { + this.name = name; + } + + public void move() { + position++; + } + + public int getPosition() { + return position; + } + + public String getName() { + return name; + } + + @Override + public String toString() { + return name + " : " + "-".repeat(position); } } From 71543dd4227e8dc1a1e57fbf76f39eafb2f06517 Mon Sep 17 00:00:00 2001 From: jeongjeongming Date: Mon, 31 Mar 2025 22:42:27 +0900 Subject: [PATCH 2/8] =?UTF-8?q?=EC=9E=90=EB=8F=99=EC=B0=A8=20=EA=B0=9D?= =?UTF-8?q?=EC=B2=B4=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/racingcar/Application.java | 107 ++--------------------- src/main/java/racingcar/Car.java | 32 +++++++ src/main/java/racingcar/CarFactory.java | 14 +++ src/main/java/racingcar/InputView.java | 28 ++++++ src/main/java/racingcar/Race.java | 45 ++++++++++ src/main/java/racingcar/ResultView.java | 16 ++++ 6 files changed, 141 insertions(+), 101 deletions(-) create mode 100644 src/main/java/racingcar/Car.java create mode 100644 src/main/java/racingcar/CarFactory.java create mode 100644 src/main/java/racingcar/InputView.java create mode 100644 src/main/java/racingcar/Race.java create mode 100644 src/main/java/racingcar/ResultView.java diff --git a/src/main/java/racingcar/Application.java b/src/main/java/racingcar/Application.java index b525f61e..c048b909 100644 --- a/src/main/java/racingcar/Application.java +++ b/src/main/java/racingcar/Application.java @@ -1,113 +1,18 @@ package racingcar; -import camp.nextstep.edu.missionutils.Console; -import camp.nextstep.edu.missionutils.Randoms; - -import java.util.ArrayList; -import java.util.Arrays; import java.util.List; public class Application { - private static final int MOVE_THRESHOLD = 4; - private static final int MAX_NAME_LENGTH = 5; - public static void main(String[] args) { - List carNames = getCarNames(); - int tryCount = getTryCount(); - - List cars = createCars(carNames); - - System.out.println(); - runRace(cars, tryCount); - printWinners(cars); - } - - private static List getCarNames() { - System.out.println("경주할 자동차 이름을 입력하세요.(이름은 쉼표(,) 기준으로 구분)"); - String input = Console.readLine(); - String[] names = input.split(","); - - for (String name : names) { - if (name.trim().length() > MAX_NAME_LENGTH) { - throw new IllegalArgumentException(); - } - } + List carNames = InputView.getCarNames(); + int tryCount = InputView.getTryCount(); - return Arrays.asList(names); - } - - private static int getTryCount() { - System.out.println("시도할 회수는 몇회인가요?"); - String input = Console.readLine(); - return Integer.parseInt(input); - } - - private static List createCars(List names) { - List cars = new ArrayList<>(); - for (String name : names) { - cars.add(new Car(name.trim())); - } - return cars; - } - - private static void runRace(List cars, int tryCount) { - for (int i = 0; i < tryCount; i++) { - for (Car car : cars) { - int number = Randoms.pickNumberInRange(0, 9); - if (number >= MOVE_THRESHOLD) { - car.move(); - } - } - printRaceResult(cars); - } - } + List cars = CarFactory.createCars(carNames); - private static void printRaceResult(List cars) { - for (Car car : cars) { - System.out.println(car); - } System.out.println(); - } - - private static void printWinners(List cars) { - int max = cars.stream() - .mapToInt(Car::getPosition) - .max() - .orElse(0); - - List winners = new ArrayList<>(); - for (Car car : cars) { - if (car.getPosition() == max) { - winners.add(car.getName()); - } - } - - System.out.println("최종 우승자 : " + String.join(", ", winners)); - } -} - -class Car { - private final String name; - private int position = 0; - - public Car(String name) { - this.name = name; - } - - public void move() { - position++; - } - - public int getPosition() { - return position; - } - - public String getName() { - return name; - } + Race race = new Race(cars, tryCount); + race.start(); - @Override - public String toString() { - return name + " : " + "-".repeat(position); + ResultView.printWinners(race.getWinners()); } } diff --git a/src/main/java/racingcar/Car.java b/src/main/java/racingcar/Car.java new file mode 100644 index 00000000..75a7d0a4 --- /dev/null +++ b/src/main/java/racingcar/Car.java @@ -0,0 +1,32 @@ +package racingcar; + +public class Car { + private static final int MOVE_THRESHOLD = 4; + private static final String POSITION_MARK = "-"; + + private final String name; + private int position = 0; + + public Car(String name) { + this.name = name; + } + + public void move(int randomNumber) { + if (randomNumber >= MOVE_THRESHOLD) { + position++; + } + } + + public int getPosition() { + return position; + } + + public String getName() { + return name; + } + + @Override + public String toString() { + return name + " : " + POSITION_MARK.repeat(position); + } +} diff --git a/src/main/java/racingcar/CarFactory.java b/src/main/java/racingcar/CarFactory.java new file mode 100644 index 00000000..8b18c11e --- /dev/null +++ b/src/main/java/racingcar/CarFactory.java @@ -0,0 +1,14 @@ +package racingcar; + +import java.util.List; +import java.util.stream.Collectors; +import racingcar.Car; + +public class CarFactory { + public static List createCars(List names) { + return names.stream() + .map(String::trim) + .map(Car::new) + .collect(Collectors.toList()); + } +} diff --git a/src/main/java/racingcar/InputView.java b/src/main/java/racingcar/InputView.java new file mode 100644 index 00000000..3e24f436 --- /dev/null +++ b/src/main/java/racingcar/InputView.java @@ -0,0 +1,28 @@ +package racingcar; + +import camp.nextstep.edu.missionutils.Console; + +import java.util.Arrays; +import java.util.List; + +public class InputView { + private static final int MAX_NAME_LENGTH = 5; + + public static List getCarNames() { + System.out.println("경주할 자동차 이름을 입력하세요.(이름은 쉼표(,) 기준으로 구분)"); + String input = Console.readLine(); + List names = Arrays.asList(input.split(",")); + + for (String name : names) { + if (name.trim().length() > MAX_NAME_LENGTH) { + throw new IllegalArgumentException("자동차 이름은 5자 이하만 가능합니다."); + } + } + return names; + } + + public static int getTryCount() { + System.out.println("시도할 회수는 몇회인가요?"); + return Integer.parseInt(Console.readLine()); + } +} diff --git a/src/main/java/racingcar/Race.java b/src/main/java/racingcar/Race.java new file mode 100644 index 00000000..4154256a --- /dev/null +++ b/src/main/java/racingcar/Race.java @@ -0,0 +1,45 @@ +package racingcar; + +import camp.nextstep.edu.missionutils.Randoms; + +import java.util.ArrayList; +import java.util.List; + +public class Race { + private final List cars; + private final int tryCount; + + public Race(List cars, int tryCount) { + this.cars = cars; + this.tryCount = tryCount; + } + + public void start() { + for (int i = 0; i < tryCount; i++) { + moveCars(); + ResultView.printRaceResult(cars); + } + } + + private void moveCars() { + for (Car car : cars) { + int number = Randoms.pickNumberInRange(0, 9); + car.move(number); + } + } + + public List getWinners() { + int maxPosition = cars.stream() + .mapToInt(Car::getPosition) + .max() + .orElse(0); + + List winners = new ArrayList<>(); + for (Car car : cars) { + if (car.getPosition() == maxPosition) { + winners.add(car.getName()); + } + } + return winners; + } +} diff --git a/src/main/java/racingcar/ResultView.java b/src/main/java/racingcar/ResultView.java new file mode 100644 index 00000000..4b311e13 --- /dev/null +++ b/src/main/java/racingcar/ResultView.java @@ -0,0 +1,16 @@ +package racingcar; + +import java.util.List; + +public class ResultView { + public static void printRaceResult(List cars) { + for (Car car : cars) { + System.out.println(car); + } + System.out.println(); + } + + public static void printWinners(List winners) { + System.out.println("최종 우승자 : " + String.join(", ", winners)); + } +} From 66a78ec3c2003b8722ad85728b9a63f62ecc0830 Mon Sep 17 00:00:00 2001 From: jeongjeongming Date: Mon, 31 Mar 2025 23:34:52 +0900 Subject: [PATCH 3/8] =?UTF-8?q?Car=20=ED=81=B4=EB=9E=98=EC=8A=A4=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/racingcar/Car.java | 32 ++++++++++++++++++++++++++++++++ 1 file changed, 32 insertions(+) create mode 100644 src/main/java/racingcar/Car.java diff --git a/src/main/java/racingcar/Car.java b/src/main/java/racingcar/Car.java new file mode 100644 index 00000000..75a7d0a4 --- /dev/null +++ b/src/main/java/racingcar/Car.java @@ -0,0 +1,32 @@ +package racingcar; + +public class Car { + private static final int MOVE_THRESHOLD = 4; + private static final String POSITION_MARK = "-"; + + private final String name; + private int position = 0; + + public Car(String name) { + this.name = name; + } + + public void move(int randomNumber) { + if (randomNumber >= MOVE_THRESHOLD) { + position++; + } + } + + public int getPosition() { + return position; + } + + public String getName() { + return name; + } + + @Override + public String toString() { + return name + " : " + POSITION_MARK.repeat(position); + } +} From 576033c1212aeeb54b2f9c1f2e019698c4a7ec1e Mon Sep 17 00:00:00 2001 From: jeongjeongming Date: Mon, 31 Mar 2025 23:35:21 +0900 Subject: [PATCH 4/8] =?UTF-8?q?CarFactory=20=ED=81=B4=EB=9E=98=EC=8A=A4=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/racingcar/CarFactory.java | 14 ++++++++++++++ 1 file changed, 14 insertions(+) create mode 100644 src/main/java/racingcar/CarFactory.java diff --git a/src/main/java/racingcar/CarFactory.java b/src/main/java/racingcar/CarFactory.java new file mode 100644 index 00000000..8b18c11e --- /dev/null +++ b/src/main/java/racingcar/CarFactory.java @@ -0,0 +1,14 @@ +package racingcar; + +import java.util.List; +import java.util.stream.Collectors; +import racingcar.Car; + +public class CarFactory { + public static List createCars(List names) { + return names.stream() + .map(String::trim) + .map(Car::new) + .collect(Collectors.toList()); + } +} From 81b7094de1d862638cb14b1353582a27a439f466 Mon Sep 17 00:00:00 2001 From: jeongjeongming Date: Mon, 31 Mar 2025 23:35:36 +0900 Subject: [PATCH 5/8] =?UTF-8?q?InputView=20=ED=81=B4=EB=9E=98=EC=8A=A4=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/racingcar/InputView.java | 28 ++++++++++++++++++++++++++ 1 file changed, 28 insertions(+) create mode 100644 src/main/java/racingcar/InputView.java diff --git a/src/main/java/racingcar/InputView.java b/src/main/java/racingcar/InputView.java new file mode 100644 index 00000000..3e24f436 --- /dev/null +++ b/src/main/java/racingcar/InputView.java @@ -0,0 +1,28 @@ +package racingcar; + +import camp.nextstep.edu.missionutils.Console; + +import java.util.Arrays; +import java.util.List; + +public class InputView { + private static final int MAX_NAME_LENGTH = 5; + + public static List getCarNames() { + System.out.println("경주할 자동차 이름을 입력하세요.(이름은 쉼표(,) 기준으로 구분)"); + String input = Console.readLine(); + List names = Arrays.asList(input.split(",")); + + for (String name : names) { + if (name.trim().length() > MAX_NAME_LENGTH) { + throw new IllegalArgumentException("자동차 이름은 5자 이하만 가능합니다."); + } + } + return names; + } + + public static int getTryCount() { + System.out.println("시도할 회수는 몇회인가요?"); + return Integer.parseInt(Console.readLine()); + } +} From 7b4704e43db4b97272b0545e87f14a2dfa097367 Mon Sep 17 00:00:00 2001 From: jeongjeongming Date: Mon, 31 Mar 2025 23:35:55 +0900 Subject: [PATCH 6/8] =?UTF-8?q?Race=20=ED=81=B4=EB=9E=98=EC=8A=A4=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/racingcar/Race.java | 45 +++++++++++++++++++++++++++++++ 1 file changed, 45 insertions(+) create mode 100644 src/main/java/racingcar/Race.java diff --git a/src/main/java/racingcar/Race.java b/src/main/java/racingcar/Race.java new file mode 100644 index 00000000..4154256a --- /dev/null +++ b/src/main/java/racingcar/Race.java @@ -0,0 +1,45 @@ +package racingcar; + +import camp.nextstep.edu.missionutils.Randoms; + +import java.util.ArrayList; +import java.util.List; + +public class Race { + private final List cars; + private final int tryCount; + + public Race(List cars, int tryCount) { + this.cars = cars; + this.tryCount = tryCount; + } + + public void start() { + for (int i = 0; i < tryCount; i++) { + moveCars(); + ResultView.printRaceResult(cars); + } + } + + private void moveCars() { + for (Car car : cars) { + int number = Randoms.pickNumberInRange(0, 9); + car.move(number); + } + } + + public List getWinners() { + int maxPosition = cars.stream() + .mapToInt(Car::getPosition) + .max() + .orElse(0); + + List winners = new ArrayList<>(); + for (Car car : cars) { + if (car.getPosition() == maxPosition) { + winners.add(car.getName()); + } + } + return winners; + } +} From ba64be95ec10d0fefbe372a3e6e46c1fc2708649 Mon Sep 17 00:00:00 2001 From: jeongjeongming Date: Mon, 31 Mar 2025 23:36:19 +0900 Subject: [PATCH 7/8] =?UTF-8?q?ResultView=20=ED=81=B4=EB=9E=98=EC=8A=A4=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/racingcar/ResultView.java | 16 ++++++++++++++++ 1 file changed, 16 insertions(+) create mode 100644 src/main/java/racingcar/ResultView.java diff --git a/src/main/java/racingcar/ResultView.java b/src/main/java/racingcar/ResultView.java new file mode 100644 index 00000000..4b311e13 --- /dev/null +++ b/src/main/java/racingcar/ResultView.java @@ -0,0 +1,16 @@ +package racingcar; + +import java.util.List; + +public class ResultView { + public static void printRaceResult(List cars) { + for (Car car : cars) { + System.out.println(car); + } + System.out.println(); + } + + public static void printWinners(List winners) { + System.out.println("최종 우승자 : " + String.join(", ", winners)); + } +} From 2c334ce4e64a95a5e352f79ea7806d1474baaed3 Mon Sep 17 00:00:00 2001 From: jeongjeongming Date: Mon, 31 Mar 2025 23:36:59 +0900 Subject: [PATCH 8/8] =?UTF-8?q?Application=20=ED=81=B4=EB=9E=98=EC=8A=A4?= =?UTF-8?q?=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/racingcar/Application.java | 107 ++--------------------- 1 file changed, 6 insertions(+), 101 deletions(-) diff --git a/src/main/java/racingcar/Application.java b/src/main/java/racingcar/Application.java index b525f61e..c048b909 100644 --- a/src/main/java/racingcar/Application.java +++ b/src/main/java/racingcar/Application.java @@ -1,113 +1,18 @@ package racingcar; -import camp.nextstep.edu.missionutils.Console; -import camp.nextstep.edu.missionutils.Randoms; - -import java.util.ArrayList; -import java.util.Arrays; import java.util.List; public class Application { - private static final int MOVE_THRESHOLD = 4; - private static final int MAX_NAME_LENGTH = 5; - public static void main(String[] args) { - List carNames = getCarNames(); - int tryCount = getTryCount(); - - List cars = createCars(carNames); - - System.out.println(); - runRace(cars, tryCount); - printWinners(cars); - } - - private static List getCarNames() { - System.out.println("경주할 자동차 이름을 입력하세요.(이름은 쉼표(,) 기준으로 구분)"); - String input = Console.readLine(); - String[] names = input.split(","); - - for (String name : names) { - if (name.trim().length() > MAX_NAME_LENGTH) { - throw new IllegalArgumentException(); - } - } + List carNames = InputView.getCarNames(); + int tryCount = InputView.getTryCount(); - return Arrays.asList(names); - } - - private static int getTryCount() { - System.out.println("시도할 회수는 몇회인가요?"); - String input = Console.readLine(); - return Integer.parseInt(input); - } - - private static List createCars(List names) { - List cars = new ArrayList<>(); - for (String name : names) { - cars.add(new Car(name.trim())); - } - return cars; - } - - private static void runRace(List cars, int tryCount) { - for (int i = 0; i < tryCount; i++) { - for (Car car : cars) { - int number = Randoms.pickNumberInRange(0, 9); - if (number >= MOVE_THRESHOLD) { - car.move(); - } - } - printRaceResult(cars); - } - } + List cars = CarFactory.createCars(carNames); - private static void printRaceResult(List cars) { - for (Car car : cars) { - System.out.println(car); - } System.out.println(); - } - - private static void printWinners(List cars) { - int max = cars.stream() - .mapToInt(Car::getPosition) - .max() - .orElse(0); - - List winners = new ArrayList<>(); - for (Car car : cars) { - if (car.getPosition() == max) { - winners.add(car.getName()); - } - } - - System.out.println("최종 우승자 : " + String.join(", ", winners)); - } -} - -class Car { - private final String name; - private int position = 0; - - public Car(String name) { - this.name = name; - } - - public void move() { - position++; - } - - public int getPosition() { - return position; - } - - public String getName() { - return name; - } + Race race = new Race(cars, tryCount); + race.start(); - @Override - public String toString() { - return name + " : " + "-".repeat(position); + ResultView.printWinners(race.getWinners()); } }