From 9de8d6bb24ae0ba3993173b3c51576fe46255e3c Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=EC=A1=B0=EC=9E=AC=EB=AF=BC?= Date: Thu, 18 Sep 2025 10:49:18 +0900 Subject: [PATCH 1/6] =?UTF-8?q?feat=20:=20=EC=9E=90=EB=8F=99=EC=B0=A8=20?= =?UTF-8?q?=EC=9D=B4=EB=A6=84,=20=ED=9A=9F=EC=88=98=20=EB=B0=9B=EC=95=84?= =?UTF-8?q?=20=EB=9D=BC=EC=9A=B4=EB=93=9C=20=EC=8B=A4=ED=96=89=20=EA=B8=B0?= =?UTF-8?q?=EB=8A=A5=20=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 | 38 +++++++++++++++++++++++- 1 file changed, 37 insertions(+), 1 deletion(-) diff --git a/src/main/java/racingcar/Application.java b/src/main/java/racingcar/Application.java index a17a52e7..ecf368a6 100644 --- a/src/main/java/racingcar/Application.java +++ b/src/main/java/racingcar/Application.java @@ -1,7 +1,43 @@ package racingcar; +import camp.nextstep.edu.missionutils.Console; +import camp.nextstep.edu.missionutils.Randoms; + public class Application { + public static void main(String[] args) { - // TODO: 프로그램 구현 + // 자동차 이름 입력 + System.out.println("경주할 자동차 이름을 입력하세요. (이름은 쉼표(,) 기준으로 구분)"); + String carString = Console.readLine(); + String[] carNames = carString.split(","); + + // 시도 횟수 입력 + System.out.println("시도할 횟수를 입력하세요."); + String input = Console.readLine(); + int rounds = Integer.parseInt(input); + + final int START_NUMBER = 0; + final int END_NUMBER = 9; + + // 자동차 전진 거리 저장 배열 + int[] positions = new int[carNames.length]; + + System.out.println("\n실행 결과"); + + // 라운드 수만큼 반복 + for (int i = 0; i < rounds; i++) { + for (int j = 0; j < carNames.length; j++) { + int randomNumber = Randoms.pickNumberInRange(START_NUMBER, END_NUMBER); + if (randomNumber >= 4) { + positions[j]++; + } + } + // 각 라운드 결과 출력 + for (int j = 0; j < carNames.length; j++) { + System.out.println(carNames[j] + " : " + "-".repeat(positions[j])); + } + System.out.println(); + } + System.out.println(); } } From 17abb1ce33849954b5497ccf128efc72e662a116 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=EC=A1=B0=EC=9E=AC=EB=AF=BC?= Date: Thu, 18 Sep 2025 12:23:51 +0900 Subject: [PATCH 2/6] =?UTF-8?q?feat=20:=20=EC=B5=9C=EC=A2=85=20=EC=9A=B0?= =?UTF-8?q?=EC=8A=B9=EC=9E=90=20=EC=B6=9C=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 | 26 +++++++++++++++++++++--- 1 file changed, 23 insertions(+), 3 deletions(-) diff --git a/src/main/java/racingcar/Application.java b/src/main/java/racingcar/Application.java index ecf368a6..baa369c9 100644 --- a/src/main/java/racingcar/Application.java +++ b/src/main/java/racingcar/Application.java @@ -3,8 +3,11 @@ import camp.nextstep.edu.missionutils.Console; import camp.nextstep.edu.missionutils.Randoms; -public class Application { +import java.util.ArrayList; +import java.util.List; +import java.util.Arrays; +public class Application { public static void main(String[] args) { // 자동차 이름 입력 System.out.println("경주할 자동차 이름을 입력하세요. (이름은 쉼표(,) 기준으로 구분)"); @@ -38,6 +41,23 @@ public static void main(String[] args) { } System.out.println(); } - System.out.println(); + + // 최종 우승자 + int maxPosition = 0; + for (int nowPosition : positions) { + if (nowPosition > maxPosition) { + maxPosition = nowPosition; + } + } + + List winners = new ArrayList<>(); + for (int i = 0; i < carNames.length; i++) { + if (positions[i] == maxPosition) { + winners.add(carNames[i]); + } + } + + String winnerString = String.join(", ", winners); + System.out.println("최종 우승자 : " + winnerString); } -} +} \ No newline at end of file From 0fe7eac01e3173096e328ab6d9c76ce3b69e5bc5 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=EC=A1=B0=EC=9E=AC=EB=AF=BC?= Date: Thu, 18 Sep 2025 12:37:05 +0900 Subject: [PATCH 3/6] =?UTF-8?q?feat=20:=20=EC=98=88=EC=99=B8=EC=B2=98?= =?UTF-8?q?=EB=A6=AC=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 | 26 +++++++++++++++++++----- 1 file changed, 21 insertions(+), 5 deletions(-) diff --git a/src/main/java/racingcar/Application.java b/src/main/java/racingcar/Application.java index baa369c9..d528eb4c 100644 --- a/src/main/java/racingcar/Application.java +++ b/src/main/java/racingcar/Application.java @@ -5,22 +5,38 @@ import java.util.ArrayList; import java.util.List; -import java.util.Arrays; public class Application { public static void main(String[] args) { + // 자동차 이름 입력 System.out.println("경주할 자동차 이름을 입력하세요. (이름은 쉼표(,) 기준으로 구분)"); String carString = Console.readLine(); String[] carNames = carString.split(","); + final int START_NUMBER = 0; + final int END_NUMBER = 9; + final int MOVE_NUMBER = 4; + final int MAX_NAME = 5; + + // 이름 예외 처리 + for (String carName : carNames) { + if (carName.length() > MAX_NAME) { + throw new IllegalArgumentException("[ERROR] 이름은 5자 이하만 가능합니다."); + } + } + // 시도 횟수 입력 System.out.println("시도할 횟수를 입력하세요."); String input = Console.readLine(); - int rounds = Integer.parseInt(input); + int rounds = 0; - final int START_NUMBER = 0; - final int END_NUMBER = 9; + // 숫자 확인 예외 처리 + try { + rounds = Integer.parseInt(input); + } catch (NumberFormatException e) { + throw new IllegalArgumentException("시도 횟수는 숫자여야 합니다."); + } // 자동차 전진 거리 저장 배열 int[] positions = new int[carNames.length]; @@ -31,7 +47,7 @@ public static void main(String[] args) { for (int i = 0; i < rounds; i++) { for (int j = 0; j < carNames.length; j++) { int randomNumber = Randoms.pickNumberInRange(START_NUMBER, END_NUMBER); - if (randomNumber >= 4) { + if (randomNumber >= MOVE_NUMBER) { positions[j]++; } } From cb140446863ffb5e45f449aa3326239557efe350 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=EC=A1=B0=EC=9E=AC=EB=AF=BC?= Date: Thu, 18 Sep 2025 13:05:58 +0900 Subject: [PATCH 4/6] =?UTF-8?q?feat=20:=20Car,=20Racing=20=ED=81=B4?= =?UTF-8?q?=EB=9E=98=EC=8A=A4=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 | 75 ++---------------------- src/main/java/racingcar/Car.java | 35 +++++++++++ src/main/java/racingcar/Racing.java | 68 +++++++++++++++++++++ 3 files changed, 108 insertions(+), 70 deletions(-) create mode 100644 src/main/java/racingcar/Car.java create mode 100644 src/main/java/racingcar/Racing.java diff --git a/src/main/java/racingcar/Application.java b/src/main/java/racingcar/Application.java index d528eb4c..e7b2e5f7 100644 --- a/src/main/java/racingcar/Application.java +++ b/src/main/java/racingcar/Application.java @@ -1,79 +1,14 @@ package racingcar; -import camp.nextstep.edu.missionutils.Console; -import camp.nextstep.edu.missionutils.Randoms; - -import java.util.ArrayList; -import java.util.List; - public class Application { public static void main(String[] args) { - // 자동차 이름 입력 - System.out.println("경주할 자동차 이름을 입력하세요. (이름은 쉼표(,) 기준으로 구분)"); - String carString = Console.readLine(); - String[] carNames = carString.split(","); - - final int START_NUMBER = 0; - final int END_NUMBER = 9; - final int MOVE_NUMBER = 4; - final int MAX_NAME = 5; - - // 이름 예외 처리 - for (String carName : carNames) { - if (carName.length() > MAX_NAME) { - throw new IllegalArgumentException("[ERROR] 이름은 5자 이하만 가능합니다."); - } - } - - // 시도 횟수 입력 - System.out.println("시도할 횟수를 입력하세요."); - String input = Console.readLine(); - int rounds = 0; - - // 숫자 확인 예외 처리 - try { - rounds = Integer.parseInt(input); - } catch (NumberFormatException e) { - throw new IllegalArgumentException("시도 횟수는 숫자여야 합니다."); - } - - // 자동차 전진 거리 저장 배열 - int[] positions = new int[carNames.length]; - - System.out.println("\n실행 결과"); - - // 라운드 수만큼 반복 - for (int i = 0; i < rounds; i++) { - for (int j = 0; j < carNames.length; j++) { - int randomNumber = Randoms.pickNumberInRange(START_NUMBER, END_NUMBER); - if (randomNumber >= MOVE_NUMBER) { - positions[j]++; - } - } - // 각 라운드 결과 출력 - for (int j = 0; j < carNames.length; j++) { - System.out.println(carNames[j] + " : " + "-".repeat(positions[j])); - } - System.out.println(); - } - - // 최종 우승자 - int maxPosition = 0; - for (int nowPosition : positions) { - if (nowPosition > maxPosition) { - maxPosition = nowPosition; - } - } + Car car = new Car(); + String[] carNames = car.getCarNames(); + int rounds = car.getRounds(); - List winners = new ArrayList<>(); - for (int i = 0; i < carNames.length; i++) { - if (positions[i] == maxPosition) { - winners.add(carNames[i]); - } - } + Racing racing = new Racing(carNames, rounds); + racing.startRace(); - String winnerString = String.join(", ", winners); - System.out.println("최종 우승자 : " + winnerString); } } \ 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 00000000..ccd806df --- /dev/null +++ b/src/main/java/racingcar/Car.java @@ -0,0 +1,35 @@ +package racingcar; +import camp.nextstep.edu.missionutils.Console; + +public class Car { + private final int MAX_NAME = 5; + + public String[] getCarNames() { + // 이름 입력 + System.out.println("경주할 자동차 이름을 입력하세요. (이름은 쉼표(,) 기준으로 구분)"); + String carString = Console.readLine(); + String[] carNames = carString.split(","); + + // 이름 예외 처리 + for (String carName : carNames) { + if (carName.length() > MAX_NAME) { + throw new IllegalArgumentException("[ERROR] 이름은 5자 이하만 가능합니다."); + } + } + return carNames; + } + + public int getRounds() { + // 시도 횟수 입력 + System.out.println("시도할 횟수를 입력하세요."); + String input = Console.readLine(); + + // 시도 횟수 예외 처리 + try { + int rounds = Integer.parseInt(input); + return rounds; + } catch (NumberFormatException e) { + throw new IllegalArgumentException("[ERROR] 시도 횟수는 숫자여야 합니다."); + } + } +} \ No newline at end of file diff --git a/src/main/java/racingcar/Racing.java b/src/main/java/racingcar/Racing.java new file mode 100644 index 00000000..8d352ef6 --- /dev/null +++ b/src/main/java/racingcar/Racing.java @@ -0,0 +1,68 @@ +package racingcar; +import camp.nextstep.edu.missionutils.Randoms; +import java.util.ArrayList; +import java.util.List; + +public class Racing { + private final String[] carNames; + private final int rounds; + private final int[] positions; + + public Racing(String[] carNames, int rounds) { + this.carNames = carNames; + this.rounds = rounds; + this.positions = new int[carNames.length]; + } + + // 레이스 시작 + public void startRace() { + System.out.println("\n실행 결과"); + for (int i = 0; i < rounds; i++) { + playRound(); + printResult(); + } + printWinners(); + } + + // 레이스 진행 + private void playRound() { + final int MOVE_NUMBER = 4; + final int START_NUMBER = 0; + final int END_NUMBER = 9; + + for (int i = 0; i < carNames.length; i++) { + int randomNumber = Randoms.pickNumberInRange(START_NUMBER, END_NUMBER); + if (randomNumber >= MOVE_NUMBER) { + positions[i]++; + } + } + } + + // 결과 출력 + private void printResult() { + for (int i = 0; i < carNames.length; i++) { + System.out.println(carNames[i] + " : " + "-".repeat(positions[i])); + } + System.out.println(); + } + + // 최종 승리자 + private void printWinners() { + int maxPosition = 0; + for (int nowPosition : positions) { + if (nowPosition > maxPosition) { + maxPosition = nowPosition; + } + } + + List winners = new ArrayList<>(); + for (int i = 0; i < carNames.length; i++) { + if (positions[i] == maxPosition) { + winners.add(carNames[i]); + } + } + + String winnerString = String.join(", ", winners); + System.out.println("최종 우승자 : " + winnerString); + } +} \ No newline at end of file From adcb3c67d2447b47440eac8990c1deca326ccff4 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=EC=A1=B0=EC=9E=AC=EB=AF=BC?= Date: Fri, 26 Sep 2025 20:29:25 +0900 Subject: [PATCH 5/6] =?UTF-8?q?refactor=20:=20Car=20=ED=81=B4=EB=9E=98?= =?UTF-8?q?=EC=8A=A4=20=EB=82=B4=20=ED=95=A8=EC=88=98=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 | 17 ++++++++++++----- 1 file changed, 12 insertions(+), 5 deletions(-) diff --git a/src/main/java/racingcar/Car.java b/src/main/java/racingcar/Car.java index ccd806df..52ce377b 100644 --- a/src/main/java/racingcar/Car.java +++ b/src/main/java/racingcar/Car.java @@ -3,20 +3,27 @@ public class Car { private final int MAX_NAME = 5; - + public String[] getCarNames() { - // 이름 입력 + String[] carNames = readCarNames(); + validCarNames(carNames); + return carNames; + } + + // 자동차 이름 입력 + private String[] readCarNames() { System.out.println("경주할 자동차 이름을 입력하세요. (이름은 쉼표(,) 기준으로 구분)"); String carString = Console.readLine(); - String[] carNames = carString.split(","); + return carString.split(","); + } - // 이름 예외 처리 + // 이름 예외 처리 + private void validCarNames(String[] carNames) { for (String carName : carNames) { if (carName.length() > MAX_NAME) { throw new IllegalArgumentException("[ERROR] 이름은 5자 이하만 가능합니다."); } } - return carNames; } public int getRounds() { From 69172ecf057eb753e36eb1c04bb6ebdd70f433e9 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=EC=A1=B0=EC=9E=AC=EB=AF=BC?= Date: Fri, 26 Sep 2025 20:41:12 +0900 Subject: [PATCH 6/6] =?UTF-8?q?refactor=20:=20Racing=20=ED=81=B4=EB=9E=98?= =?UTF-8?q?=EC=8A=A4=20=EB=82=B4=20=ED=95=A8=EC=88=98=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/Racing.java | 45 ++++++++++++++++++++--------- 1 file changed, 31 insertions(+), 14 deletions(-) diff --git a/src/main/java/racingcar/Racing.java b/src/main/java/racingcar/Racing.java index 8d352ef6..3f0dbfb2 100644 --- a/src/main/java/racingcar/Racing.java +++ b/src/main/java/racingcar/Racing.java @@ -24,18 +24,27 @@ public void startRace() { printWinners(); } - // 레이스 진행 + // 한 라운드 실행 private void playRound() { + for (int i = 0; i < carNames.length; i++) { + moveCar(i); + } + } + + // 이동 여부 확인 + private void moveCar(int carIndex) { + if (shouldMove()) { + positions[carIndex]++; + } + } + + // 이동 여부 결정 + private boolean shouldMove() { final int MOVE_NUMBER = 4; final int START_NUMBER = 0; final int END_NUMBER = 9; - - for (int i = 0; i < carNames.length; i++) { - int randomNumber = Randoms.pickNumberInRange(START_NUMBER, END_NUMBER); - if (randomNumber >= MOVE_NUMBER) { - positions[i]++; - } - } + int randomNumber = Randoms.pickNumberInRange(START_NUMBER, END_NUMBER); + return randomNumber >= MOVE_NUMBER; } // 결과 출력 @@ -50,19 +59,27 @@ private void printResult() { private void printWinners() { int maxPosition = 0; for (int nowPosition : positions) { - if (nowPosition > maxPosition) { - maxPosition = nowPosition; - } + maxPosition = getMax(maxPosition, nowPosition); } List winners = new ArrayList<>(); for (int i = 0; i < carNames.length; i++) { - if (positions[i] == maxPosition) { - winners.add(carNames[i]); - } + addWinner(winners, carNames[i], positions[i], maxPosition); } String winnerString = String.join(", ", winners); System.out.println("최종 우승자 : " + winnerString); } + + // 최대값 비교 + private int getMax(int currentMax, int nowPosition) { + return nowPosition > currentMax ? nowPosition : currentMax; + } + + //우승자 추가 + private void addWinner(List winners, String carName, int position, int maxPosition) { + if (position == maxPosition) { + winners.add(carName); + } + } } \ No newline at end of file