From 79173a59260b28f3365c11ef140495ecc738c5dc Mon Sep 17 00:00:00 2001 From: tjdgus3488 Date: Tue, 26 Mar 2024 04:50:04 +0900 Subject: [PATCH 1/5] =?UTF-8?q?=EB=9E=9C=EB=8D=A4=20=EA=B0=92=20=EA=B5=AC?= =?UTF-8?q?=ED=95=98=EA=B8=B0=20=EA=B5=AC=ED=98=84?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- build.gradle | 3 ++ src/main/java/RacingMain.java | 7 --- src/main/java/controller/RacingMain.java | 18 ++++++++ src/main/java/domain/RacingGame.java | 55 ++++++++++++++++++++++++ src/main/java/view/InputView.java | 17 ++++++++ src/main/java/view/ResultView.java | 16 +++++++ 6 files changed, 109 insertions(+), 7 deletions(-) delete mode 100644 src/main/java/RacingMain.java create mode 100644 src/main/java/controller/RacingMain.java create mode 100644 src/main/java/domain/RacingGame.java create mode 100644 src/main/java/view/InputView.java create mode 100644 src/main/java/view/ResultView.java diff --git a/build.gradle b/build.gradle index 3697236..797a137 100644 --- a/build.gradle +++ b/build.gradle @@ -6,6 +6,7 @@ version '1.0-SNAPSHOT' repositories { mavenCentral() + maven { url 'https://jitpack.io' } } dependencies { @@ -13,6 +14,8 @@ dependencies { testImplementation platform('org.assertj:assertj-bom:3.25.1') testImplementation('org.junit.jupiter:junit-jupiter') testImplementation('org.assertj:assertj-core') + + implementation 'com.github.kokodak:mission-utils:1.0.0' } java { diff --git a/src/main/java/RacingMain.java b/src/main/java/RacingMain.java deleted file mode 100644 index 4394287..0000000 --- a/src/main/java/RacingMain.java +++ /dev/null @@ -1,7 +0,0 @@ -public class RacingMain { - - public static void main(String[] args) { - // TODO: MVC 패턴을 기반으로 자동차 경주 미션 구현해보기 - System.out.println("Hello, World!"); - } -} diff --git a/src/main/java/controller/RacingMain.java b/src/main/java/controller/RacingMain.java new file mode 100644 index 0000000..9314ea4 --- /dev/null +++ b/src/main/java/controller/RacingMain.java @@ -0,0 +1,18 @@ +package controller; + +import view.InputView; +import view.ResultView; +import domain.RacingGame; + +public class RacingMain { + public static void main(final String... args) { + final var carNames = InputView.getCarNames(); + final var tryCount = InputView.getTryCount(); + + final var racingGame = new RacingGame(carNames, tryCount); + racingGame.race(); + + ResultView.printWinners(racingGame.getWinners()); + } + +} diff --git a/src/main/java/domain/RacingGame.java b/src/main/java/domain/RacingGame.java new file mode 100644 index 0000000..11d8ca7 --- /dev/null +++ b/src/main/java/domain/RacingGame.java @@ -0,0 +1,55 @@ +package domain; + + +import org.kokodak.Randoms; +import view.ResultView; + +import java.util.HashMap; +import java.util.List; +import java.util.Map; + +public class RacingGame { + private final String carNames; + private final int tryCount; + String[] carList; + Map carMove; + + public RacingGame(String carNames, int tryCount) { + this.carNames = carNames; + this.carList = carNames.split(","); + this.tryCount = tryCount; + } + + public void race() { + carMove = setCarMove(carList); + for (int i = 0; i < tryCount; i++) { + setRandomMove(); + ResultView.printCarMove(carMove, tryCount); + } + + } + + private Map setCarMove(String[] carList) { + Map carMove = new HashMap<>(); + for (String s : carList) { + carMove.put(s, 0); + } + return carMove; + } + + private void setRandomMove() { + for (int i = 0; i < carList.length; i++) { + int move = Randoms.pickNumberInRange(0, 9); + if (move >= 4) { + carMove.put(carList[i], carMove.get(carList[i]) + 1); + } + } + } + + public List getWinners() { + + List winners; + + return winners; + } +} diff --git a/src/main/java/view/InputView.java b/src/main/java/view/InputView.java new file mode 100644 index 0000000..7b78b70 --- /dev/null +++ b/src/main/java/view/InputView.java @@ -0,0 +1,17 @@ +package view; + +import org.kokodak.Console; + +public class InputView { + + public static String getCarNames() { + System.out.println("경주할 자동차 이름을 입력하세요(이름은 쉼표(,)를 기준으로 구분)."); + return Console.readLine(); + } + + public static int getTryCount() { + System.out.println("시도할 회수는 몇회인가요?"); + String str = Console.readLine(); + return Integer.parseInt(str); + } +} diff --git a/src/main/java/view/ResultView.java b/src/main/java/view/ResultView.java new file mode 100644 index 0000000..0b82992 --- /dev/null +++ b/src/main/java/view/ResultView.java @@ -0,0 +1,16 @@ +package view; + +import java.util.List; +import java.util.Map; + +public class ResultView { + + public static void printCarMove(Map carMove, int tryCount) { + for (int i = 0; i < tryCount; i++) { + + } + } + public static void printWinners(List winners) { + + } +} From f48e143aa86b006ee137731e57be5c24e9582691 Mon Sep 17 00:00:00 2001 From: tjdgus3488 Date: Tue, 26 Mar 2024 15:26:49 +0900 Subject: [PATCH 2/5] =?UTF-8?q?=EB=8F=99=EC=9E=91=20=EC=99=84=EB=A3=8C=20+?= =?UTF-8?q?=20=EC=97=90=EB=9F=AC=20=EC=B2=98=EB=A6=AC=20=ED=95=84=EC=9A=94?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/main/java/controller/RacingMain.java | 2 +- src/main/java/domain/RacingGame.java | 34 ++++++++++++++++-------- src/main/java/view/ResultView.java | 13 ++++++--- 3 files changed, 33 insertions(+), 16 deletions(-) diff --git a/src/main/java/controller/RacingMain.java b/src/main/java/controller/RacingMain.java index 9314ea4..0ef03bc 100644 --- a/src/main/java/controller/RacingMain.java +++ b/src/main/java/controller/RacingMain.java @@ -10,9 +10,9 @@ public static void main(final String... args) { final var tryCount = InputView.getTryCount(); final var racingGame = new RacingGame(carNames, tryCount); + System.out.print("\n실행 결과"); racingGame.race(); ResultView.printWinners(racingGame.getWinners()); } - } diff --git a/src/main/java/domain/RacingGame.java b/src/main/java/domain/RacingGame.java index 11d8ca7..11499ef 100644 --- a/src/main/java/domain/RacingGame.java +++ b/src/main/java/domain/RacingGame.java @@ -4,6 +4,7 @@ import org.kokodak.Randoms; import view.ResultView; +import java.util.Collections; import java.util.HashMap; import java.util.List; import java.util.Map; @@ -12,7 +13,7 @@ public class RacingGame { private final String carNames; private final int tryCount; String[] carList; - Map carMove; + Map moveCnt; public RacingGame(String carNames, int tryCount) { this.carNames = carNames; @@ -21,35 +22,46 @@ public RacingGame(String carNames, int tryCount) { } public void race() { - carMove = setCarMove(carList); + moveCnt = setMoveCnt(carList); for (int i = 0; i < tryCount; i++) { + System.out.println(); setRandomMove(); - ResultView.printCarMove(carMove, tryCount); + ResultView.printCarMove(moveCnt); } } - private Map setCarMove(String[] carList) { - Map carMove = new HashMap<>(); + private Map setMoveCnt(String[] carList) { + Map moveCnt = new HashMap<>(); for (String s : carList) { - carMove.put(s, 0); + moveCnt.put(s, 0); } - return carMove; + return moveCnt; } private void setRandomMove() { for (int i = 0; i < carList.length; i++) { int move = Randoms.pickNumberInRange(0, 9); if (move >= 4) { - carMove.put(carList[i], carMove.get(carList[i]) + 1); + moveCnt.put(carList[i], moveCnt.get(carList[i]) + 1); } } } public List getWinners() { + System.out.println(); + for (String s : moveCnt.keySet()) { + String bars = "-".repeat(moveCnt.get(s)); + System.out.println(s + " : " + bars); + } + return findWinners(moveCnt); + } - List winners; - - return winners; + private List findWinners(Map moveCnt) { + int max = Collections.max(moveCnt.values()); + return moveCnt.entrySet().stream() + .filter(m -> m.getValue() == max) + .map(Map.Entry::getKey) + .toList(); } } diff --git a/src/main/java/view/ResultView.java b/src/main/java/view/ResultView.java index 0b82992..1ddd71d 100644 --- a/src/main/java/view/ResultView.java +++ b/src/main/java/view/ResultView.java @@ -5,12 +5,17 @@ public class ResultView { - public static void printCarMove(Map carMove, int tryCount) { - for (int i = 0; i < tryCount; i++) { - + public static void printCarMove(Map moveCnt) { + for (String s : moveCnt.keySet()) { + String bars = "-".repeat(moveCnt.get(s)); + System.out.println(s + " : " + bars); } } public static void printWinners(List winners) { - + System.out.println(); + for (int i = 0; i < winners.size() - 1; i++) { + System.out.print(winners.get(i) + ", "); + } + System.out.println(winners.get(winners.size() - 1) + "가 최종 우승했습니다."); } } From 73debda2883d44efc2c84105dd621c783f794d1d Mon Sep 17 00:00:00 2001 From: tjdgus3488 Date: Tue, 26 Mar 2024 17:43:24 +0900 Subject: [PATCH 3/5] =?UTF-8?q?=EC=97=90=EB=9F=AC=20=EB=A9=94=EC=84=B8?= =?UTF-8?q?=EC=A7=80=20=EC=B6=9C=EB=A0=A5?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/main/java/domain/RacingGame.java | 50 +++++++++++++++++------- src/main/java/view/ExceptionMessage.java | 15 +++++++ src/main/java/view/InputView.java | 41 +++++++++++++++++-- 3 files changed, 88 insertions(+), 18 deletions(-) create mode 100644 src/main/java/view/ExceptionMessage.java diff --git a/src/main/java/domain/RacingGame.java b/src/main/java/domain/RacingGame.java index 11499ef..ba8a02a 100644 --- a/src/main/java/domain/RacingGame.java +++ b/src/main/java/domain/RacingGame.java @@ -2,25 +2,30 @@ import org.kokodak.Randoms; +import view.ExceptionMessage; import view.ResultView; -import java.util.Collections; -import java.util.HashMap; -import java.util.List; -import java.util.Map; +import java.util.*; public class RacingGame { - private final String carNames; private final int tryCount; - String[] carList; - Map moveCnt; + List carList; + public Map moveCnt; - public RacingGame(String carNames, int tryCount) { - this.carNames = carNames; - this.carList = carNames.split(","); + public RacingGame(List carNames, int tryCount) { + this.carList = carNames; this.tryCount = tryCount; } + public List splitCarNames(String carNames) { + List list; + list = Arrays.stream(carNames.split(",")) + .map(String::trim) + .toList(); + isValidCarName(list); + return list; + } + public void race() { moveCnt = setMoveCnt(carList); for (int i = 0; i < tryCount; i++) { @@ -31,7 +36,18 @@ public void race() { } - private Map setMoveCnt(String[] carList) { + private void isValidCarName(List carList) { + carList.forEach(this::isValidCarNameLength); + } + + private void isValidCarNameLength(String carName) { + if (carName.length() < 1 || carName.length() > 5) { + ExceptionMessage.isInvalidNameLength(); + throw new IllegalArgumentException(); + } + } + + private Map setMoveCnt(List carList) { Map moveCnt = new HashMap<>(); for (String s : carList) { moveCnt.put(s, 0); @@ -40,11 +56,15 @@ private Map setMoveCnt(String[] carList) { } private void setRandomMove() { - for (int i = 0; i < carList.length; i++) { + for (int i = 0; i < carList.size(); i++) { int move = Randoms.pickNumberInRange(0, 9); - if (move >= 4) { - moveCnt.put(carList[i], moveCnt.get(carList[i]) + 1); - } + validateMove(move, i); + } + } + + private void validateMove(int move, int i) { + if (move >= 4) { + moveCnt.put(carList.get(i), moveCnt.get(carList.get(i)) + 1); } } diff --git a/src/main/java/view/ExceptionMessage.java b/src/main/java/view/ExceptionMessage.java new file mode 100644 index 0000000..342873e --- /dev/null +++ b/src/main/java/view/ExceptionMessage.java @@ -0,0 +1,15 @@ +package view; + +public class ExceptionMessage { + + // 1. 자동차 이름 5자 이상 + public static void isInvalidNameLength() { + System.out.println("[ERROR] 자동차의 이름은 1자 이상 5자 이하여야 한다."); + } + + // 2. 시도 횟수 음수 혹은 0 + public static void isInvalidTryCount() { + System.out.println("[ERROR] 시도 횟수는 양수여야 한다."); + } + +} diff --git a/src/main/java/view/InputView.java b/src/main/java/view/InputView.java index 7b78b70..cc365c8 100644 --- a/src/main/java/view/InputView.java +++ b/src/main/java/view/InputView.java @@ -2,16 +2,51 @@ import org.kokodak.Console; +import java.util.Arrays; +import java.util.List; + public class InputView { - public static String getCarNames() { + public static List getCarNames() { System.out.println("경주할 자동차 이름을 입력하세요(이름은 쉼표(,)를 기준으로 구분)."); - return Console.readLine(); + return splitCarNames(Console.readLine()); + } + + public static List splitCarNames(String carNames) { + List list; + list = Arrays.stream(carNames.split(",")) + .map(String::trim) + .toList(); + isValidCarName(list); + return list; + } + + private static void isValidCarName(List carList) { + for (String s : carList) { + isValidCarNameLength(s); + } + } + + private static void isValidCarNameLength(String carName) { + if (carName.length() < 1 || carName.length() > 5) { + ExceptionMessage.isInvalidNameLength(); + throw new IllegalArgumentException(); + } } public static int getTryCount() { System.out.println("시도할 회수는 몇회인가요?"); String str = Console.readLine(); - return Integer.parseInt(str); + int tryCount = Integer.parseInt(str); + isValidTryCount(tryCount); + return tryCount; } + + private static void isValidTryCount(int tryCount) { + if (tryCount < 1) { + ExceptionMessage.isInvalidTryCount(); + throw new IllegalArgumentException(); + } + } + } From f0f1f42ed7b4f2f7056bcbcbf28194d70e8211a2 Mon Sep 17 00:00:00 2001 From: tjdgus3488 Date: Tue, 26 Mar 2024 18:10:37 +0900 Subject: [PATCH 4/5] =?UTF-8?q?=EC=9E=90=EB=8F=99=EC=B0=A8=20=EC=9D=B4?= =?UTF-8?q?=EB=A6=84=20=EC=A4=91=EB=B3=B5=20=EC=B2=98=EB=A6=AC?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/main/java/domain/RacingGame.java | 24 ++---------------------- src/main/java/view/ExceptionMessage.java | 5 +++++ src/main/java/view/InputView.java | 14 ++++++++++++++ src/test/java/domain/RacingGameTest.java | 9 +++++++++ 4 files changed, 30 insertions(+), 22 deletions(-) create mode 100644 src/test/java/domain/RacingGameTest.java diff --git a/src/main/java/domain/RacingGame.java b/src/main/java/domain/RacingGame.java index ba8a02a..6b79931 100644 --- a/src/main/java/domain/RacingGame.java +++ b/src/main/java/domain/RacingGame.java @@ -17,15 +17,6 @@ public RacingGame(List carNames, int tryCount) { this.tryCount = tryCount; } - public List splitCarNames(String carNames) { - List list; - list = Arrays.stream(carNames.split(",")) - .map(String::trim) - .toList(); - isValidCarName(list); - return list; - } - public void race() { moveCnt = setMoveCnt(carList); for (int i = 0; i < tryCount; i++) { @@ -36,17 +27,6 @@ public void race() { } - private void isValidCarName(List carList) { - carList.forEach(this::isValidCarNameLength); - } - - private void isValidCarNameLength(String carName) { - if (carName.length() < 1 || carName.length() > 5) { - ExceptionMessage.isInvalidNameLength(); - throw new IllegalArgumentException(); - } - } - private Map setMoveCnt(List carList) { Map moveCnt = new HashMap<>(); for (String s : carList) { @@ -58,11 +38,11 @@ private Map setMoveCnt(List carList) { private void setRandomMove() { for (int i = 0; i < carList.size(); i++) { int move = Randoms.pickNumberInRange(0, 9); - validateMove(move, i); + canMove(move, i); } } - private void validateMove(int move, int i) { + private void canMove(int move, int i) { if (move >= 4) { moveCnt.put(carList.get(i), moveCnt.get(carList.get(i)) + 1); } diff --git a/src/main/java/view/ExceptionMessage.java b/src/main/java/view/ExceptionMessage.java index 342873e..45602a5 100644 --- a/src/main/java/view/ExceptionMessage.java +++ b/src/main/java/view/ExceptionMessage.java @@ -12,4 +12,9 @@ public static void isInvalidTryCount() { System.out.println("[ERROR] 시도 횟수는 양수여야 한다."); } + // 3. 자동차 이름 중복 확인 + public static void isDuplicateCarName() { + System.out.println("[ERROR] 자동차 이름은 중복되지 않아야 한다."); + } + } diff --git a/src/main/java/view/InputView.java b/src/main/java/view/InputView.java index cc365c8..3dd8a88 100644 --- a/src/main/java/view/InputView.java +++ b/src/main/java/view/InputView.java @@ -3,6 +3,7 @@ import org.kokodak.Console; import java.util.Arrays; +import java.util.HashSet; import java.util.List; public class InputView { @@ -18,6 +19,7 @@ public static List splitCarNames(String carNames) { .map(String::trim) .toList(); isValidCarName(list); + isDuplicateCarName(list); return list; } @@ -34,6 +36,18 @@ private static void isValidCarNameLength(String carName) { } } + private static void isDuplicateCarName(List carList) { + HashSet names = new HashSet<>(carList); + System.out.println("set size = " + names.size()); + System.out.println("list size = " + carList.size()); + System.out.println(); + if (names.size() != carList.size()) { + ExceptionMessage.isDuplicateCarName(); + throw new IllegalArgumentException(); + } + } + + public static int getTryCount() { System.out.println("시도할 회수는 몇회인가요?"); String str = Console.readLine(); diff --git a/src/test/java/domain/RacingGameTest.java b/src/test/java/domain/RacingGameTest.java new file mode 100644 index 0000000..8aa0540 --- /dev/null +++ b/src/test/java/domain/RacingGameTest.java @@ -0,0 +1,9 @@ +package domain; + +import static org.junit.jupiter.api.Assertions.*; + +class RacingGameTest { + + + +} \ No newline at end of file From ed5c65f5d21ca7559c2cf036e21a09bf1067002d Mon Sep 17 00:00:00 2001 From: tjdgus3488 Date: Tue, 26 Mar 2024 18:13:12 +0900 Subject: [PATCH 5/5] =?UTF-8?q?=EB=A6=AC=ED=8C=A8=ED=82=A4=EC=A7=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/main/java/view/InputValidate.java | 30 ++++++++++++++++ src/main/java/view/InputView.java | 51 ++++++++++++++------------- 2 files changed, 57 insertions(+), 24 deletions(-) create mode 100644 src/main/java/view/InputValidate.java diff --git a/src/main/java/view/InputValidate.java b/src/main/java/view/InputValidate.java new file mode 100644 index 0000000..bfc187d --- /dev/null +++ b/src/main/java/view/InputValidate.java @@ -0,0 +1,30 @@ +package view; + +import java.util.HashSet; +import java.util.List; + +public class InputValidate { + + + public static void isValidCarName(List carList) { + for (String s : carList) { + isValidCarNameLength(s); + } + } + + public static void isValidCarNameLength(String carName) { + if (carName.length() < 1 || carName.length() > 5) { + ExceptionMessage.isInvalidNameLength(); + throw new IllegalArgumentException(); + } + } + + public static void isDuplicateCarName(List carList) { + HashSet names = new HashSet<>(carList); + System.out.println(); + if (names.size() != carList.size()) { + ExceptionMessage.isDuplicateCarName(); + throw new IllegalArgumentException(); + } + } +} diff --git a/src/main/java/view/InputView.java b/src/main/java/view/InputView.java index 3dd8a88..5c4708d 100644 --- a/src/main/java/view/InputView.java +++ b/src/main/java/view/InputView.java @@ -6,6 +6,9 @@ import java.util.HashSet; import java.util.List; +import static view.InputValidate.isDuplicateCarName; +import static view.InputValidate.isValidCarName; + public class InputView { public static List getCarNames() { @@ -22,30 +25,30 @@ public static List splitCarNames(String carNames) { isDuplicateCarName(list); return list; } - - private static void isValidCarName(List carList) { - for (String s : carList) { - isValidCarNameLength(s); - } - } - - private static void isValidCarNameLength(String carName) { - if (carName.length() < 1 || carName.length() > 5) { - ExceptionMessage.isInvalidNameLength(); - throw new IllegalArgumentException(); - } - } - - private static void isDuplicateCarName(List carList) { - HashSet names = new HashSet<>(carList); - System.out.println("set size = " + names.size()); - System.out.println("list size = " + carList.size()); - System.out.println(); - if (names.size() != carList.size()) { - ExceptionMessage.isDuplicateCarName(); - throw new IllegalArgumentException(); - } - } +// +// private static void isValidCarName(List carList) { +// for (String s : carList) { +// isValidCarNameLength(s); +// } +// } +// +// private static void isValidCarNameLength(String carName) { +// if (carName.length() < 1 || carName.length() > 5) { +// ExceptionMessage.isInvalidNameLength(); +// throw new IllegalArgumentException(); +// } +// } +// +// private static void isDuplicateCarName(List carList) { +// HashSet names = new HashSet<>(carList); +// System.out.println("set size = " + names.size()); +// System.out.println("list size = " + carList.size()); +// System.out.println(); +// if (names.size() != carList.size()) { +// ExceptionMessage.isDuplicateCarName(); +// throw new IllegalArgumentException(); +// } +// } public static int getTryCount() {