From 6731ff4af55b45542371e70c4449b7b147bbe1e2 Mon Sep 17 00:00:00 2001 From: Nahyun Kim Date: Fri, 17 Mar 2023 21:55:10 +0900 Subject: [PATCH 01/15] =?UTF-8?q?docs:=20=EA=B8=B0=EB=8A=A5=20=EB=AA=A9?= =?UTF-8?q?=EB=A1=9D=20=EC=9E=91=EC=84=B1?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...60\353\212\245\353\252\251\353\241\235.md" | 36 +++++++++++++++++++ 1 file changed, 36 insertions(+) create mode 100644 "\352\270\260\353\212\245\353\252\251\353\241\235.md" diff --git "a/\352\270\260\353\212\245\353\252\251\353\241\235.md" "b/\352\270\260\353\212\245\353\252\251\353\241\235.md" new file mode 100644 index 0000000..650bd4d --- /dev/null +++ "b/\352\270\260\353\212\245\353\252\251\353\241\235.md" @@ -0,0 +1,36 @@ +## ๐Ÿ’Œ [๋ฏธ์…˜ - ์ž๋™์ฐจ ๊ฒฝ์ฃผ ๊ฒŒ์ž„] ๊ธฐ๋Šฅ ๋ชฉ๋ก + +### ๋„๋ฉ”์ธ ๊ตฌ์„ฑ ์š”์†Œ + +- ์ž๋™์ฐจ + - ์ด๋ฆ„ + - ์œ„์น˜ +- ๋ชจ๋“  ์ž๋™์ฐจ ๋ชฉ๋ก +- ์ž๋™์ฐจ๊ฐ€ ์ด๋™ํ•˜๊ธฐ ์œ„ํ•œ ๊ฐ’ ์ƒ์„ฑ๊ธฐ +- ์‹œ๋„ ํšŸ์ˆ˜ +- ๊ฒŒ์ž„ ๊ฒฐ๊ณผ + - ์šฐ์Šนํ•œ ์ž๋™์ฐจ ์ด๋ฆ„ ๋ชจ์Œ (์ค‘๋ณต ๊ฐ€๋Šฅ) + +### ๋„๋ฉ”์ธ ๋กœ์ง์„ ์œ„ํ•œ ๊ธฐ๋Šฅ + +1. ๊ฒฝ์ฃผํ•  ๋ชจ๋“  ์ž๋™์ฐจ์˜ ์ด๋ฆ„์„ ์ €์žฅํ•˜๋Š” ๊ธฐ๋Šฅ + - [ ] `์˜ˆ์™ธ๋ฐœ์ƒ` : ์ด๋ฆ„์˜ ๊ธธ์ด๊ฐ€ 5์ž ์ดˆ๊ณผ +2. ๋žœ๋ค ์ˆซ์ž ์ƒ์„ฑ ๊ธฐ๋Šฅ +3. ์ž๋™์ฐจ๊ฐ€ ์ „๋‹ฌ ๋ฐ›์€ ์ˆซ์ž์— ๋”ฐ๋ผ ์ด๋™ํ•˜๋Š” ๊ธฐ๋Šฅ + - [ ] `์˜ˆ์™ธ๋ฐœ์ƒ`: ์ „๋‹ฌ ๋ฐ›์€ ์ˆซ์ž๊ฐ€ ๋ฒ”์œ„ ๋ฐ– +4. ์ž๋™์ฐจ ๊ฐ„ ์œ„์น˜๋ฅผ ๋น„๊ตํ•ด ๊ฐ’์ด ๊ฐ€์žฅ ํฐ, 1~n ๋ช…์˜ ์šฐ์Šน์ž๋ฅผ ์ •ํ•˜๋Š” ๊ธฐ๋Šฅ +5. ์ „๋‹ฌ ๋ฐ›์€ ํšŸ์ˆ˜๋งŒํผ ์ž๋™์ฐจ๋ฅผ ์ด๋™ํ•˜๋Š” ๊ธฐ๋Šฅ + + +### UI ๋กœ์ง์„ ์œ„ํ•œ ๊ธฐ๋Šฅ + +1. ๊ฒฝ์ฃผํ•  ๋ชจ๋“  ์ž๋™์ฐจ ์ด๋ฆ„์„ ํ˜•์‹์— ๋งž๊ฒŒ ์ž…๋ ฅ ๋ฐ›๋Š” ๊ธฐ๋Šฅ + - [ ] `์˜ˆ์™ธ๋ฐœ์ƒ` : ๋นˆ ๋ฌธ์ž์—ด + - [ ] `์˜ˆ์™ธ๋ฐœ์ƒ` : ์ž…๋ ฅ๊ฐ’ ํ˜•์‹์— ๋งž์ง€ ์•Š์Œ +2. ์‹œ๋„ํ•  ํšŸ์ˆ˜๋ฅผ ์ž…๋ ฅ ๋ฐ›๋Š” ๊ธฐ๋Šฅ + - [ ] `์˜ˆ์™ธ๋ฐœ์ƒ` : ์ž์—ฐ์ˆ˜๊ฐ€ ์•„๋‹Œ ๊ฐ’ +3. ์ฐจ์ˆ˜๋ณ„ ์‹คํ–‰ ๊ฒฐ๊ณผ ์ถœ๋ ฅ +4. ์šฐ์Šน์ž ์•ˆ๋‚ด ๋ฌธ๊ตฌ ์ถœ๋ ฅ +5. ์ด๋ฆ„ ํ˜•์‹์„ ์‰ผํ‘œ ๊ตฌ๋ถ„ <-> ๋ฆฌ์ŠคํŠธ๋กœ ํŒŒ์‹ฑ +6. ์—๋Ÿฌ ๋ฉ”์‹œ์ง€ ์ถœ๋ ฅ +7. ์ž˜๋ชป๋œ ๊ฐ’ ์ž…๋ ฅ ์‹œ ๊ทธ๋ถ€๋ถ„๋ถ€ํ„ฐ ์žฌ์ž…๋ ฅ \ No newline at end of file From 693c37f413e3bf2ae37ae3dbc86dd9cdc788a4ef Mon Sep 17 00:00:00 2001 From: Nahyun Kim Date: Fri, 17 Mar 2023 22:44:30 +0900 Subject: [PATCH 02/15] =?UTF-8?q?feat:=20=EB=AA=A8=EB=93=A0=20=EC=9E=90?= =?UTF-8?q?=EB=8F=99=EC=B0=A8=20=EC=9D=B4=EB=A6=84=EC=9D=84=20=ED=98=95?= =?UTF-8?q?=EC=8B=9D=EC=97=90=20=EB=A7=9E=EA=B2=8C=20=EC=9E=85=EB=A0=A5=20?= =?UTF-8?q?=EB=B0=9B=EB=8A=94=20=EA=B8=B0=EB=8A=A5=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 | 4 ++ .../controller/RacingController.java | 18 ++++++++ src/main/java/racingcar/view/InputView.java | 22 ++++++++++ .../racingcar/view/utils/FormatParser.java | 43 +++++++++++++++++++ 4 files changed, 87 insertions(+) create mode 100644 src/main/java/racingcar/controller/RacingController.java create mode 100644 src/main/java/racingcar/view/InputView.java create mode 100644 src/main/java/racingcar/view/utils/FormatParser.java diff --git a/src/main/java/racingcar/Application.java b/src/main/java/racingcar/Application.java index b9ed045..fa7fbda 100644 --- a/src/main/java/racingcar/Application.java +++ b/src/main/java/racingcar/Application.java @@ -1,7 +1,11 @@ package racingcar; +import racingcar.controller.RacingController; + public class Application { public static void main(String[] args) { // TODO ๊ตฌํ˜„ ์ง„ํ–‰ + RacingController racingController = new RacingController(); + racingController.run(); } } diff --git a/src/main/java/racingcar/controller/RacingController.java b/src/main/java/racingcar/controller/RacingController.java new file mode 100644 index 0000000..954ea3e --- /dev/null +++ b/src/main/java/racingcar/controller/RacingController.java @@ -0,0 +1,18 @@ +package racingcar.controller; + +import racingcar.view.InputView; + +import java.util.List; + +public class RacingController { + private final InputView inputView = new InputView(); + + public void run() { + enrollCar(); + } + + public void enrollCar() { + List carNames = inputView.inputCarNames(); + System.out.println(carNames); + } +} diff --git a/src/main/java/racingcar/view/InputView.java b/src/main/java/racingcar/view/InputView.java new file mode 100644 index 0000000..b37e6b5 --- /dev/null +++ b/src/main/java/racingcar/view/InputView.java @@ -0,0 +1,22 @@ +package racingcar.view; + +import camp.nextstep.edu.missionutils.Console; +import racingcar.view.utils.FormatParser; +import racingcar.view.utils.NumberParser; + +import java.util.List; + +public class InputView { + public List inputCarNames() { + System.out.println("๊ฒฝ์ฃผํ•  ์ž๋™์ฐจ ์ด๋ฆ„๋“ค์„ ์ž…๋ ฅํ•˜์„ธ์š”. (์ด๋ฆ„์€ ์‰ผํ‘œ(,)๋กœ ๊ตฌ๋ถ„ํ•จ)"); + String line = Console.readLine(); // ์ฝ˜์†”๋กœ๋ถ€ํ„ฐ ๊ฐ’ ์ฝ๊ธฐ + return FormatParser.split(line, ","); + } + + public int inputMoveCount() { + System.out.println("๋ช‡ ๋ฒˆ ์‹œ๋„ํ• ์ง€ ์ž…๋ ฅํ•˜์„ธ์š”. (์ˆซ์ž)"); + String line = Console.readLine(); + return NumberParser.parseDigit(line); + + } +} diff --git a/src/main/java/racingcar/view/utils/FormatParser.java b/src/main/java/racingcar/view/utils/FormatParser.java new file mode 100644 index 0000000..6a46a36 --- /dev/null +++ b/src/main/java/racingcar/view/utils/FormatParser.java @@ -0,0 +1,43 @@ +package racingcar.view.utils; + +import java.util.Arrays; +import java.util.List; +import java.util.stream.Collectors; + +public class FormatParser { + private FormatParser() { + } + + public static List split(String line, String delimiter) { + validateWrongFormat(line); + String[] values = line.split(delimiter); + List parsedValue = Arrays.stream(values) + .map(String::trim) // trim: ๋ฌธ์ž์—ด ๊ณต๋ฐฑ ์ œ๊ฑฐ + .collect(Collectors.toList()); + validateEmpty(parsedValue); + return parsedValue; + } + + private static boolean validateWrongFormat(String line) { + if (line.isEmpty()) + throw new IllegalArgumentException("์ž…๋ ฅ๊ฐ’์˜ ํ˜•์‹์ด ์ž˜๋ชป๋˜์—ˆ์Šต๋‹ˆ๋‹ค."); + return line.startsWith(",") || line.endsWith(","); + } + private static void validateEmpty(List values) { + if (hasEmptyValue(values)) + throw new IllegalArgumentException("์ž…๋ ฅ๊ฐ’์— ๋นˆ ๋ฌธ์ž์—ด์ด ์žˆ์Šต๋‹ˆ๋‹ค."); + } + + private static boolean hasEmptyValue(List values) { + return values.stream() + .anyMatch(String::isEmpty); // anyMatch(): ์ตœ์†Œํ•œ ํ•œ ๊ฐœ์˜ ์š”์†Œ๊ฐ€ ์ฃผ์–ด์ง„ ์กฐ๊ฑด์— ๋งŒ์กฑํ•˜๋Š”์ง€ ์กฐ์‚ฌํ•˜๋Š” ํ•จ์ˆ˜ & '::': ๋ฉ”์†Œ๋“œ ๋ ˆํผ๋Ÿฐ์Šค. ๋žŒ๋‹ค์‹์„ ๋”์šฑ ๊ฐ„๊ฒฐํ•˜๊ฒŒ ํ•ด์ค€๋‹ค. + } + + public static String join(List values, String delimiter) { + return String.join(delimiter, values); + } + + public static String make(int count, String unit) { + return unit.repeat(count); + } +} From 573107424fd8c153977ec92778350cce0dd3c9d5 Mon Sep 17 00:00:00 2001 From: Nahyun Kim Date: Fri, 17 Mar 2023 23:25:00 +0900 Subject: [PATCH 03/15] =?UTF-8?q?feat:=20=EB=AA=A8=EB=93=A0=20=EC=9E=90?= =?UTF-8?q?=EB=8F=99=EC=B0=A8=20=EC=9D=B4=EB=A6=84=EC=9D=84=20=EC=A0=80?= =?UTF-8?q?=EC=9E=A5=ED=95=98=EB=8A=94=20=EA=B8=B0=EB=8A=A5=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/racingcar/Car.java | 12 ------------ .../racingcar/controller/RacingController.java | 8 +++++--- src/main/java/racingcar/model/RacingGame.java | 14 ++++++++++++++ src/main/java/racingcar/model/domain/Car.java | 16 ++++++++++++++++ src/main/java/racingcar/view/OutputView.java | 4 ++++ 5 files changed, 39 insertions(+), 15 deletions(-) delete mode 100644 src/main/java/racingcar/Car.java create mode 100644 src/main/java/racingcar/model/RacingGame.java create mode 100644 src/main/java/racingcar/model/domain/Car.java create mode 100644 src/main/java/racingcar/view/OutputView.java diff --git a/src/main/java/racingcar/Car.java b/src/main/java/racingcar/Car.java deleted file mode 100644 index ab3df94..0000000 --- a/src/main/java/racingcar/Car.java +++ /dev/null @@ -1,12 +0,0 @@ -package racingcar; - -public class Car { - private final String name; - private int position = 0; - - public Car(String name) { - this.name = name; - } - - // ์ถ”๊ฐ€ ๊ธฐ๋Šฅ ๊ตฌํ˜„ -} diff --git a/src/main/java/racingcar/controller/RacingController.java b/src/main/java/racingcar/controller/RacingController.java index 954ea3e..b068dcf 100644 --- a/src/main/java/racingcar/controller/RacingController.java +++ b/src/main/java/racingcar/controller/RacingController.java @@ -1,18 +1,20 @@ package racingcar.controller; +import racingcar.model.RacingGame; import racingcar.view.InputView; import java.util.List; public class RacingController { private final InputView inputView = new InputView(); + private static final RacingGame racingGame = new RacingGame(); public void run() { - enrollCar(); + enrollCarToRace(); } - public void enrollCar() { + public void enrollCarToRace() { List carNames = inputView.inputCarNames(); - System.out.println(carNames); + racingGame.enrollCars(carNames); } } diff --git a/src/main/java/racingcar/model/RacingGame.java b/src/main/java/racingcar/model/RacingGame.java new file mode 100644 index 0000000..709097d --- /dev/null +++ b/src/main/java/racingcar/model/RacingGame.java @@ -0,0 +1,14 @@ +package racingcar.model; + +import racingcar.model.domain.Car; + +import java.util.ArrayList; +import java.util.List; + +public class RacingGame { + private static final List racingCars = new ArrayList<>(); + + public void enrollCars(List carNames) { + carNames.forEach(name -> racingCars.add(new Car(name))); + } +} diff --git a/src/main/java/racingcar/model/domain/Car.java b/src/main/java/racingcar/model/domain/Car.java new file mode 100644 index 0000000..785a4a2 --- /dev/null +++ b/src/main/java/racingcar/model/domain/Car.java @@ -0,0 +1,16 @@ +package racingcar.model.domain; + +public class Car { + private final String name; + private int position = 0; + + public Car(String name) { + validateName(name); + this.name = name; + } + + private void validateName(String name) { + if (name.length() > 5) + throw new IllegalArgumentException("์ž๋™์ฐจ ์ด๋ฆ„์ด ๋‹ค์„ฏ ๊ธ€์ž๋ฅผ ์ดˆ๊ณผํ•ฉ๋‹ˆ๋‹ค."); + } +} diff --git a/src/main/java/racingcar/view/OutputView.java b/src/main/java/racingcar/view/OutputView.java new file mode 100644 index 0000000..abf938a --- /dev/null +++ b/src/main/java/racingcar/view/OutputView.java @@ -0,0 +1,4 @@ +package racingcar.view; + +public class OutputView { +} From 654a5760c8a99d01225d7899d80e3c62ca12c47f Mon Sep 17 00:00:00 2001 From: Nahyun Kim Date: Fri, 17 Mar 2023 23:45:16 +0900 Subject: [PATCH 04/15] =?UTF-8?q?feat:=20=EB=9E=9C=EB=8D=A4=20=EC=A0=84?= =?UTF-8?q?=EC=A7=84=EA=B0=92=20=EC=83=9D=EC=84=B1=20=EA=B8=B0=EB=8A=A5=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 --- .../java/racingcar/controller/RacingController.java | 3 ++- src/main/java/racingcar/model/NumberGenerator.java | 6 ++++++ src/main/java/racingcar/model/RacingGame.java | 6 +++++- .../java/racingcar/model/RandomNumberGenerator.java | 11 +++++++++++ 4 files changed, 24 insertions(+), 2 deletions(-) create mode 100644 src/main/java/racingcar/model/NumberGenerator.java create mode 100644 src/main/java/racingcar/model/RandomNumberGenerator.java diff --git a/src/main/java/racingcar/controller/RacingController.java b/src/main/java/racingcar/controller/RacingController.java index b068dcf..b161971 100644 --- a/src/main/java/racingcar/controller/RacingController.java +++ b/src/main/java/racingcar/controller/RacingController.java @@ -1,13 +1,14 @@ package racingcar.controller; import racingcar.model.RacingGame; +import racingcar.model.RandomNumberGenerator; import racingcar.view.InputView; import java.util.List; public class RacingController { private final InputView inputView = new InputView(); - private static final RacingGame racingGame = new RacingGame(); + private static final RacingGame racingGame = new RacingGame(new RandomNumberGenerator()); public void run() { enrollCarToRace(); diff --git a/src/main/java/racingcar/model/NumberGenerator.java b/src/main/java/racingcar/model/NumberGenerator.java new file mode 100644 index 0000000..8d6f126 --- /dev/null +++ b/src/main/java/racingcar/model/NumberGenerator.java @@ -0,0 +1,6 @@ +package racingcar.model; + +@FunctionalInterface // 1๊ฐœ์˜ ์ถ”์ƒ ๋ฉ”์†Œ๋“œ๋ฅผ ๊ฐ–๋Š” ์ธํ„ฐํŽ˜์ด์Šค +public interface NumberGenerator { + int make(); +} diff --git a/src/main/java/racingcar/model/RacingGame.java b/src/main/java/racingcar/model/RacingGame.java index 709097d..c1518ff 100644 --- a/src/main/java/racingcar/model/RacingGame.java +++ b/src/main/java/racingcar/model/RacingGame.java @@ -6,8 +6,12 @@ import java.util.List; public class RacingGame { - private static final List racingCars = new ArrayList<>(); + private final List racingCars = new ArrayList<>(); + private final NumberGenerator numberGenerator; + public RacingGame(NumberGenerator numberGenerator) { + this.numberGenerator = numberGenerator; + } public void enrollCars(List carNames) { carNames.forEach(name -> racingCars.add(new Car(name))); } diff --git a/src/main/java/racingcar/model/RandomNumberGenerator.java b/src/main/java/racingcar/model/RandomNumberGenerator.java new file mode 100644 index 0000000..b52edc9 --- /dev/null +++ b/src/main/java/racingcar/model/RandomNumberGenerator.java @@ -0,0 +1,11 @@ +package racingcar.model; + +import camp.nextstep.edu.missionutils.Randoms; + +public class RandomNumberGenerator implements NumberGenerator { + + @Override + public int make() { + return Randoms.pickNumberInRange(0, 9); + } +} From 7fe522b41daa232b3dcf02fe8c1487dbd37d2c99 Mon Sep 17 00:00:00 2001 From: Nahyun Kim Date: Sat, 18 Mar 2023 00:01:24 +0900 Subject: [PATCH 05/15] =?UTF-8?q?feat:=20=EC=9E=90=EB=8F=99=EC=B0=A8?= =?UTF-8?q?=EA=B0=80=20=EC=A0=84=EB=8B=AC=EB=B0=9B=EC=9D=80=20=EC=88=AB?= =?UTF-8?q?=EC=9E=90=EC=97=90=20=EB=94=B0=EB=9D=BC=20=EC=9D=B4=EB=8F=99?= =?UTF-8?q?=ED=95=98=EB=8A=94=20=EA=B8=B0=EB=8A=A5=20=EA=B5=AC=ED=98=84?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../controller/RacingController.java | 1 + src/main/java/racingcar/dto/CarDTO.java | 27 +++++++++++++++++++ src/main/java/racingcar/model/RacingGame.java | 9 +++++++ src/main/java/racingcar/model/domain/Car.java | 11 ++++++++ 4 files changed, 48 insertions(+) create mode 100644 src/main/java/racingcar/dto/CarDTO.java diff --git a/src/main/java/racingcar/controller/RacingController.java b/src/main/java/racingcar/controller/RacingController.java index b161971..822bd9b 100644 --- a/src/main/java/racingcar/controller/RacingController.java +++ b/src/main/java/racingcar/controller/RacingController.java @@ -12,6 +12,7 @@ public class RacingController { public void run() { enrollCarToRace(); + System.out.println(racingGame.moveCars()); } public void enrollCarToRace() { diff --git a/src/main/java/racingcar/dto/CarDTO.java b/src/main/java/racingcar/dto/CarDTO.java new file mode 100644 index 0000000..02ededb --- /dev/null +++ b/src/main/java/racingcar/dto/CarDTO.java @@ -0,0 +1,27 @@ +package racingcar.dto; + +public class CarDTO { + private final String name; + private final int position; + + public CarDTO(String name, int position) { + this.name = name; + this.position = position; + } + + public String getName() { + return name; + } + + public int getPosition() { + return position; + } + + @Override + public String toString() { + return "CarDTO{" + + "name='" + name + '\'' + + ", position=" + position + + '}'; + } +} diff --git a/src/main/java/racingcar/model/RacingGame.java b/src/main/java/racingcar/model/RacingGame.java index c1518ff..1c16bb2 100644 --- a/src/main/java/racingcar/model/RacingGame.java +++ b/src/main/java/racingcar/model/RacingGame.java @@ -1,9 +1,11 @@ package racingcar.model; +import racingcar.dto.CarDTO; import racingcar.model.domain.Car; import java.util.ArrayList; import java.util.List; +import java.util.stream.Collectors; public class RacingGame { private final List racingCars = new ArrayList<>(); @@ -15,4 +17,11 @@ public RacingGame(NumberGenerator numberGenerator) { public void enrollCars(List carNames) { carNames.forEach(name -> racingCars.add(new Car(name))); } + + public List moveCars() { + racingCars.forEach(car -> car.move(numberGenerator.make())); + return racingCars.stream() + .map(Car::to) + .collect(Collectors.toList()); + } } diff --git a/src/main/java/racingcar/model/domain/Car.java b/src/main/java/racingcar/model/domain/Car.java index 785a4a2..678281e 100644 --- a/src/main/java/racingcar/model/domain/Car.java +++ b/src/main/java/racingcar/model/domain/Car.java @@ -1,5 +1,7 @@ package racingcar.model.domain; +import racingcar.dto.CarDTO; + public class Car { private final String name; private int position = 0; @@ -13,4 +15,13 @@ private void validateName(String name) { if (name.length() > 5) throw new IllegalArgumentException("์ž๋™์ฐจ ์ด๋ฆ„์ด ๋‹ค์„ฏ ๊ธ€์ž๋ฅผ ์ดˆ๊ณผํ•ฉ๋‹ˆ๋‹ค."); } + + public void move(int number) { + if (number >= 4) + position++; + } + + public CarDTO to() { + return new CarDTO(name, position); + } } From b572eca2ced7bdb1ed5e3c721c89ba7eea8d086e Mon Sep 17 00:00:00 2001 From: Nahyun Kim Date: Sat, 18 Mar 2023 00:08:51 +0900 Subject: [PATCH 06/15] =?UTF-8?q?feat:=20=EC=8B=9C=EB=8F=84=ED=95=A0=20?= =?UTF-8?q?=ED=9A=9F=EC=88=98=EB=A5=BC=20=EC=9E=85=EB=A0=A5=EB=B0=9B?= =?UTF-8?q?=EB=8A=94=20=EA=B8=B0=EB=8A=A5=20=EA=B5=AC=ED=98=84?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../controller/RacingController.java | 7 ++++++- .../racingcar/view/utils/NumberParser.java | 21 +++++++++++++++++++ 2 files changed, 27 insertions(+), 1 deletion(-) create mode 100644 src/main/java/racingcar/view/utils/NumberParser.java diff --git a/src/main/java/racingcar/controller/RacingController.java b/src/main/java/racingcar/controller/RacingController.java index 822bd9b..262fc38 100644 --- a/src/main/java/racingcar/controller/RacingController.java +++ b/src/main/java/racingcar/controller/RacingController.java @@ -12,11 +12,16 @@ public class RacingController { public void run() { enrollCarToRace(); - System.out.println(racingGame.moveCars()); + moveCarsByCount(); } public void enrollCarToRace() { List carNames = inputView.inputCarNames(); racingGame.enrollCars(carNames); } + + public void moveCarsByCount() { + int moveCount = inputView.inputMoveCount(); + // moveCount๋งŒํผ ๋ฐ˜๋ณต ์ด๋™ + } } diff --git a/src/main/java/racingcar/view/utils/NumberParser.java b/src/main/java/racingcar/view/utils/NumberParser.java new file mode 100644 index 0000000..03520a8 --- /dev/null +++ b/src/main/java/racingcar/view/utils/NumberParser.java @@ -0,0 +1,21 @@ +package racingcar.view.utils; + +public class NumberParser { + private NumberParser() {} + + public static int parseDigit(String value) { + int number = parseInteger(value); + if (number <= 0) + throw new IllegalArgumentException("์ž…๋ ฅ๊ฐ’์ด ์ž์—ฐ์ˆ˜๊ฐ€ ์•„๋‹™๋‹ˆ๋‹ค."); + + return number; + } + + public static int parseInteger(String value) { + try { + return Integer.parseInt(value); // ์ˆซ์žํ˜•์˜ ๋ฌธ์ž์—ด์„ ์ธ์ž ๊ฐ’์œผ๋กœ ๋ฐ›์œผ๋ฉด ์‹ญ์ง„์ˆ˜์˜ Integer ํ˜•์œผ๋กœ ๋ณ€ํ™˜ํ•ด์คŒ + } catch (NumberFormatException e) { + throw new IllegalArgumentException("์ž…๋ ฅ๊ฐ’์ด ์ˆซ์ž๊ฐ€ ์•„๋‹™๋‹ˆ๋‹ค."); + } + } +} From 033477c88e249809acca60e96f666a7be867b09b Mon Sep 17 00:00:00 2001 From: Nahyun Kim Date: Sat, 18 Mar 2023 00:20:46 +0900 Subject: [PATCH 07/15] =?UTF-8?q?feat:=20=EC=A0=84=EB=8B=AC=EB=B0=9B?= =?UTF-8?q?=EC=9D=80=20=ED=9A=9F=EC=88=98=EB=A7=8C=ED=81=BC=20=EC=9E=90?= =?UTF-8?q?=EB=8F=99=EC=B0=A8=EB=A5=BC=20=EC=9D=B4=EB=8F=99=EC=8B=9C?= =?UTF-8?q?=ED=82=A4=EB=8A=94=20=EA=B8=B0=EB=8A=A5=20=EA=B5=AC=ED=98=84?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../racingcar/controller/RacingController.java | 4 +++- src/main/java/racingcar/dto/CarStatusDTO.java | 15 +++++++++++++++ src/main/java/racingcar/model/RacingGame.java | 8 ++++++++ 3 files changed, 26 insertions(+), 1 deletion(-) create mode 100644 src/main/java/racingcar/dto/CarStatusDTO.java diff --git a/src/main/java/racingcar/controller/RacingController.java b/src/main/java/racingcar/controller/RacingController.java index 262fc38..6e7a892 100644 --- a/src/main/java/racingcar/controller/RacingController.java +++ b/src/main/java/racingcar/controller/RacingController.java @@ -1,5 +1,6 @@ package racingcar.controller; +import racingcar.dto.CarStatusDTO; import racingcar.model.RacingGame; import racingcar.model.RandomNumberGenerator; import racingcar.view.InputView; @@ -8,7 +9,7 @@ public class RacingController { private final InputView inputView = new InputView(); - private static final RacingGame racingGame = new RacingGame(new RandomNumberGenerator()); + private final RacingGame racingGame = new RacingGame(new RandomNumberGenerator()); public void run() { enrollCarToRace(); @@ -23,5 +24,6 @@ public void enrollCarToRace() { public void moveCarsByCount() { int moveCount = inputView.inputMoveCount(); // moveCount๋งŒํผ ๋ฐ˜๋ณต ์ด๋™ + List carStatuses = racingGame.repeatMovingCars(moveCount); } } diff --git a/src/main/java/racingcar/dto/CarStatusDTO.java b/src/main/java/racingcar/dto/CarStatusDTO.java new file mode 100644 index 0000000..2dbc772 --- /dev/null +++ b/src/main/java/racingcar/dto/CarStatusDTO.java @@ -0,0 +1,15 @@ +package racingcar.dto; + +import java.util.List; + +public class CarStatusDTO { + private final List cars; + + public CarStatusDTO(List cars) { + this.cars = cars; + } + + public List getCars() { + return cars; + } +} diff --git a/src/main/java/racingcar/model/RacingGame.java b/src/main/java/racingcar/model/RacingGame.java index 1c16bb2..938d010 100644 --- a/src/main/java/racingcar/model/RacingGame.java +++ b/src/main/java/racingcar/model/RacingGame.java @@ -1,6 +1,7 @@ package racingcar.model; import racingcar.dto.CarDTO; +import racingcar.dto.CarStatusDTO; import racingcar.model.domain.Car; import java.util.ArrayList; @@ -18,6 +19,13 @@ public void enrollCars(List carNames) { carNames.forEach(name -> racingCars.add(new Car(name))); } + public List repeatMovingCars(int moveCount) { + List carStatuses = new ArrayList<>(); + for (int count = 0; count < moveCount; count++) + carStatuses.add(new CarStatusDTO(moveCars())); + return carStatuses; + } + public List moveCars() { racingCars.forEach(car -> car.move(numberGenerator.make())); return racingCars.stream() From 8b55998b5814aa7823c0b4ccae690dbc3e0451dd Mon Sep 17 00:00:00 2001 From: Nahyun Kim Date: Sat, 18 Mar 2023 00:54:14 +0900 Subject: [PATCH 08/15] =?UTF-8?q?feat:=20=ED=9A=9F=EC=88=98=EB=B3=84=20?= =?UTF-8?q?=EC=8B=A4=ED=96=89=20=EA=B2=B0=EA=B3=BC=20=EC=B6=9C=EB=A0=A5=20?= =?UTF-8?q?=EA=B8=B0=EB=8A=A5=20=EA=B5=AC=ED=98=84?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../controller/RacingController.java | 3 +++ src/main/java/racingcar/view/OutputView.java | 21 +++++++++++++++++++ 2 files changed, 24 insertions(+) diff --git a/src/main/java/racingcar/controller/RacingController.java b/src/main/java/racingcar/controller/RacingController.java index 6e7a892..54f5a2e 100644 --- a/src/main/java/racingcar/controller/RacingController.java +++ b/src/main/java/racingcar/controller/RacingController.java @@ -4,11 +4,13 @@ import racingcar.model.RacingGame; import racingcar.model.RandomNumberGenerator; import racingcar.view.InputView; +import racingcar.view.OutputView; import java.util.List; public class RacingController { private final InputView inputView = new InputView(); + private final OutputView outputView = new OutputView(); private final RacingGame racingGame = new RacingGame(new RandomNumberGenerator()); public void run() { @@ -25,5 +27,6 @@ public void moveCarsByCount() { int moveCount = inputView.inputMoveCount(); // moveCount๋งŒํผ ๋ฐ˜๋ณต ์ด๋™ List carStatuses = racingGame.repeatMovingCars(moveCount); + outputView.printGameResult(carStatuses); } } diff --git a/src/main/java/racingcar/view/OutputView.java b/src/main/java/racingcar/view/OutputView.java index abf938a..6cb8c96 100644 --- a/src/main/java/racingcar/view/OutputView.java +++ b/src/main/java/racingcar/view/OutputView.java @@ -1,4 +1,25 @@ package racingcar.view; +import racingcar.dto.CarDTO; +import racingcar.dto.CarStatusDTO; +import racingcar.view.utils.FormatParser; + +import java.util.List; + public class OutputView { + public void printGameResult(List carStatuses) { + System.out.println("์‹คํ–‰ ๊ฒฐ๊ณผ"); + carStatuses.forEach(this::printCarStatuses); + } + + private void printCarStatuses(CarStatusDTO carStatusDTO) { + List cars = carStatusDTO.getCars(); + cars.forEach(this::printCar); + System.out.println(); + } + + private void printCar(CarDTO carDTO) { + System.out.printf("%s : %s" + System.lineSeparator(), carDTO.getName(), + FormatParser.make(carDTO.getPosition(), "-")); // lineSeparator: ๊ฐœํ–‰๋ฌธ์ž + } } From cd883bf727539fab3a207d6901f4e9367195da5d Mon Sep 17 00:00:00 2001 From: Nahyun Kim Date: Sat, 18 Mar 2023 01:07:37 +0900 Subject: [PATCH 09/15] =?UTF-8?q?feat:=20=EC=9E=90=EB=8F=99=EC=B0=A8=20?= =?UTF-8?q?=EA=B0=84=20=EC=9C=84=EC=B9=98=20=EB=B9=84=EA=B5=90=20=ED=9B=84?= =?UTF-8?q?=20=EC=9A=B0=EC=8A=B9=EC=9E=90=EB=A5=BC=20=EA=B5=AC=ED=95=98?= =?UTF-8?q?=EB=8A=94=20=EA=B8=B0=EB=8A=A5=20=EA=B5=AC=ED=98=84?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../racingcar/controller/RacingController.java | 6 ++++++ src/main/java/racingcar/model/RacingGame.java | 17 +++++++++++++++++ src/main/java/racingcar/model/domain/Car.java | 8 ++++++++ 3 files changed, 31 insertions(+) diff --git a/src/main/java/racingcar/controller/RacingController.java b/src/main/java/racingcar/controller/RacingController.java index 54f5a2e..f15b1c2 100644 --- a/src/main/java/racingcar/controller/RacingController.java +++ b/src/main/java/racingcar/controller/RacingController.java @@ -16,6 +16,7 @@ public class RacingController { public void run() { enrollCarToRace(); moveCarsByCount(); + showWinner(); } public void enrollCarToRace() { @@ -29,4 +30,9 @@ public void moveCarsByCount() { List carStatuses = racingGame.repeatMovingCars(moveCount); outputView.printGameResult(carStatuses); } + + public void showWinner() { + List winnerNames = racingGame.findWinners(); + System.out.println(winnerNames); + } } diff --git a/src/main/java/racingcar/model/RacingGame.java b/src/main/java/racingcar/model/RacingGame.java index 938d010..602a341 100644 --- a/src/main/java/racingcar/model/RacingGame.java +++ b/src/main/java/racingcar/model/RacingGame.java @@ -32,4 +32,21 @@ public List moveCars() { .map(Car::to) .collect(Collectors.toList()); } + + public List findWinners() { + List winnerNames = new ArrayList<>(); + int maxPosition = 0; + for (Car car : racingCars) { + maxPosition = Math.max(maxPosition, car.getPosition()); + } + findCarsAtPosition(maxPosition).forEach(car -> + winnerNames.add(car.getName())); + return winnerNames; + } + + private List findCarsAtPosition(int position) { + return racingCars.stream() + .filter(car -> car.getPosition() == position) + .collect(Collectors.toList()); + } } diff --git a/src/main/java/racingcar/model/domain/Car.java b/src/main/java/racingcar/model/domain/Car.java index 678281e..959b8bc 100644 --- a/src/main/java/racingcar/model/domain/Car.java +++ b/src/main/java/racingcar/model/domain/Car.java @@ -21,6 +21,14 @@ public void move(int number) { position++; } + public String getName() { + return name; + } + + public int getPosition() { + return position; + } + public CarDTO to() { return new CarDTO(name, position); } From a65ea3de820b1ca5ed43a4ffdbe13ec9c6569698 Mon Sep 17 00:00:00 2001 From: Nahyun Kim Date: Sat, 18 Mar 2023 01:11:24 +0900 Subject: [PATCH 10/15] =?UTF-8?q?feat:=20=EC=9A=B0=EC=8A=B9=EC=9E=90(?= =?UTF-8?q?=EB=93=A4)=20=EC=95=88=EB=82=B4=20=EC=B6=9C=EB=A0=A5=20?= =?UTF-8?q?=EA=B8=B0=EB=8A=A5=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/controller/RacingController.java | 8 ++++---- src/main/java/racingcar/view/OutputView.java | 5 +++++ 2 files changed, 9 insertions(+), 4 deletions(-) diff --git a/src/main/java/racingcar/controller/RacingController.java b/src/main/java/racingcar/controller/RacingController.java index f15b1c2..8ef2828 100644 --- a/src/main/java/racingcar/controller/RacingController.java +++ b/src/main/java/racingcar/controller/RacingController.java @@ -16,7 +16,7 @@ public class RacingController { public void run() { enrollCarToRace(); moveCarsByCount(); - showWinner(); + showWinners(); } public void enrollCarToRace() { @@ -31,8 +31,8 @@ public void moveCarsByCount() { outputView.printGameResult(carStatuses); } - public void showWinner() { + public void showWinners() { List winnerNames = racingGame.findWinners(); - System.out.println(winnerNames); + outputView.printWinners(winnerNames); } -} +} \ No newline at end of file diff --git a/src/main/java/racingcar/view/OutputView.java b/src/main/java/racingcar/view/OutputView.java index 6cb8c96..e214711 100644 --- a/src/main/java/racingcar/view/OutputView.java +++ b/src/main/java/racingcar/view/OutputView.java @@ -22,4 +22,9 @@ private void printCar(CarDTO carDTO) { System.out.printf("%s : %s" + System.lineSeparator(), carDTO.getName(), FormatParser.make(carDTO.getPosition(), "-")); // lineSeparator: ๊ฐœํ–‰๋ฌธ์ž } + + public void printWinners(List winnerNames) { + System.out.printf("์ตœ์ข… ์šฐ์Šน์ž : %s" + System.lineSeparator(), + FormatParser.join(winnerNames, ", ")); + } } From 8a0376d6c84563399d0ba2e79a0d46a94288201c Mon Sep 17 00:00:00 2001 From: Nahyun Kim Date: Sat, 18 Mar 2023 01:13:33 +0900 Subject: [PATCH 11/15] =?UTF-8?q?feat:=20=EC=97=90=EB=9F=AC=20=EB=A9=94?= =?UTF-8?q?=EC=8B=9C=EC=A7=80=20=EC=B6=9C=EB=A0=A5=20=EA=B8=B0=EB=8A=A5=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/view/OutputView.java | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/src/main/java/racingcar/view/OutputView.java b/src/main/java/racingcar/view/OutputView.java index e214711..8bd6177 100644 --- a/src/main/java/racingcar/view/OutputView.java +++ b/src/main/java/racingcar/view/OutputView.java @@ -27,4 +27,8 @@ public void printWinners(List winnerNames) { System.out.printf("์ตœ์ข… ์šฐ์Šน์ž : %s" + System.lineSeparator(), FormatParser.join(winnerNames, ", ")); } + + public void printErrorMessage(String message) { + System.out.printf("[ERROR] %s" + System.lineSeparator(), message); + } } From 3cc2b3db5da133e75df15ca55baf33ce06d556ff Mon Sep 17 00:00:00 2001 From: Nahyun Kim Date: Sat, 18 Mar 2023 01:22:30 +0900 Subject: [PATCH 12/15] =?UTF-8?q?feat:=20=EC=9E=98=EB=AA=BB=EB=90=9C=20?= =?UTF-8?q?=EA=B0=92=20=EC=9E=85=EB=A0=A5=20=EC=8B=9C=20=EA=B7=B8=EB=B6=80?= =?UTF-8?q?=EB=B6=84=EB=B6=80=ED=84=B0=20=EC=9E=AC=EC=9E=85=EB=A0=A5?= =?UTF-8?q?=ED=95=98=EB=8A=94=20=EA=B8=B0=EB=8A=A5=20=EA=B5=AC=ED=98=84?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../controller/RacingController.java | 17 +++++++++++------ .../controller/util/ExceptionHandler.java | 19 +++++++++++++++++++ 2 files changed, 30 insertions(+), 6 deletions(-) create mode 100644 src/main/java/racingcar/controller/util/ExceptionHandler.java diff --git a/src/main/java/racingcar/controller/RacingController.java b/src/main/java/racingcar/controller/RacingController.java index 8ef2828..95740d5 100644 --- a/src/main/java/racingcar/controller/RacingController.java +++ b/src/main/java/racingcar/controller/RacingController.java @@ -1,5 +1,6 @@ package racingcar.controller; +import racingcar.controller.util.ExceptionHandler; import racingcar.dto.CarStatusDTO; import racingcar.model.RacingGame; import racingcar.model.RandomNumberGenerator; @@ -14,24 +15,28 @@ public class RacingController { private final RacingGame racingGame = new RacingGame(new RandomNumberGenerator()); public void run() { - enrollCarToRace(); - moveCarsByCount(); - showWinners(); + executeFunction(this::enrollCarToRace); + executeFunction(this::moveCarsByCount); + executeFunction(this::showWinners); } - public void enrollCarToRace() { + private void executeFunction(Runnable runnable) { + ExceptionHandler.retryForIllegalArgument(runnable, outputView::printErrorMessage); + } + + private void enrollCarToRace() { List carNames = inputView.inputCarNames(); racingGame.enrollCars(carNames); } - public void moveCarsByCount() { + private void moveCarsByCount() { int moveCount = inputView.inputMoveCount(); // moveCount๋งŒํผ ๋ฐ˜๋ณต ์ด๋™ List carStatuses = racingGame.repeatMovingCars(moveCount); outputView.printGameResult(carStatuses); } - public void showWinners() { + private void showWinners() { List winnerNames = racingGame.findWinners(); outputView.printWinners(winnerNames); } diff --git a/src/main/java/racingcar/controller/util/ExceptionHandler.java b/src/main/java/racingcar/controller/util/ExceptionHandler.java new file mode 100644 index 0000000..9e9a009 --- /dev/null +++ b/src/main/java/racingcar/controller/util/ExceptionHandler.java @@ -0,0 +1,19 @@ +package racingcar.controller.util; + +import java.util.function.Consumer; + +public class ExceptionHandler { + private ExceptionHandler() { + } + + public static void retryForIllegalArgument(Runnable runnable, Consumer exceptionMessageHandling) { + while (true) { + try { + runnable.run(); + return; + } catch (IllegalArgumentException exception) { + exceptionMessageHandling.accept(exception.getMessage()); + } + } + } +} From 747c46f8e4b0589ee8d3d3b56514a92300d2f248 Mon Sep 17 00:00:00 2001 From: Nahyun Kim Date: Tue, 21 Mar 2023 22:34:55 +0900 Subject: [PATCH 13/15] =?UTF-8?q?fix:=20=EB=B3=80=EC=88=98=20=EC=9D=B4?= =?UTF-8?q?=EB=A6=84=20=EB=B0=8F=20=ED=95=A8=EC=88=98=20=EC=9D=BC=EB=B6=80?= =?UTF-8?q?=20=EB=B3=80=EA=B2=BD=20=EB=B0=8F=20=EC=98=88=EC=99=B8=20?= =?UTF-8?q?=EC=B2=98=EB=A6=AC=20=EC=B6=94=EA=B0=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../controller/RacingController.java | 16 +++++++++----- .../controller/util/ExceptionHandler.java | 4 ++-- src/main/java/racingcar/dto/CarDTO.java | 2 +- src/main/java/racingcar/dto/CarStatusDTO.java | 2 +- .../java/racingcar/model/NumberGenerator.java | 2 +- src/main/java/racingcar/model/RacingGame.java | 22 +++++++++---------- .../model/RandomNumberGenerator.java | 2 +- src/main/java/racingcar/model/domain/Car.java | 17 +++++++++----- src/main/java/racingcar/view/InputView.java | 5 ++--- src/main/java/racingcar/view/OutputView.java | 8 +++---- .../racingcar/view/utils/FormatParser.java | 17 +++++++++----- .../racingcar/view/utils/NumberParser.java | 2 +- 12 files changed, 58 insertions(+), 41 deletions(-) diff --git a/src/main/java/racingcar/controller/RacingController.java b/src/main/java/racingcar/controller/RacingController.java index 95740d5..84a9f6c 100644 --- a/src/main/java/racingcar/controller/RacingController.java +++ b/src/main/java/racingcar/controller/RacingController.java @@ -15,12 +15,17 @@ public class RacingController { private final RacingGame racingGame = new RacingGame(new RandomNumberGenerator()); public void run() { - executeFunction(this::enrollCarToRace); - executeFunction(this::moveCarsByCount); - executeFunction(this::showWinners); + try { + repeatUntilGetLegalAnswer(this::enrollCarToRace); + repeatUntilGetLegalAnswer(this::moveCarsByCount); + showWinners(); + } catch (Exception e) { + e.printStackTrace(); + outputView.printErrorMessage(e.getMessage()); + } } - private void executeFunction(Runnable runnable) { + private void repeatUntilGetLegalAnswer(Runnable runnable) { ExceptionHandler.retryForIllegalArgument(runnable, outputView::printErrorMessage); } @@ -31,8 +36,7 @@ private void enrollCarToRace() { private void moveCarsByCount() { int moveCount = inputView.inputMoveCount(); - // moveCount๋งŒํผ ๋ฐ˜๋ณต ์ด๋™ - List carStatuses = racingGame.repeatMovingCars(moveCount); + List carStatuses = racingGame.repeatMovingCars(moveCount); // moveCount๋งŒํผ ๋ฐ˜๋ณต ์ด๋™ outputView.printGameResult(carStatuses); } diff --git a/src/main/java/racingcar/controller/util/ExceptionHandler.java b/src/main/java/racingcar/controller/util/ExceptionHandler.java index 9e9a009..5e2419c 100644 --- a/src/main/java/racingcar/controller/util/ExceptionHandler.java +++ b/src/main/java/racingcar/controller/util/ExceptionHandler.java @@ -11,8 +11,8 @@ public static void retryForIllegalArgument(Runnable runnable, Consumer e try { runnable.run(); return; - } catch (IllegalArgumentException exception) { - exceptionMessageHandling.accept(exception.getMessage()); + } catch (IllegalArgumentException e) { + exceptionMessageHandling.accept(e.getMessage()); } } } diff --git a/src/main/java/racingcar/dto/CarDTO.java b/src/main/java/racingcar/dto/CarDTO.java index 02ededb..160e08e 100644 --- a/src/main/java/racingcar/dto/CarDTO.java +++ b/src/main/java/racingcar/dto/CarDTO.java @@ -24,4 +24,4 @@ public String toString() { ", position=" + position + '}'; } -} +} \ No newline at end of file diff --git a/src/main/java/racingcar/dto/CarStatusDTO.java b/src/main/java/racingcar/dto/CarStatusDTO.java index 2dbc772..2f080b5 100644 --- a/src/main/java/racingcar/dto/CarStatusDTO.java +++ b/src/main/java/racingcar/dto/CarStatusDTO.java @@ -12,4 +12,4 @@ public CarStatusDTO(List cars) { public List getCars() { return cars; } -} +} \ No newline at end of file diff --git a/src/main/java/racingcar/model/NumberGenerator.java b/src/main/java/racingcar/model/NumberGenerator.java index 8d6f126..25aa8e4 100644 --- a/src/main/java/racingcar/model/NumberGenerator.java +++ b/src/main/java/racingcar/model/NumberGenerator.java @@ -3,4 +3,4 @@ @FunctionalInterface // 1๊ฐœ์˜ ์ถ”์ƒ ๋ฉ”์†Œ๋“œ๋ฅผ ๊ฐ–๋Š” ์ธํ„ฐํŽ˜์ด์Šค public interface NumberGenerator { int make(); -} +} \ No newline at end of file diff --git a/src/main/java/racingcar/model/RacingGame.java b/src/main/java/racingcar/model/RacingGame.java index 602a341..3f258ee 100644 --- a/src/main/java/racingcar/model/RacingGame.java +++ b/src/main/java/racingcar/model/RacingGame.java @@ -5,6 +5,7 @@ import racingcar.model.domain.Car; import java.util.ArrayList; +import java.util.Collections; import java.util.List; import java.util.stream.Collectors; @@ -15,6 +16,7 @@ public class RacingGame { public RacingGame(NumberGenerator numberGenerator) { this.numberGenerator = numberGenerator; } + public void enrollCars(List carNames) { carNames.forEach(name -> racingCars.add(new Car(name))); } @@ -34,19 +36,17 @@ public List moveCars() { } public List findWinners() { - List winnerNames = new ArrayList<>(); - int maxPosition = 0; + List winners = new ArrayList<>(); for (Car car : racingCars) { - maxPosition = Math.max(maxPosition, car.getPosition()); + if (findAnyHeadCar().compareTo(car) == 0) + winners.add(car.getName()); } - findCarsAtPosition(maxPosition).forEach(car -> - winnerNames.add(car.getName())); - return winnerNames; + return winners; } - private List findCarsAtPosition(int position) { - return racingCars.stream() - .filter(car -> car.getPosition() == position) - .collect(Collectors.toList()); + private Car findAnyHeadCar() { + List sortedCars = new ArrayList<>(racingCars); + Collections.sort(sortedCars); // Car ํด๋ž˜์Šค์˜ compareTo()๋กœ ์ธํ•ด position์— ๋”ฐ๋ผ ๋งŽ์ด ์ „์ง„ํ•œ ์ˆœ๋Œ€๋กœ ์ •๋ ฌ + return sortedCars.get(0); } -} +} \ No newline at end of file diff --git a/src/main/java/racingcar/model/RandomNumberGenerator.java b/src/main/java/racingcar/model/RandomNumberGenerator.java index b52edc9..62be458 100644 --- a/src/main/java/racingcar/model/RandomNumberGenerator.java +++ b/src/main/java/racingcar/model/RandomNumberGenerator.java @@ -8,4 +8,4 @@ public class RandomNumberGenerator implements NumberGenerator { public int make() { return Randoms.pickNumberInRange(0, 9); } -} +} \ No newline at end of file diff --git a/src/main/java/racingcar/model/domain/Car.java b/src/main/java/racingcar/model/domain/Car.java index 959b8bc..d38308c 100644 --- a/src/main/java/racingcar/model/domain/Car.java +++ b/src/main/java/racingcar/model/domain/Car.java @@ -2,7 +2,7 @@ import racingcar.dto.CarDTO; -public class Car { +public class Car implements Comparable { private final String name; private int position = 0; @@ -17,19 +17,26 @@ private void validateName(String name) { } public void move(int number) { + validateNumber(number); if (number >= 4) position++; } - public String getName() { - return name; + public void validateNumber(int number) { + if (number < 0 || number > 9) + throw new IllegalArgumentException("์ „์ง„ํ•˜๋Š” ์กฐ๊ฑด์€ 0์—์„œ 9 ์‚ฌ์ด์˜ ์ˆซ์ž์ผ ๋•Œ์ž…๋‹ˆ๋‹ค."); } - public int getPosition() { - return position; + public String getName() { + return name; } public CarDTO to() { return new CarDTO(name, position); } + + @Override + public int compareTo(Car anotherCar) { + return anotherCar.position - this.position; + } } diff --git a/src/main/java/racingcar/view/InputView.java b/src/main/java/racingcar/view/InputView.java index b37e6b5..cbc322d 100644 --- a/src/main/java/racingcar/view/InputView.java +++ b/src/main/java/racingcar/view/InputView.java @@ -10,13 +10,12 @@ public class InputView { public List inputCarNames() { System.out.println("๊ฒฝ์ฃผํ•  ์ž๋™์ฐจ ์ด๋ฆ„๋“ค์„ ์ž…๋ ฅํ•˜์„ธ์š”. (์ด๋ฆ„์€ ์‰ผํ‘œ(,)๋กœ ๊ตฌ๋ถ„ํ•จ)"); String line = Console.readLine(); // ์ฝ˜์†”๋กœ๋ถ€ํ„ฐ ๊ฐ’ ์ฝ๊ธฐ - return FormatParser.split(line, ","); + return FormatParser.split(line, ","); // ',' ๋‹จ์œ„๋กœ ์ž๋ฅธ ๊ณต๋ฐฑ ์ œ๊ฑฐํ•œ ์ž…๋ ฅํ•œ ์ž๋™์ฐจ ์ด๋ฆ„๋“ค์˜ ๋ชฉ๋ก } public int inputMoveCount() { System.out.println("๋ช‡ ๋ฒˆ ์‹œ๋„ํ• ์ง€ ์ž…๋ ฅํ•˜์„ธ์š”. (์ˆซ์ž)"); String line = Console.readLine(); - return NumberParser.parseDigit(line); - + return NumberParser.parseDigit(line); // ์ž…๋ ฅ๊ฐ’์„ ์ •์ˆ˜๋กœ ๋ณ€ํ™˜ } } diff --git a/src/main/java/racingcar/view/OutputView.java b/src/main/java/racingcar/view/OutputView.java index 8bd6177..c5dcbfc 100644 --- a/src/main/java/racingcar/view/OutputView.java +++ b/src/main/java/racingcar/view/OutputView.java @@ -7,13 +7,13 @@ import java.util.List; public class OutputView { - public void printGameResult(List carStatuses) { + public void printGameResult(List carStatuses) { // ๊ฒฝ์ฃผ ๊ฒฐ๊ณผ ์ž๋™์ฐจ๋“ค ๊ฐ๊ฐ ์ƒํƒœ ์ถœ๋ ฅ System.out.println("์‹คํ–‰ ๊ฒฐ๊ณผ"); carStatuses.forEach(this::printCarStatuses); } - private void printCarStatuses(CarStatusDTO carStatusDTO) { - List cars = carStatusDTO.getCars(); + private void printCarStatuses(CarStatusDTO carStatus) { + List cars = carStatus.getCars(); cars.forEach(this::printCar); System.out.println(); } @@ -31,4 +31,4 @@ public void printWinners(List winnerNames) { public void printErrorMessage(String message) { System.out.printf("[ERROR] %s" + System.lineSeparator(), message); } -} +} \ No newline at end of file diff --git a/src/main/java/racingcar/view/utils/FormatParser.java b/src/main/java/racingcar/view/utils/FormatParser.java index 6a46a36..52ea8c1 100644 --- a/src/main/java/racingcar/view/utils/FormatParser.java +++ b/src/main/java/racingcar/view/utils/FormatParser.java @@ -10,19 +10,26 @@ private FormatParser() { public static List split(String line, String delimiter) { validateWrongFormat(line); - String[] values = line.split(delimiter); + String[] values = line.split(delimiter); // ๋ฌธ์ž์—ด ๋ฐฐ์—ด List parsedValue = Arrays.stream(values) .map(String::trim) // trim: ๋ฌธ์ž์—ด ๊ณต๋ฐฑ ์ œ๊ฑฐ .collect(Collectors.toList()); validateEmpty(parsedValue); return parsedValue; } - - private static boolean validateWrongFormat(String line) { - if (line.isEmpty()) + private static void validateWrongFormat(String line) { + if (hasWrongFormat(line)) { throw new IllegalArgumentException("์ž…๋ ฅ๊ฐ’์˜ ํ˜•์‹์ด ์ž˜๋ชป๋˜์—ˆ์Šต๋‹ˆ๋‹ค."); - return line.startsWith(",") || line.endsWith(","); } + } + + private static boolean hasWrongFormat(String line) { + if (line.isEmpty()) { + return true; + } + return line.startsWith(",") || line.endsWith(","); + } + private static void validateEmpty(List values) { if (hasEmptyValue(values)) throw new IllegalArgumentException("์ž…๋ ฅ๊ฐ’์— ๋นˆ ๋ฌธ์ž์—ด์ด ์žˆ์Šต๋‹ˆ๋‹ค."); diff --git a/src/main/java/racingcar/view/utils/NumberParser.java b/src/main/java/racingcar/view/utils/NumberParser.java index 03520a8..e990a60 100644 --- a/src/main/java/racingcar/view/utils/NumberParser.java +++ b/src/main/java/racingcar/view/utils/NumberParser.java @@ -4,7 +4,7 @@ public class NumberParser { private NumberParser() {} public static int parseDigit(String value) { - int number = parseInteger(value); + int number = parseInteger(value); // ์ž…๋ ฅ๊ฐ’์„ ์ •์ˆ˜๋กœ ๋ณ€ํ™˜ if (number <= 0) throw new IllegalArgumentException("์ž…๋ ฅ๊ฐ’์ด ์ž์—ฐ์ˆ˜๊ฐ€ ์•„๋‹™๋‹ˆ๋‹ค."); From 5e04967eb63d25b425b3715373bf9ec7c4ae25ca Mon Sep 17 00:00:00 2001 From: Nahyun Kim Date: Tue, 21 Mar 2023 22:56:39 +0900 Subject: [PATCH 14/15] =?UTF-8?q?fix:=20java=20version=EC=9C=BC=EB=A1=9C?= =?UTF-8?q?=20=EC=9D=B8=ED=95=B4=20=EB=8F=8C=EC=95=84=EA=B0=80=EC=A7=80=20?= =?UTF-8?q?=EC=95=8A=EB=8D=98=20repeat=20=EB=B6=80=EB=B6=84=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/racingcar/view/utils/FormatParser.java | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/src/main/java/racingcar/view/utils/FormatParser.java b/src/main/java/racingcar/view/utils/FormatParser.java index 52ea8c1..64958e1 100644 --- a/src/main/java/racingcar/view/utils/FormatParser.java +++ b/src/main/java/racingcar/view/utils/FormatParser.java @@ -45,6 +45,9 @@ public static String join(List values, String delimiter) { } public static String make(int count, String unit) { - return unit.repeat(count); + String units = ""; + for (int i = 0; i < count; i++) + units = units + unit.charAt(i); + return units; } } From 4f7d694b5f954c9f1d7f200c6b255527a6870cc4 Mon Sep 17 00:00:00 2001 From: Nahyun Kim Date: Tue, 21 Mar 2023 23:36:31 +0900 Subject: [PATCH 15/15] =?UTF-8?q?fix:=20charAt()=EC=9D=98=20argument=20?= =?UTF-8?q?=EC=88=98=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/main/java/racingcar/view/utils/FormatParser.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/main/java/racingcar/view/utils/FormatParser.java b/src/main/java/racingcar/view/utils/FormatParser.java index 64958e1..ec61b4c 100644 --- a/src/main/java/racingcar/view/utils/FormatParser.java +++ b/src/main/java/racingcar/view/utils/FormatParser.java @@ -47,7 +47,7 @@ public static String join(List values, String delimiter) { public static String make(int count, String unit) { String units = ""; for (int i = 0; i < count; i++) - units = units + unit.charAt(i); + units = units + unit.charAt(0); return units; } }