From bb360d9c06e1c633748055aa739457d809629b5a Mon Sep 17 00:00:00 2001 From: son jeong han Date: Mon, 30 Mar 2026 17:41:43 +0900 Subject: [PATCH 01/10] =?UTF-8?q?=EA=B8=B0=EB=8A=A5=20=EB=AA=A9=EB=A1=9D?= =?UTF-8?q?=20=EC=A0=95=EB=A6=AC?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/main/java/racingcar/Application.java | 2 +- src/main/java/racingcar/Car.java | 5 +++++ src/main/java/racingcar/GameController.java | 5 +++++ src/main/java/racingcar/InputView.java | 5 +++++ src/main/java/racingcar/OutputView.java | 5 +++++ 5 files changed, 21 insertions(+), 1 deletion(-) create mode 100644 src/main/java/racingcar/Car.java create mode 100644 src/main/java/racingcar/GameController.java create mode 100644 src/main/java/racingcar/InputView.java create mode 100644 src/main/java/racingcar/OutputView.java diff --git a/src/main/java/racingcar/Application.java b/src/main/java/racingcar/Application.java index a17a52e..685c0fc 100644 --- a/src/main/java/racingcar/Application.java +++ b/src/main/java/racingcar/Application.java @@ -4,4 +4,4 @@ public class Application { public static void main(String[] args) { // TODO: 프로그램 구현 } -} +} \ No newline at end of file diff --git a/src/main/java/racingcar/Car.java b/src/main/java/racingcar/Car.java new file mode 100644 index 0000000..78b9a02 --- /dev/null +++ b/src/main/java/racingcar/Car.java @@ -0,0 +1,5 @@ +package racingcar; + +public class Car { + +} \ No newline at end of file diff --git a/src/main/java/racingcar/GameController.java b/src/main/java/racingcar/GameController.java new file mode 100644 index 0000000..8088727 --- /dev/null +++ b/src/main/java/racingcar/GameController.java @@ -0,0 +1,5 @@ +package racingcar; + +public class GameController { + +} \ No newline at end of file diff --git a/src/main/java/racingcar/InputView.java b/src/main/java/racingcar/InputView.java new file mode 100644 index 0000000..c6e854e --- /dev/null +++ b/src/main/java/racingcar/InputView.java @@ -0,0 +1,5 @@ +package racingcar; + +public class InputView { + +} \ No newline at end of file diff --git a/src/main/java/racingcar/OutputView.java b/src/main/java/racingcar/OutputView.java new file mode 100644 index 0000000..203579a --- /dev/null +++ b/src/main/java/racingcar/OutputView.java @@ -0,0 +1,5 @@ +package racingcar; + +public class OutputView { + +} \ No newline at end of file From 7a8d3344467bf347b06d7a49809a4e39f44d6f10 Mon Sep 17 00:00:00 2001 From: son jeong han Date: Mon, 30 Mar 2026 18:37:40 +0900 Subject: [PATCH 02/10] =?UTF-8?q?=EC=9E=90=EB=8F=99=EC=B0=A8=20=ED=81=B4?= =?UTF-8?q?=EB=9E=98=EC=8A=A4=20=EC=9E=91=EC=84=B1?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/main/java/racingcar/Car.java | 16 ++++++++++++++++ 1 file changed, 16 insertions(+) diff --git a/src/main/java/racingcar/Car.java b/src/main/java/racingcar/Car.java index 78b9a02..d1c8fef 100644 --- a/src/main/java/racingcar/Car.java +++ b/src/main/java/racingcar/Car.java @@ -1,5 +1,21 @@ package racingcar; public class Car { + String name; + int position = 0; + public Car(String name) { + this.name = name; + } + + public void move(int number) { + if (number >= 4) position++; + } + + public String getName() { + return name; + } + public int getPosition() { + return position; + } } \ No newline at end of file From abed3ea937adb800caa495e0e9b89c037f40386c Mon Sep 17 00:00:00 2001 From: son jeong han Date: Mon, 30 Mar 2026 18:46:16 +0900 Subject: [PATCH 03/10] =?UTF-8?q?=EC=9E=90=EB=8F=99=EC=B0=A8=20=EC=9D=B4?= =?UTF-8?q?=EB=A6=84=20=EC=9E=85=EB=A0=A5=20=EA=B8=B0=EB=8A=A5?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/main/java/racingcar/InputView.java | 9 ++++++++- 1 file changed, 8 insertions(+), 1 deletion(-) diff --git a/src/main/java/racingcar/InputView.java b/src/main/java/racingcar/InputView.java index c6e854e..a82666b 100644 --- a/src/main/java/racingcar/InputView.java +++ b/src/main/java/racingcar/InputView.java @@ -1,5 +1,12 @@ package racingcar; -public class InputView { +import camp.nextstep.edu.missionutils.Console; +public class InputView { + public String[] getCarNames() { + System.out.println("경주할 자동차 이름을 입력하세요.(이름은 쉼표(,) 기준으로 구분)"); + String input = Console.readLine(); + String[] names = input.split(","); + return names; + } } \ No newline at end of file From 4f0632ceee48a40c3df85ef4efcd67a5007c3a76 Mon Sep 17 00:00:00 2001 From: son jeong han Date: Mon, 30 Mar 2026 18:51:13 +0900 Subject: [PATCH 04/10] =?UTF-8?q?=EC=9E=85=EB=A0=A5=20=EC=8B=9C=20?= =?UTF-8?q?=EC=98=88=EC=99=B8=20=EC=BC=80=EC=9D=B4=EC=8A=A4=20=EC=B2=98?= =?UTF-8?q?=EB=A6=AC=EA=B8=B0=EB=8A=A5=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/InputView.java | 27 ++++++++++++++++++++++++++ 1 file changed, 27 insertions(+) diff --git a/src/main/java/racingcar/InputView.java b/src/main/java/racingcar/InputView.java index a82666b..b2d0d30 100644 --- a/src/main/java/racingcar/InputView.java +++ b/src/main/java/racingcar/InputView.java @@ -1,6 +1,8 @@ package racingcar; import camp.nextstep.edu.missionutils.Console; +import java.util.ArrayList; +import java.util.List; public class InputView { public String[] getCarNames() { @@ -9,4 +11,29 @@ public String[] getCarNames() { String[] names = input.split(","); return names; } + + private void validateCarNames(String[] names) { + List nameList = new ArrayList<>(); + + for (String name : names) { + // 공백이 들어있는지 확인 + if(name.contains(" ")) { + throw new IllegalArgumentException("자동차 이름에는 공백이 포함될 수 없습니다."); + } + String trimmedName = name.trim(); + if (trimmedName.isEmpty()) { + throw new IllegalArgumentException("자동차 이름은 빈 값일 수 없습니다."); + } + + if (trimmedName.length() > 5) { + throw new IllegalArgumentException("자동차 이름은 5자 이하만 가능합니다."); + } + + if (nameList.contains(name)) { + throw new IllegalArgumentException("중복된 이름이 있습니다."); + } + + nameList.add(name); + } + } } \ No newline at end of file From e416717e3617c2474166896cf2b1a3268ff4598c Mon Sep 17 00:00:00 2001 From: son jeong han Date: Mon, 30 Mar 2026 18:52:59 +0900 Subject: [PATCH 05/10] =?UTF-8?q?=EC=9E=85=EB=A0=A5=20=EC=8B=9C=20?= =?UTF-8?q?=EC=98=88=EC=99=B8=20=EC=BC=80=EC=9D=B4=EC=8A=A4=20=EC=B2=98?= =?UTF-8?q?=EB=A6=AC=EA=B8=B0=EB=8A=A5=20=EC=B6=94=EA=B0=80-1?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/main/java/racingcar/InputView.java | 1 + 1 file changed, 1 insertion(+) diff --git a/src/main/java/racingcar/InputView.java b/src/main/java/racingcar/InputView.java index b2d0d30..ee0f357 100644 --- a/src/main/java/racingcar/InputView.java +++ b/src/main/java/racingcar/InputView.java @@ -9,6 +9,7 @@ public String[] getCarNames() { System.out.println("경주할 자동차 이름을 입력하세요.(이름은 쉼표(,) 기준으로 구분)"); String input = Console.readLine(); String[] names = input.split(","); + validateCarNames(names); return names; } From 28000ac4ce29bba10d7208d672f9b8aa080f1cff Mon Sep 17 00:00:00 2001 From: son jeong han Date: Mon, 30 Mar 2026 18:55:53 +0900 Subject: [PATCH 06/10] =?UTF-8?q?=EC=B0=A8=EB=9F=89=20=EC=9D=B4=EB=8F=99?= =?UTF-8?q?=20=ED=9A=9F=EC=88=98=20=EC=9E=85=EB=A0=A5=20=EA=B8=B0=EB=8A=A5?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/main/java/racingcar/InputView.java | 22 +++++++++++++++++++--- 1 file changed, 19 insertions(+), 3 deletions(-) diff --git a/src/main/java/racingcar/InputView.java b/src/main/java/racingcar/InputView.java index ee0f357..9098ffb 100644 --- a/src/main/java/racingcar/InputView.java +++ b/src/main/java/racingcar/InputView.java @@ -13,6 +13,21 @@ public String[] getCarNames() { return names; } + public int getCount() { + System.out.println("시도할 회수는 몇회인가요?"); + String input = Console.readLine(); //처음부터 int로 받는 것보다 String으로 받고 int로 바꾸는게 더 정확함 + try { + int count = Integer.parseInt(input); + if (count <= 0) { + throw new IllegalArgumentException("시도 횟수는 0보다 커야 합니다."); + } + return count; + } catch (NumberFormatException e) { + throw new IllegalArgumentException("시도 횟수는 숫자여야 합니다."); + } + } + + private void validateCarNames(String[] names) { List nameList = new ArrayList<>(); @@ -21,20 +36,21 @@ private void validateCarNames(String[] names) { if(name.contains(" ")) { throw new IllegalArgumentException("자동차 이름에는 공백이 포함될 수 없습니다."); } + // 이름이 비어있는지 확인 String trimmedName = name.trim(); if (trimmedName.isEmpty()) { throw new IllegalArgumentException("자동차 이름은 빈 값일 수 없습니다."); } - + // 5자가 넘는지 확인 if (trimmedName.length() > 5) { throw new IllegalArgumentException("자동차 이름은 5자 이하만 가능합니다."); } - + // 이미 나온 이름인지 확인 (중복 체크) if (nameList.contains(name)) { throw new IllegalArgumentException("중복된 이름이 있습니다."); } - nameList.add(name); + nameList.add(name); // 검사를 통과한 이름은 리스트에 보관 } } } \ No newline at end of file From 97c1efe54f90ba32d60adc15c8217d7f1d1617d6 Mon Sep 17 00:00:00 2001 From: son jeong han Date: Mon, 30 Mar 2026 18:59:13 +0900 Subject: [PATCH 07/10] =?UTF-8?q?=EC=B0=A8=EB=9F=89=20=ED=81=B4=EB=9E=98?= =?UTF-8?q?=EC=8A=A4=20setter=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/Car.java | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/src/main/java/racingcar/Car.java b/src/main/java/racingcar/Car.java index d1c8fef..3bff98d 100644 --- a/src/main/java/racingcar/Car.java +++ b/src/main/java/racingcar/Car.java @@ -18,4 +18,12 @@ public String getName() { public int getPosition() { return position; } + + public String setName(String name) { + return this.name = name; + } + + public int setPosition(int position) { + return this.position = position; + } } \ No newline at end of file From de771c69e24872b2471a9381465e85b6ec67346d Mon Sep 17 00:00:00 2001 From: son jeong han Date: Mon, 30 Mar 2026 19:22:12 +0900 Subject: [PATCH 08/10] =?UTF-8?q?=EA=B2=8C=EC=9E=84=20=EB=A9=94=EC=9D=B8?= =?UTF-8?q?=EB=A1=9C=EC=A7=81=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/GameController.java | 29 +++++++++++++++++++++ src/main/java/racingcar/OutputView.java | 18 +++++++++++++ 2 files changed, 47 insertions(+) diff --git a/src/main/java/racingcar/GameController.java b/src/main/java/racingcar/GameController.java index 8088727..8996ab7 100644 --- a/src/main/java/racingcar/GameController.java +++ b/src/main/java/racingcar/GameController.java @@ -1,5 +1,34 @@ package racingcar; +import camp.nextstep.edu.missionutils.Randoms; +import java.util.ArrayList; +import java.util.List; + public class GameController { + private InputView inputView = new InputView(); + private OutputView outputView = new OutputView(); + private List cars = new ArrayList<>(); + + //게임 실행 메인 로직 + public void run() { + String[] carNames = inputView.getCarNames(); + for (String name : carNames) { + cars.add(new Car(name.trim())); + } + + int attemptCount = inputView.getCount(); + + outputView.printExecutionResultMessage(); + for (int i = 0; i < attemptCount; i++) { + playRound(); + outputView.printRaceStatus(cars); + } + } + private void playRound() { + for (Car car : cars) { + int randomNumber = Randoms.pickNumberInRange(0, 9); + car.move(randomNumber); + } + } } \ No newline at end of file diff --git a/src/main/java/racingcar/OutputView.java b/src/main/java/racingcar/OutputView.java index 203579a..8de013e 100644 --- a/src/main/java/racingcar/OutputView.java +++ b/src/main/java/racingcar/OutputView.java @@ -1,5 +1,23 @@ package racingcar; +import java.util.List; + public class OutputView { + public void printExecutionResultMessage() { + System.out.println("\n실행 결과"); + } + + public void printRaceStatus(List cars) { + for (Car car : cars) { + System.out.print(car.getName() + " : "); + + for (int i = 0; i < car.getPosition(); i++) { + System.out.print("-"); + } + + System.out.println(); + } + System.out.println(); + } } \ No newline at end of file From 18dc8df9389626ae6daa0c52fc80f2cdda868ad2 Mon Sep 17 00:00:00 2001 From: son jeong han Date: Mon, 30 Mar 2026 19:25:15 +0900 Subject: [PATCH 09/10] =?UTF-8?q?=EC=9A=B0=EC=8A=B9=EC=9E=90=20=EC=8B=9D?= =?UTF-8?q?=EB=B3=84=20=EB=B0=8F=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/racingcar/GameController.java | 23 ++++++++++++++++++++- src/main/java/racingcar/OutputView.java | 5 +++++ 2 files changed, 27 insertions(+), 1 deletion(-) diff --git a/src/main/java/racingcar/GameController.java b/src/main/java/racingcar/GameController.java index 8996ab7..d95ed4e 100644 --- a/src/main/java/racingcar/GameController.java +++ b/src/main/java/racingcar/GameController.java @@ -17,12 +17,15 @@ public void run() { } int attemptCount = inputView.getCount(); - outputView.printExecutionResultMessage(); + for (int i = 0; i < attemptCount; i++) { playRound(); outputView.printRaceStatus(cars); } + + List winners = findWinners(); + outputView.printFinalWinners(winners); } private void playRound() { @@ -31,4 +34,22 @@ private void playRound() { car.move(randomNumber); } } + + private List findWinners() { + // 가장 멀리 간 자동차의 위치 확인 + int maxPosition = 0; + for (Car car : cars) { + if (car.getPosition() > maxPosition) { + maxPosition = car.getPosition(); + } + } + //위에서 찾은 최고 기록과 똑같은 위치에 있는 자동차 이름을 다 모음. + List winners = new ArrayList<>(); + for (Car car : cars) { + if (car.getPosition() == maxPosition) { + winners.add(car.getName()); + } + } + return winners; + } } \ No newline at end of file diff --git a/src/main/java/racingcar/OutputView.java b/src/main/java/racingcar/OutputView.java index 8de013e..e59cc6d 100644 --- a/src/main/java/racingcar/OutputView.java +++ b/src/main/java/racingcar/OutputView.java @@ -20,4 +20,9 @@ public void printRaceStatus(List cars) { } System.out.println(); } + + public void printFinalWinners(List winners) { + String result = String.join(", ", winners); + System.out.println("최종 우승자 : " + result); + } } \ No newline at end of file From 028802e951783a086ed40dba10239cc9dca46fe9 Mon Sep 17 00:00:00 2001 From: son jeong han Date: Mon, 30 Mar 2026 19:25:56 +0900 Subject: [PATCH 10/10] =?UTF-8?q?=EC=B5=9C=EC=A2=85=20=EA=B2=B0=EA=B3=BC?= =?UTF-8?q?=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/racingcar/Application.java | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/src/main/java/racingcar/Application.java b/src/main/java/racingcar/Application.java index 685c0fc..bbba48d 100644 --- a/src/main/java/racingcar/Application.java +++ b/src/main/java/racingcar/Application.java @@ -2,6 +2,7 @@ public class Application { public static void main(String[] args) { - // TODO: 프로그램 구현 + GameController gameController = new GameController(); + gameController.run(); } } \ No newline at end of file