From 6b2c57a7e7b320148fded8e1727f90730bb7bd2c Mon Sep 17 00:00:00 2001 From: seyeonsim Date: Mon, 28 Oct 2024 20:39:17 +0900 Subject: [PATCH 01/10] docs: update README.md --- README.md | 83 +++++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 83 insertions(+) diff --git a/README.md b/README.md index d0286c859f..d37415cb8e 100644 --- a/README.md +++ b/README.md @@ -1 +1,84 @@ # java-racingcar-precourse + +## 자동차 경주 + +초간단 자동차 경주 게임을 구현한다. + +* 주어진 횟수 동안 n대의 자동차는 전진 또는 멈출 수 있다. +* 각 자동차에 이름을 부여할 수 있다. 전진하는 자동차를 출력할 때 자동차 이름을 같이 출력한다. +* 자동차 이름은 쉼표(,)를 기준으로 구분하며 이름은 5자 이하만 가능하다. +* 사용자는 몇 번의 이동을 할 것인지를 입력할 수 있어야 한다. +* 전진하는 조건은 0에서 9 사이에서 무작위 값을 구한 후 무작위 값이 4 이상일 경우이다. +* 자동차 경주 게임을 완료한 후 누가 우승했는지를 알려준다. 우승자는 한 명 이상일 수 있다. +* 우승자가 여러 명일 경우 쉼표(,)를 이용하여 구분한다. +* 사용자가 잘못된 값을 입력할 경우 IllegalArgumentException을 발생시킨 후 애플리케이션은 종료되어야 한다. + +* camp.nextstep.edu.missionutils에서 제공하는 Randoms 및 Console API를 사용하여 구현해야 한다. + * Random 값 추출은 camp.nextstep.edu.missionutils.Randoms의 pickNumberInRange()를 활용한다. + * 사용자가 입력하는 값은 camp.nextstep.edu.missionutils.Console의 readLine()을 활용한다. + + **사용 예시** + ``` + 0에서 9까지의 정수 중 한 개의 정수 반환 + Randoms.pickNumberInRange(0, 9); + ``` + + + +### 입출력 요구 사항 + +**입력** + +* 경주할 자동차 이름(이름은 쉼표(,) 기준으로 구분) +``` +pobi,woni,jun +``` + +* 시도할 횟수 +``` +5 +``` + +**출력** + +* 차수별 실행 결과 +``` +pobi : -- +woni : ---- +jun : --- +``` + +* 단독 우승자 안내 문구 +``` +최종 우승자 : pobi +``` + +* 공동 우승자 안내 문구 +``` +최종 우승자 : pobi, jun +``` + +* 실행 결과 예시 +``` +경주할 자동차 이름을 입력하세요.(이름은 쉼표(,) 기준으로 구분) +pobi,woni,jun +시도할 횟수는 몇 회인가요? +5 +실행 결과 +pobi : - +woni : +jun : - +pobi : -- +woni : - +jun : -- +pobi : --- +woni : -- +jun : --- +pobi : ---- +woni : --- +jun : ---- +pobi : ----- +woni : ---- +jun : ----- +최종 우승자 : pobi, jun +``` \ No newline at end of file From 3510757706a66eef3f029685870a97a5423bc662 Mon Sep 17 00:00:00 2001 From: seyeonsim Date: Mon, 28 Oct 2024 21:18:37 +0900 Subject: [PATCH 02/10] =?UTF-8?q?feat:=20=EC=9E=90=EB=8F=99=EC=B0=A8=20?= =?UTF-8?q?=EC=9D=B4=EB=A6=84=20=EC=9E=85=EB=A0=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 | 30 +++++++++++++++++++++++- 1 file changed, 29 insertions(+), 1 deletion(-) diff --git a/src/main/java/racingcar/Application.java b/src/main/java/racingcar/Application.java index a17a52e724..9b4a795d3b 100644 --- a/src/main/java/racingcar/Application.java +++ b/src/main/java/racingcar/Application.java @@ -1,7 +1,35 @@ package racingcar; +import camp.nextstep.edu.missionutils.Console; +import java.util.ArrayList; +import java.util.List; + public class Application { public static void main(String[] args) { - // TODO: 프로그램 구현 + // 자동차 이름 입력 + List carNames = getCarNames(); + } + + // 자동차 이름 입력 + // 입력 값 검사 + private static void validateCarNames(String input) { + if (!input.matches("(\\b\\w{1,5}\\b)(,\\b\\w{1,5}\\b)*")) { + throw new IllegalArgumentException("잘못된 입력입니다."); + } } + + private static List getCarNames() { + System.out.println("경주할 자동차 이름을 입력하세요.(이름은 쉼표(,) 기준으로 구분)"); + + String input = Console.readLine(); + + // 정규 표현식 검사 + validateCarNames(input); // 검사 메서드 호출 + + String[] nameArray = input.split(","); + return new ArrayList<>(List.of(nameArray)); // 배열을 리스트로 변환 + } + + + } From f14b1e608bfa2114b183f296d343750caf4abd9e Mon Sep 17 00:00:00 2001 From: seyeonsim Date: Mon, 28 Oct 2024 21:31:08 +0900 Subject: [PATCH 03/10] =?UTF-8?q?feat:=20=EC=8B=9C=EB=8F=84=20=ED=9A=9F?= =?UTF-8?q?=EC=88=98=20=EC=9E=85=EB=A0=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 | 18 +++++++++++++++++- 1 file changed, 17 insertions(+), 1 deletion(-) diff --git a/src/main/java/racingcar/Application.java b/src/main/java/racingcar/Application.java index 9b4a795d3b..3a861da63e 100644 --- a/src/main/java/racingcar/Application.java +++ b/src/main/java/racingcar/Application.java @@ -8,6 +8,9 @@ public class Application { public static void main(String[] args) { // 자동차 이름 입력 List carNames = getCarNames(); + // 시도 횟수 입력 + int attempts = getAttempts(); + } // 자동차 이름 입력 @@ -31,5 +34,18 @@ private static List getCarNames() { } - + // 시도 횟수 입력 + private static int getAttempts() { + System.out.println("시도할 횟수는 몇 회인가요?"); + String input = Console.readLine(); + try { + int attempts = Integer.parseInt(input); + if (attempts <= 0) { + throw new IllegalArgumentException("횟수는 1 이상의 정수여야 합니다."); + } + return attempts; + } catch (NumberFormatException e) { + throw new IllegalArgumentException("잘못된 입력입니다. 숫자를 입력해주세요."); + } + } } From f3b20d4f9596e8cf6bf6c37f1a2834bcdf1b8ec5 Mon Sep 17 00:00:00 2001 From: seyeonsim Date: Mon, 28 Oct 2024 21:47:30 +0900 Subject: [PATCH 04/10] =?UTF-8?q?feat:=20=EC=9E=85=EB=A0=A5=20=EA=B0=92=20?= =?UTF-8?q?=EA=B8=B0=EC=A4=80=EC=9C=BC=EB=A1=9C=20=EA=B2=8C=EC=9E=84=20?= =?UTF-8?q?=EC=B4=88=EA=B8=B0=20=EC=84=B8=ED=8C=85=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 | 16 ++++++++++++++++ 1 file changed, 16 insertions(+) diff --git a/src/main/java/racingcar/Application.java b/src/main/java/racingcar/Application.java index 3a861da63e..573bfa21ac 100644 --- a/src/main/java/racingcar/Application.java +++ b/src/main/java/racingcar/Application.java @@ -1,8 +1,11 @@ package racingcar; import camp.nextstep.edu.missionutils.Console; +import camp.nextstep.edu.missionutils.Randoms; import java.util.ArrayList; +import java.util.HashMap; import java.util.List; +import java.util.Map; public class Application { public static void main(String[] args) { @@ -10,6 +13,8 @@ public static void main(String[] args) { List carNames = getCarNames(); // 시도 횟수 입력 int attempts = getAttempts(); + // 입력 값 기준으로 게임 초기 세팅 + Map carPositions = initializeCarPositions(carNames); } @@ -48,4 +53,15 @@ private static int getAttempts() { throw new IllegalArgumentException("잘못된 입력입니다. 숫자를 입력해주세요."); } } + + + // 입력 값 기준으로 게임 초기 세팅 + private static Map initializeCarPositions(List names) { + Map carPositions = new HashMap<>(); + for (String name : names) { + carPositions.put(name, 0); + } + return carPositions; + } + } From fecc4cf64c611269996e70b19af41eb46630dab7 Mon Sep 17 00:00:00 2001 From: seyeonsim Date: Mon, 28 Oct 2024 23:00:21 +0900 Subject: [PATCH 05/10] =?UTF-8?q?=EA=B2=BD=EC=A3=BC=20=EA=B2=8C=EC=9E=84?= =?UTF-8?q?=20=EC=8B=9C=EC=9E=91=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 | 32 ++++++++++++++++++++++++ 1 file changed, 32 insertions(+) diff --git a/src/main/java/racingcar/Application.java b/src/main/java/racingcar/Application.java index 573bfa21ac..66e8016c96 100644 --- a/src/main/java/racingcar/Application.java +++ b/src/main/java/racingcar/Application.java @@ -16,6 +16,9 @@ public static void main(String[] args) { // 입력 값 기준으로 게임 초기 세팅 Map carPositions = initializeCarPositions(carNames); + // 경주 게임 시작 + runRace(carNames, carPositions, attempts); + } // 자동차 이름 입력 @@ -64,4 +67,33 @@ private static Map initializeCarPositions(List names) { return carPositions; } + + // 경주 게임 시작 + private static void runRace(List names, Map carPositions, int attempts) { + for (int i = 0; i < attempts; i++) { + // 각 자동차에 대해 이동 여부 결정 + for (String name : names) { + int picked = Randoms.pickNumberInRange(0, 9); + if (picked >= 4) { + // 이동 거리를 1 증가 + carPositions.put(name, carPositions.get(name) + 1); + } + } + + // 차수별 실행 결과 출력 + printPositions(names, carPositions); + } + } + + // 차수별 실행 결과 출력 + private static void printPositions(List names, Map carPositions) { + for (String name : names) { + int position = carPositions.get(name); + System.out.print(name + " : "); + System.out.println("-".repeat(position)); + } + System.out.println(); + } + + } From 06b7167dca9a42c40436acd59ac8e7b125a63ea3 Mon Sep 17 00:00:00 2001 From: seyeonsim Date: Mon, 28 Oct 2024 23:05:21 +0900 Subject: [PATCH 06/10] =?UTF-8?q?=EC=9A=B0=EC=8A=B9=EC=9E=90=20=EC=95=88?= =?UTF-8?q?=EB=82=B4=20=EB=AC=B8=EA=B5=AC=20=EC=B6=9C=EB=A0=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/Application.java | 14 ++++++++++++++ 1 file changed, 14 insertions(+) diff --git a/src/main/java/racingcar/Application.java b/src/main/java/racingcar/Application.java index 66e8016c96..942ce3deac 100644 --- a/src/main/java/racingcar/Application.java +++ b/src/main/java/racingcar/Application.java @@ -18,6 +18,8 @@ public static void main(String[] args) { // 경주 게임 시작 runRace(carNames, carPositions, attempts); + // 우승자 안내 문구 출력 + announceWinners(carNames, carPositions); } @@ -96,4 +98,16 @@ private static void printPositions(List names, Map carP } + // 우승자 안내 문구 출력 + private static void announceWinners(List names, Map carPositions) { + int maxPosition = carPositions.values().stream().max(Integer::compare).orElse(0); + StringBuilder winners = new StringBuilder(); + for (String name : names) { + if (carPositions.get(name) == maxPosition) { + winners.append(name).append(", "); + } + } + + System.out.println("최종 우승자 : " + winners.substring(0, winners.length() - 2)); + } } From f5666295093110334e01c007d059d32b8ca58c35 Mon Sep 17 00:00:00 2001 From: seyeonsim Date: Mon, 28 Oct 2024 23:21:48 +0900 Subject: [PATCH 07/10] =?UTF-8?q?refactor:=20getAttemps=20=EB=A9=94?= =?UTF-8?q?=EC=84=9C=EB=93=9C=EC=9D=98=20=EC=9E=85=EB=A0=A5=EA=B3=BC=20?= =?UTF-8?q?=EA=B2=80=EC=A6=9D=20=EB=A1=9C=EC=A7=81=20=EB=B6=84=EB=A6=AC?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/main/java/racingcar/Application.java | 11 ++++++----- 1 file changed, 6 insertions(+), 5 deletions(-) diff --git a/src/main/java/racingcar/Application.java b/src/main/java/racingcar/Application.java index 942ce3deac..1f267848c7 100644 --- a/src/main/java/racingcar/Application.java +++ b/src/main/java/racingcar/Application.java @@ -48,18 +48,19 @@ private static List getCarNames() { private static int getAttempts() { System.out.println("시도할 횟수는 몇 회인가요?"); String input = Console.readLine(); + return validateAttempts(input); + } + + private static int validateAttempts(String input) { try { int attempts = Integer.parseInt(input); - if (attempts <= 0) { - throw new IllegalArgumentException("횟수는 1 이상의 정수여야 합니다."); - } + if(attempts <= 0) throw new IllegalArgumentException("시도 횟수는 1 이상의 정수여야 합니다."); return attempts; } catch (NumberFormatException e) { - throw new IllegalArgumentException("잘못된 입력입니다. 숫자를 입력해주세요."); + throw new IllegalArgumentException("잘못된 입력입니다."); } } - // 입력 값 기준으로 게임 초기 세팅 private static Map initializeCarPositions(List names) { Map carPositions = new HashMap<>(); From 56d8e265b5d6eab5cd7833024a0630b5085089ed Mon Sep 17 00:00:00 2001 From: seyeonsim Date: Mon, 28 Oct 2024 23:26:42 +0900 Subject: [PATCH 08/10] =?UTF-8?q?refactor:=20main=20=EB=A9=94=EC=84=9C?= =?UTF-8?q?=EB=93=9C=EC=97=90=20try-catch=20=EC=B6=94=EA=B0=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/main/java/racingcar/Application.java | 32 +++++++++++++++--------- 1 file changed, 20 insertions(+), 12 deletions(-) diff --git a/src/main/java/racingcar/Application.java b/src/main/java/racingcar/Application.java index 1f267848c7..ce4a7c112a 100644 --- a/src/main/java/racingcar/Application.java +++ b/src/main/java/racingcar/Application.java @@ -9,17 +9,23 @@ public class Application { public static void main(String[] args) { - // 자동차 이름 입력 - List carNames = getCarNames(); - // 시도 횟수 입력 - int attempts = getAttempts(); - // 입력 값 기준으로 게임 초기 세팅 - Map carPositions = initializeCarPositions(carNames); - - // 경주 게임 시작 - runRace(carNames, carPositions, attempts); - // 우승자 안내 문구 출력 - announceWinners(carNames, carPositions); + try { + // 자동차 이름 입력 + List carNames = getCarNames(); + // 시도 횟수 입력 + int attempts = getAttempts(); + // 입력 값 기준으로 게임 초기 세팅 + Map carPositions = initializeCarPositions(carNames); + + // 경주 게임 시작 + runRace(carNames, carPositions, attempts); + // 우승자 안내 문구 출력 + announceWinners(carNames, carPositions); + + } catch (IllegalArgumentException e) { + System.out.println(e.getMessage()); + } + } @@ -54,7 +60,9 @@ private static int getAttempts() { private static int validateAttempts(String input) { try { int attempts = Integer.parseInt(input); - if(attempts <= 0) throw new IllegalArgumentException("시도 횟수는 1 이상의 정수여야 합니다."); + if (attempts <= 0) { + throw new IllegalArgumentException("시도 횟수는 1 이상의 정수여야 합니다."); + } return attempts; } catch (NumberFormatException e) { throw new IllegalArgumentException("잘못된 입력입니다."); From e3d464826ebbcbf4c26978bc09a96889de9eaf17 Mon Sep 17 00:00:00 2001 From: seyeonsim Date: Mon, 28 Oct 2024 23:32:12 +0900 Subject: [PATCH 09/10] =?UTF-8?q?feat:=20=EC=9E=90=EB=8F=99=EC=B0=A8=20?= =?UTF-8?q?=EC=9D=B4=EB=A6=84=20=EC=9E=85=EB=A0=A5=20=EA=B2=80=EC=A6=9D=20?= =?UTF-8?q?=EC=A0=95=EA=B7=9C=ED=91=9C=ED=98=84=EC=8B=9D=20=EA=B0=9C?= =?UTF-8?q?=EC=84=A0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/main/java/racingcar/Application.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/main/java/racingcar/Application.java b/src/main/java/racingcar/Application.java index ce4a7c112a..97d0bb02aa 100644 --- a/src/main/java/racingcar/Application.java +++ b/src/main/java/racingcar/Application.java @@ -32,7 +32,7 @@ public static void main(String[] args) { // 자동차 이름 입력 // 입력 값 검사 private static void validateCarNames(String input) { - if (!input.matches("(\\b\\w{1,5}\\b)(,\\b\\w{1,5}\\b)*")) { + if (!input.matches("([가-힣\\w-_.]{1,5})(,[가-힣\\w-_.]{1,5})*")) { throw new IllegalArgumentException("잘못된 입력입니다."); } } From 85c034b7fbce7b95f4a023bf4d31b47a8f16ac46 Mon Sep 17 00:00:00 2001 From: seyeonsim Date: Mon, 28 Oct 2024 23:54:41 +0900 Subject: [PATCH 10/10] =?UTF-8?q?test:=20=EC=9E=90=EB=8F=99=EC=B0=A8=20?= =?UTF-8?q?=EC=9D=B4=EB=A6=84=20=EA=B8=B8=EC=9D=B4=20=EC=B4=88=EA=B3=BC=20?= =?UTF-8?q?=EC=98=88=EC=99=B8=20=ED=85=8C=EC=8A=A4=ED=8A=B8=20=EC=B6=94?= =?UTF-8?q?=EA=B0=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/test/java/racingcar/ApplicationTest.java | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/src/test/java/racingcar/ApplicationTest.java b/src/test/java/racingcar/ApplicationTest.java index 1d35fc33fe..875423f605 100644 --- a/src/test/java/racingcar/ApplicationTest.java +++ b/src/test/java/racingcar/ApplicationTest.java @@ -31,6 +31,13 @@ class ApplicationTest extends NsTest { ); } + @Test + void 자동차_이름_길이_초과_예외_테스트() { + assertSimpleTest(() -> + assertThatThrownBy(() -> runException("pobi,javajii", "1")) + .isInstanceOf(IllegalArgumentException.class) + ); + } @Override public void runMain() { Application.main(new String[]{});