From 92d27bbc8ba14ab7368feb275b7efc9943920589 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=EC=9C=A4=ED=95=B4=EC=9D=B8?= Date: Mon, 22 Sep 2025 12:09:42 +0900 Subject: [PATCH 1/7] =?UTF-8?q?feat:=201.=20=EC=9D=B4=EB=A6=84=20=EC=9E=85?= =?UTF-8?q?=EB=A0=A5=EB=B0=9B=EA=B8=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- docs/README.md | 20 ++++++++++ src/main/java/racingcar/Application.java | 23 ++++++++++++ src/main/java/racingcar/Car.java | 38 +++++++++++++++++++ src/test/java/racingcar/CarTest.java | 48 ++++++++++++++++++++++++ 4 files changed, 129 insertions(+) create mode 100644 src/main/java/racingcar/Car.java create mode 100644 src/test/java/racingcar/CarTest.java diff --git a/docs/README.md b/docs/README.md index e69de29b..a96cf49d 100644 --- a/docs/README.md +++ b/docs/README.md @@ -0,0 +1,20 @@ +== 구현해야하는 기능 목록 == + +1. 자동차 이름 입력 (쉼표로 구분) + 1-1. 이름 나누기 + 1-2. 각 이름 검증 +2. 시도할 횟수 입력 + 2-1. 횟수 검증 (5회 이하) + +3. 각 라운드 진행 + 3-1. 각 라운드 별 결과 작성 (이름 : 순위) + +4. 최종 우승자 출력 (2명 이상일 수 있음) + + +유의사항 +- 사용자 입력값은 camp.nextstep.edu.missionutils.Console의 readLine() 활용 +- Random 값 추출은 camp.nextstep.edu.missionutils.Randoms의 pickNumberInRange() 활용 +- indent(인덴트, 들여쓰기) depth를 3이 넘지 않도록 구현 +- 함수(또는 메서드)가 한 가지 일만 하도록 최대한 작게 구현 +- JUnit 5와 AssertJ를 이용하여 본인이 정리한 기능 목록이 정상 동작함을 테스트 코드로 확인할 것! \ No newline at end of file diff --git a/src/main/java/racingcar/Application.java b/src/main/java/racingcar/Application.java index a17a52e7..926b41a5 100644 --- a/src/main/java/racingcar/Application.java +++ b/src/main/java/racingcar/Application.java @@ -1,7 +1,30 @@ package racingcar; +import camp.nextstep.edu.missionutils.Console; public class Application { public static void main(String[] args) { // TODO: 프로그램 구현 + + //1. 이름 입력 받기 + System.out.println("경주할 자동차 이름을 입력하세요. (이름은 쉼표(,) 기준으로 구분합니다.)"); + String participations = Console.readLine(); + + System.out.println("시도할 회수는 몇 회입니까?"); + String tryCounts = Console.readLine(); //readLine은 String으로 받아야 함. (int 불가x) + + //1-1. 이름 나누기 + String[] carNames = participations.split(","); //String을 콤마를 기준으로 나누어 리스트로 변환 + + //객체 배열 생성 + Car[] cars = new Car[carNames.length]; + + for (int i = 0; i < carNames.length; i++) { + cars[i] = new Car(carNames[i]); + } + + //체킹 + for (Car car : cars) { + System.out.println("참가자 : " + car.getName()); + } } } diff --git a/src/main/java/racingcar/Car.java b/src/main/java/racingcar/Car.java new file mode 100644 index 00000000..6e7d37aa --- /dev/null +++ b/src/main/java/racingcar/Car.java @@ -0,0 +1,38 @@ +package racingcar; + +public class Car { + + private String name; + private int position = 0 ; + + // 생성자 + public Car(String name){ + this.name = validateName(name); + } + + private String validateName(String name){ //필드는 private 궈장 + // TODO: 1. null 체크 + if (name == null) throw new IllegalArgumentException("이름을 입력해주세요."); + + // TODO: 2. 이름이 비었는지 체크(공백만으로 이루어졌는지) + String s = name.strip(); + if (s.isEmpty()) throw new IllegalArgumentException("이름은 공백만으로 이루어질 수 없습니다."); + + // TODO: 길이 > 5 체크 + if (s.length() > 5) throw new IllegalArgumentException("이름은 5글자 이하여야 합니다"); + + + return s; + } + + + public String getName(){ return name;} +// public int getPosition(){ return position;} + + +// void moveIf(int num){ +// if (num >= 4){ +// position++; +// } +// } +} diff --git a/src/test/java/racingcar/CarTest.java b/src/test/java/racingcar/CarTest.java new file mode 100644 index 00000000..cbb93a1f --- /dev/null +++ b/src/test/java/racingcar/CarTest.java @@ -0,0 +1,48 @@ +package racingcar; + +import org.junit.jupiter.api.Test; + +import static camp.nextstep.edu.missionutils.test.Assertions.assertRandomNumberInRangeTest; +import static camp.nextstep.edu.missionutils.test.Assertions.assertSimpleTest; +import static org.assertj.core.api.Assertions.assertThat; +import static org.assertj.core.api.Assertions.assertThatThrownBy; + + +class CarTest { + @Test + void 자동차의_이름은_5글자_넘으면_예외발생(){ + // 이름이 6자 이상인 자동차를 만들면 예외 발생 + assertThatThrownBy(() -> new Car("abcdef")) + .isInstanceOf(IllegalArgumentException.class); + } + + @Test + void 이름이_비었으면_예외발생(){ + assertThatThrownBy(() -> new Car(" ")) + .isInstanceOf(IllegalArgumentException.class); + } + + @Test + void 이름이_null이면_예외발생(){ + assertThatThrownBy(() -> new Car(null)) + .isInstanceOf(IllegalArgumentException.class); + } + +// @Test +// void 자동차는_숫자가_4이상일때_전진(){ //테스트는 경계값을 기준으로 설정 +// Car car = new Car("test1"); +// car.moveIf(4); +// +// } +// @Test +// void 자동차는_숫자가_3이하면_정지() { +// Car car = new Car("test1"); +// +// car.moveIf(3); // 3 이하 → 멈춤 +// +// // 자동차의 위치가 0인지 검증 +// // assertThat(???).isEqualTo(???); +// } + + +} From 63cbcca6723d098ff55d2d25501aa2b2094d057e Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=EC=9C=A4=ED=95=B4=EC=9D=B8?= Date: Mon, 22 Sep 2025 13:33:32 +0900 Subject: [PATCH 2/7] =?UTF-8?q?feat:=202.=EC=8B=9C=EB=8F=84=20=ED=9A=9F?= =?UTF-8?q?=EC=88=98=20=EC=9E=85=EB=A0=A5?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- docs/README.md | 4 +-- src/main/java/racingcar/Application.java | 30 +++++++++++++++++-- src/main/java/racingcar/Car.java | 3 +- src/test/java/racingcar/CarTest.java | 24 +++++++++------ src/test/java/racingcar/TryCountValidate.java | 5 ++++ .../java/racingcar/TryCountValidateTest.java | 20 +++++++++++++ 6 files changed, 71 insertions(+), 15 deletions(-) create mode 100644 src/test/java/racingcar/TryCountValidate.java create mode 100644 src/test/java/racingcar/TryCountValidateTest.java diff --git a/docs/README.md b/docs/README.md index a96cf49d..b259fbf1 100644 --- a/docs/README.md +++ b/docs/README.md @@ -1,8 +1,8 @@ -== 구현해야하는 기능 목록 == +구현해야하는 기능 목록 1. 자동차 이름 입력 (쉼표로 구분) 1-1. 이름 나누기 - 1-2. 각 이름 검증 + 1-2. 각 이름 검증 (5글자 이하) 2. 시도할 횟수 입력 2-1. 횟수 검증 (5회 이하) diff --git a/src/main/java/racingcar/Application.java b/src/main/java/racingcar/Application.java index 926b41a5..1a0415a9 100644 --- a/src/main/java/racingcar/Application.java +++ b/src/main/java/racingcar/Application.java @@ -9,9 +9,6 @@ public static void main(String[] args) { System.out.println("경주할 자동차 이름을 입력하세요. (이름은 쉼표(,) 기준으로 구분합니다.)"); String participations = Console.readLine(); - System.out.println("시도할 회수는 몇 회입니까?"); - String tryCounts = Console.readLine(); //readLine은 String으로 받아야 함. (int 불가x) - //1-1. 이름 나누기 String[] carNames = participations.split(","); //String을 콤마를 기준으로 나누어 리스트로 변환 @@ -26,5 +23,32 @@ public static void main(String[] args) { for (Car car : cars) { System.out.println("참가자 : " + car.getName()); } + // 2. 시도 횟수 입력 + System.out.println("시도할 회수는 몇 회입니까?"); + String tryCounts = Console.readLine(); //readLine은 String으로 받아야 함. (int 불가x) + + int Counts = Application.validateTryCount(tryCounts); + + for(int i = 0; i < Counts; i++){ + System.out.println( "--"+ (i+1) +"번째 시도--"); + // 자동차 게임 진행 + } + + + } + //2-1. 시도 횟수 검증(임의 규칙 생성) + public static int validateTryCount(String tryCounts){ + // 게임 횟수는 1번 이상일 것 + int num = Integer.parseInt(tryCounts); + + if (num < 1){ + throw new IllegalArgumentException("게임 횟수는 최소 1번이어야 합니다."); + } + + // 게임 횟수는 10번 이하일 것 + if (num > 10){ + throw new IllegalArgumentException("게임 횟수는 10회 이하여야 합니다."); + } + return num ; } } diff --git a/src/main/java/racingcar/Car.java b/src/main/java/racingcar/Car.java index 6e7d37aa..e4cb635e 100644 --- a/src/main/java/racingcar/Car.java +++ b/src/main/java/racingcar/Car.java @@ -25,8 +25,9 @@ private String validateName(String name){ //필드는 private 궈장 return s; } - public String getName(){ return name;} + + // public int getPosition(){ return position;} diff --git a/src/test/java/racingcar/CarTest.java b/src/test/java/racingcar/CarTest.java index cbb93a1f..39284c92 100644 --- a/src/test/java/racingcar/CarTest.java +++ b/src/test/java/racingcar/CarTest.java @@ -10,24 +10,32 @@ class CarTest { @Test - void 자동차의_이름은_5글자_넘으면_예외발생(){ + void 자동차의_이름은_5글자_넘으면_예외발생() { // 이름이 6자 이상인 자동차를 만들면 예외 발생 - assertThatThrownBy(() -> new Car("abcdef")) - .isInstanceOf(IllegalArgumentException.class); + assertThatThrownBy(() -> new Car("abcdef")) + .isInstanceOf(IllegalArgumentException.class); } @Test - void 이름이_비었으면_예외발생(){ + void 이름이_비었으면_예외발생() { assertThatThrownBy(() -> new Car(" ")) - .isInstanceOf(IllegalArgumentException.class); + .isInstanceOf(IllegalArgumentException.class); } @Test - void 이름이_null이면_예외발생(){ + void 이름이_null이면_예외발생() { assertThatThrownBy(() -> new Car(null)) - .isInstanceOf(IllegalArgumentException.class); + .isInstanceOf(IllegalArgumentException.class); } + //2번 + @Test + void 게임횟수는_1미만이면_예외발생() { + assertThatThrownBy(() -> new Car("1")) + .isInstanceOf(IllegalArgumentException.class); + } +} + // @Test // void 자동차는_숫자가_4이상일때_전진(){ //테스트는 경계값을 기준으로 설정 // Car car = new Car("test1"); @@ -44,5 +52,3 @@ class CarTest { // // assertThat(???).isEqualTo(???); // } - -} diff --git a/src/test/java/racingcar/TryCountValidate.java b/src/test/java/racingcar/TryCountValidate.java new file mode 100644 index 00000000..6e207c4b --- /dev/null +++ b/src/test/java/racingcar/TryCountValidate.java @@ -0,0 +1,5 @@ +package racingcar; + +public class TryCountValidate { + +} diff --git a/src/test/java/racingcar/TryCountValidateTest.java b/src/test/java/racingcar/TryCountValidateTest.java new file mode 100644 index 00000000..fe84d674 --- /dev/null +++ b/src/test/java/racingcar/TryCountValidateTest.java @@ -0,0 +1,20 @@ +package racingcar; +import static org.assertj.core.api.Assertions.assertThat; +import static org.assertj.core.api.Assertions.assertThatThrownBy; +import org.junit.jupiter.api.Test; + +public class TryCountValidateTest { + + @Test + void 숫자가_0이하면_예외처리(){ + assertThatThrownBy(() -> Application.validateTryCount("0")) + .isInstanceOf(IllegalArgumentException.class); + } + + @Test + void 숫자가_10초과면_예외처리(){ + assertThatThrownBy(() -> Application.validateTryCount("11")) + .isInstanceOf(IllegalArgumentException.class); + } + +} From 0378efec43049f110e2c3fec0a82e0f23ed9a425 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=EC=9C=A4=ED=95=B4=EC=9D=B8?= Date: Mon, 22 Sep 2025 16:28:40 +0900 Subject: [PATCH 3/7] =?UTF-8?q?feat:=20(=EB=AF=B8=EC=99=84)3.=EA=B2=8C?= =?UTF-8?q?=EC=9E=84=20=EC=A7=84=ED=96=89?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/main/java/racingcar/Application.java | 17 +++++++++-- src/main/java/racingcar/Car.java | 31 +++++++++++-------- src/main/java/racingcar/Game.java | 38 ++++++++++++++++++++++++ src/test/java/racingcar/CarTest.java | 38 ++++++++++++------------ 4 files changed, 89 insertions(+), 35 deletions(-) create mode 100644 src/main/java/racingcar/Game.java diff --git a/src/main/java/racingcar/Application.java b/src/main/java/racingcar/Application.java index 1a0415a9..b09585d8 100644 --- a/src/main/java/racingcar/Application.java +++ b/src/main/java/racingcar/Application.java @@ -19,7 +19,7 @@ public static void main(String[] args) { cars[i] = new Car(carNames[i]); } - //체킹 + //공백 제거 체킹 for (Car car : cars) { System.out.println("참가자 : " + car.getName()); } @@ -28,12 +28,21 @@ public static void main(String[] args) { String tryCounts = Console.readLine(); //readLine은 String으로 받아야 함. (int 불가x) int Counts = Application.validateTryCount(tryCounts); + System.out.println("< 게임 실행 결과 >"); + //3. 게임 실행 + Game game = new Game(); for(int i = 0; i < Counts; i++){ System.out.println( "--"+ (i+1) +"번째 시도--"); - // 자동차 게임 진행 - } + //각 라운드 경주 진행 + game.runRound(cars); + //라운드 별 결과 출력 + game.printRound(cars); + } + //게임 끝! 결과 출력 + game.checkFinalPosition(); + game.printWinner(); } //2-1. 시도 횟수 검증(임의 규칙 생성) @@ -51,4 +60,6 @@ public static int validateTryCount(String tryCounts){ } return num ; } + + } diff --git a/src/main/java/racingcar/Car.java b/src/main/java/racingcar/Car.java index e4cb635e..0e8c57ed 100644 --- a/src/main/java/racingcar/Car.java +++ b/src/main/java/racingcar/Car.java @@ -1,16 +1,18 @@ package racingcar; +import camp.nextstep.edu.missionutils.Randoms; + public class Car { private String name; - private int position = 0 ; + private int position = 0; //초기화 // 생성자 - public Car(String name){ + public Car(String name) { this.name = validateName(name); } - private String validateName(String name){ //필드는 private 궈장 + private String validateName(String name) { //필드는 private 궈장 // TODO: 1. null 체크 if (name == null) throw new IllegalArgumentException("이름을 입력해주세요."); @@ -25,15 +27,18 @@ private String validateName(String name){ //필드는 private 궈장 return s; } - public String getName(){ return name;} - - -// public int getPosition(){ return position;} + public String getName() { + return name; + } + public int getPosition() { + return position; + } + //4 이상이면 전진 + void moveIf(int num) { + if (num >= 4) { + position++; + } + } -// void moveIf(int num){ -// if (num >= 4){ -// position++; -// } -// } -} +} \ No newline at end of file diff --git a/src/main/java/racingcar/Game.java b/src/main/java/racingcar/Game.java new file mode 100644 index 00000000..b122ba19 --- /dev/null +++ b/src/main/java/racingcar/Game.java @@ -0,0 +1,38 @@ +package racingcar; + +import camp.nextstep.edu.missionutils.Randoms; + +public class Game { //게임 진행 클래스 + // 랜덤 넘버 생성 + public int pickRandomNumber(){ + return Randoms.pickNumberInRange(0,9); + } + + //라운드 진행 + public void runRound(Car[] cars){ + //모든 차에 대해 랜덤 수를 뽑고, 전진 여부를 판단하기 + for (Car car : cars) { + int n = pickRandomNumber(); + car.moveIf(n); + } + } + + //라운드 결과 출력(라운드마다 실행!) + public void printRound(Car[] cars){ + for (Car car : cars) { + System.out.println(car.getName() + " : " + car.getPosition()); + } + } + public void checkFinalPosition(Car[] cars){ + for (Car car : cars) { + + } + } + public void printWinner(Car[] cars){ + for (Car car : cars) { + System.out.println(max() + } + } + + +} diff --git a/src/test/java/racingcar/CarTest.java b/src/test/java/racingcar/CarTest.java index 39284c92..105e2586 100644 --- a/src/test/java/racingcar/CarTest.java +++ b/src/test/java/racingcar/CarTest.java @@ -29,26 +29,26 @@ class CarTest { } //2번 +// @Test +// void 게임횟수는_1미만이면_예외발생() { +// assertThatThrownBy(() -> new Car("1")) +// .isInstanceOf(IllegalArgumentException.class); +// } + @Test - void 게임횟수는_1미만이면_예외발생() { - assertThatThrownBy(() -> new Car("1")) - .isInstanceOf(IllegalArgumentException.class); + void 자동차는_숫자가_4이상일때_전진() { //테스트는 경계값을 기준으로 설정 + Car car = new Car("test1"); + car.moveIf(4); + assertThat(???).isEqualTo(???); } -} -// @Test -// void 자동차는_숫자가_4이상일때_전진(){ //테스트는 경계값을 기준으로 설정 -// Car car = new Car("test1"); -// car.moveIf(4); -// -// } -// @Test -// void 자동차는_숫자가_3이하면_정지() { -// Car car = new Car("test1"); -// -// car.moveIf(3); // 3 이하 → 멈춤 -// -// // 자동차의 위치가 0인지 검증 -// // assertThat(???).isEqualTo(???); -// } + @Test + void 자동차는_숫자가_3이하면_정지() { + Car car = new Car("test1"); + car.moveIf(3); // 3 이하 → 멈춤 + + // 자동차의 위치가 0인지 검증 + // assertThat(???).isEqualTo(???); + } +} From 10ef05f8ddb0a4b7211de651e50ca0b67835c2a9 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=EC=9C=A4=ED=95=B4=EC=9D=B8?= Date: Mon, 22 Sep 2025 17:13:51 +0900 Subject: [PATCH 4/7] =?UTF-8?q?feat:=203.=EA=B2=8C=EC=9E=84=EC=A7=84?= =?UTF-8?q?=ED=96=89=20=E5=AE=8C?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- docs/README.md | 2 +- src/main/java/racingcar/Application.java | 5 +++-- src/main/java/racingcar/Car.java | 7 +++++++ src/main/java/racingcar/Game.java | 22 +++++++++++----------- src/test/java/racingcar/CarTest.java | 12 ++++++------ 5 files changed, 28 insertions(+), 20 deletions(-) diff --git a/docs/README.md b/docs/README.md index b259fbf1..30feb965 100644 --- a/docs/README.md +++ b/docs/README.md @@ -7,7 +7,7 @@ 2-1. 횟수 검증 (5회 이하) 3. 각 라운드 진행 - 3-1. 각 라운드 별 결과 작성 (이름 : 순위) + 3-1. 각 라운드 별 결과 작성 (이름 : 진행 상황) 4. 최종 우승자 출력 (2명 이상일 수 있음) diff --git a/src/main/java/racingcar/Application.java b/src/main/java/racingcar/Application.java index b09585d8..991572f6 100644 --- a/src/main/java/racingcar/Application.java +++ b/src/main/java/racingcar/Application.java @@ -33,6 +33,7 @@ public static void main(String[] args) { //3. 게임 실행 Game game = new Game(); for(int i = 0; i < Counts; i++){ + System.out.println(""); System.out.println( "--"+ (i+1) +"번째 시도--"); //각 라운드 경주 진행 game.runRound(cars); @@ -41,8 +42,8 @@ public static void main(String[] args) { game.printRound(cars); } //게임 끝! 결과 출력 - game.checkFinalPosition(); - game.printWinner(); +// game.checkFinalPosition(); +// game.printWinner(); } //2-1. 시도 횟수 검증(임의 규칙 생성) diff --git a/src/main/java/racingcar/Car.java b/src/main/java/racingcar/Car.java index 0e8c57ed..3686dafa 100644 --- a/src/main/java/racingcar/Car.java +++ b/src/main/java/racingcar/Car.java @@ -34,6 +34,13 @@ public String getName() { public int getPosition() { return position; } + + public StringBuffer printPosition() { //String으로는 문자열 추가가 어려움. buffer또는 builder를 사용해야함. + StringBuffer sb = new StringBuffer(); + sb.append("-".repeat(Math.max(0, position))); //for문 대신 string.repeat로 변경? + return sb; + } + //4 이상이면 전진 void moveIf(int num) { if (num >= 4) { diff --git a/src/main/java/racingcar/Game.java b/src/main/java/racingcar/Game.java index b122ba19..ee586c64 100644 --- a/src/main/java/racingcar/Game.java +++ b/src/main/java/racingcar/Game.java @@ -20,19 +20,19 @@ public void runRound(Car[] cars){ //라운드 결과 출력(라운드마다 실행!) public void printRound(Car[] cars){ for (Car car : cars) { - System.out.println(car.getName() + " : " + car.getPosition()); - } - } - public void checkFinalPosition(Car[] cars){ - for (Car car : cars) { - - } - } - public void printWinner(Car[] cars){ - for (Car car : cars) { - System.out.println(max() + System.out.println(car.getName() + " : " + car.printPosition()); } } +// public void checkFinalPosition(Car[] cars){ +// for (Car car : cars) { +// +// } +// } +// public void printWinner(Car[] cars){ +// for (Car car : cars) { +// System.out.println(max() +// } +// } } diff --git a/src/test/java/racingcar/CarTest.java b/src/test/java/racingcar/CarTest.java index 105e2586..c313d4ba 100644 --- a/src/test/java/racingcar/CarTest.java +++ b/src/test/java/racingcar/CarTest.java @@ -35,12 +35,12 @@ class CarTest { // .isInstanceOf(IllegalArgumentException.class); // } - @Test - void 자동차는_숫자가_4이상일때_전진() { //테스트는 경계값을 기준으로 설정 - Car car = new Car("test1"); - car.moveIf(4); - assertThat(???).isEqualTo(???); - } +// @Test +// void 자동차는_숫자가_4이상일때_전진() { //테스트는 경계값을 기준으로 설정 +// Car car = new Car("test1"); +// car.moveIf(4); +// assertThat(???).isEqualTo(???); +// } @Test void 자동차는_숫자가_3이하면_정지() { From 0b831d657b63b1a301388edf2003a4e4571393e6 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=EC=9C=A4=ED=95=B4=EC=9D=B8?= Date: Mon, 22 Sep 2025 20:25:15 +0900 Subject: [PATCH 5/7] =?UTF-8?q?feat:=204.=20=EA=B2=8C=EC=9E=84=20=EB=81=9D?= =?UTF-8?q?!=20=EC=B5=9C=EC=A2=85=20=EC=9A=B0=EC=8A=B9=EC=9E=90=20?= =?UTF-8?q?=EC=B6=9C=EB=A0=A5=20=E5=AE=8C?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- build.gradle | 1 + docs/README.md | 11 +++-- src/main/java/racingcar/Application.java | 26 +++++------ src/main/java/racingcar/Car.java | 19 ++------ src/main/java/racingcar/Game.java | 46 ++++++++++++++----- src/test/java/racingcar/CarTest.java | 26 +++++------ src/test/java/racingcar/TryCountValidate.java | 5 -- .../java/racingcar/TryCountValidateTest.java | 6 +-- 8 files changed, 72 insertions(+), 68 deletions(-) delete mode 100644 src/test/java/racingcar/TryCountValidate.java diff --git a/build.gradle b/build.gradle index 15f33525..4d418501 100644 --- a/build.gradle +++ b/build.gradle @@ -22,4 +22,5 @@ java { test { useJUnitPlatform() + jvmArgs '-Xshare:off' // JVM 아규먼트 설정 } diff --git a/docs/README.md b/docs/README.md index 30feb965..ed43fe3a 100644 --- a/docs/README.md +++ b/docs/README.md @@ -4,13 +4,16 @@ 1-1. 이름 나누기 1-2. 각 이름 검증 (5글자 이하) 2. 시도할 횟수 입력 - 2-1. 횟수 검증 (5회 이하) + 2-1. 횟수 검증 (10회 이하) 3. 각 라운드 진행 - 3-1. 각 라운드 별 결과 작성 (이름 : 진행 상황) - -4. 최종 우승자 출력 (2명 이상일 수 있음) + 3-1. 각 개체 별 랜덤 넘버 생성 + 3-2. 라운드 진행 + 3-3. 각 라운드 별 결과 작성 (이름 : 진행 상황) +4. 최종 우승자 출력 + 4-1. 각 객체 별 최종 위치 확인 + 4-2. 우승자 출력 (2명 이상일 수 있음) 유의사항 - 사용자 입력값은 camp.nextstep.edu.missionutils.Console의 readLine() 활용 diff --git a/src/main/java/racingcar/Application.java b/src/main/java/racingcar/Application.java index 991572f6..304f4570 100644 --- a/src/main/java/racingcar/Application.java +++ b/src/main/java/racingcar/Application.java @@ -18,49 +18,45 @@ public static void main(String[] args) { for (int i = 0; i < carNames.length; i++) { cars[i] = new Car(carNames[i]); } + //공백 제거 체크용 + for (Car car : cars) { System.out.println("참가자 : " + car.getName()); } - //공백 제거 체킹 - for (Car car : cars) { - System.out.println("참가자 : " + car.getName()); - } // 2. 시도 횟수 입력 System.out.println("시도할 회수는 몇 회입니까?"); String tryCounts = Console.readLine(); //readLine은 String으로 받아야 함. (int 불가x) int Counts = Application.validateTryCount(tryCounts); - System.out.println("< 게임 실행 결과 >"); + System.out.println("[게임 실행 결과]"); //3. 게임 실행 Game game = new Game(); for(int i = 0; i < Counts; i++){ System.out.println(""); - System.out.println( "--"+ (i+1) +"번째 시도--"); + System.out.println( "["+ (i+1) +"번째 시도]"); //각 라운드 경주 진행 game.runRound(cars); - //라운드 별 결과 출력 + //3-1. 라운드 별 결과 출력 game.printRound(cars); } - //게임 끝! 결과 출력 -// game.checkFinalPosition(); -// game.printWinner(); - + //4. 게임 끝! 결과 출력 + //4-1. + game.checkWinner(cars); + //4-2. + game.printWinner(cars); } + //2-1. 시도 횟수 검증(임의 규칙 생성) public static int validateTryCount(String tryCounts){ // 게임 횟수는 1번 이상일 것 int num = Integer.parseInt(tryCounts); - if (num < 1){ throw new IllegalArgumentException("게임 횟수는 최소 1번이어야 합니다."); } - // 게임 횟수는 10번 이하일 것 if (num > 10){ throw new IllegalArgumentException("게임 횟수는 10회 이하여야 합니다."); } return num ; } - - } diff --git a/src/main/java/racingcar/Car.java b/src/main/java/racingcar/Car.java index 3686dafa..2509cd7a 100644 --- a/src/main/java/racingcar/Car.java +++ b/src/main/java/racingcar/Car.java @@ -22,30 +22,17 @@ private String validateName(String name) { //필드는 private 궈장 // TODO: 길이 > 5 체크 if (s.length() > 5) throw new IllegalArgumentException("이름은 5글자 이하여야 합니다"); - - return s; } - public String getName() { - return name; - } - - public int getPosition() { - return position; - } + public String getName() { return name; } + public int getPosition() { return position; } public StringBuffer printPosition() { //String으로는 문자열 추가가 어려움. buffer또는 builder를 사용해야함. StringBuffer sb = new StringBuffer(); sb.append("-".repeat(Math.max(0, position))); //for문 대신 string.repeat로 변경? return sb; } - //4 이상이면 전진 - void moveIf(int num) { - if (num >= 4) { - position++; - } - } - + void moveIf(int num) { if (num >= 4) { position++; } } } \ No newline at end of file diff --git a/src/main/java/racingcar/Game.java b/src/main/java/racingcar/Game.java index ee586c64..9321f23f 100644 --- a/src/main/java/racingcar/Game.java +++ b/src/main/java/racingcar/Game.java @@ -3,12 +3,12 @@ import camp.nextstep.edu.missionutils.Randoms; public class Game { //게임 진행 클래스 - // 랜덤 넘버 생성 + //3-1. 랜덤 넘버 생성 public int pickRandomNumber(){ return Randoms.pickNumberInRange(0,9); } - //라운드 진행 + //3-2. 라운드 진행 public void runRound(Car[] cars){ //모든 차에 대해 랜덤 수를 뽑고, 전진 여부를 판단하기 for (Car car : cars) { @@ -17,22 +17,46 @@ public void runRound(Car[] cars){ } } - //라운드 결과 출력(라운드마다 실행!) + //3-3. 라운드 결과 출력(라운드마다 실행!) public void printRound(Car[] cars){ for (Car car : cars) { + // 단순히 getPosition으로 숫자만 출력하는게 아님! 현재 위치를 '-' 이용해서 출력하기 System.out.println(car.getName() + " : " + car.printPosition()); } } -// public void checkFinalPosition(Car[] cars){ + //4. 게임 끝! + + //4-1. 마지막 위치 확인 + // - 객체 배열 순회하면서 최종 위치 + 우승자 갱신 + public StringBuilder checkWinner(Car[] cars){ + StringBuilder winners = new StringBuilder(); //winner는 2명 이상일 수 있으므로 stringbuilder로 생성 + int maxPosition = 0; + //<1> 1번 순회하기 (max값과 같으면 string에 추가, 더 크면 초기화) + for (Car car : cars) { + //[1] max보다 크면 StringBuilder 초기화 후 우승자 후보 정보 입력 + if (car.getPosition() > maxPosition) { + //StringBuilder 초기화 + winners.delete(0, winners.length()); + winners.append(car.getName()); + maxPosition = car.getPosition(); + } + //[2] max와 동일하면 초기화는 하지 않고 우승자 후보 추가 입력 + else if (car.getPosition() == maxPosition) { + winners.append(", "); + winners.append(car.getName()); + } + } +// //<2> 2번 순회하기 (maxPosition 찾고, max와 동일한 position을 가진 carName 수집) // for (Car car : cars) { -// +// if (car.getPosition() >= maxPosition) { maxPosition = car.getPosition(); } // } -// } -// public void printWinner(Car[] cars){ // for (Car car : cars) { -// System.out.println(max() +// if (car.getPosition() == maxPosition) { winners.append(car.getName()).append(", "); } // } -// } - - + return winners; + } + public void printWinner(Car[] cars){ + System.out.println("<최종 우승자> :"+ checkWinner(cars)); + } } + diff --git a/src/test/java/racingcar/CarTest.java b/src/test/java/racingcar/CarTest.java index c313d4ba..ca5ffc6a 100644 --- a/src/test/java/racingcar/CarTest.java +++ b/src/test/java/racingcar/CarTest.java @@ -9,6 +9,7 @@ class CarTest { + //1. 자동차 이름 입력 (쉼표로 구분) @Test void 자동차의_이름은_5글자_넘으면_예외발생() { // 이름이 6자 이상인 자동차를 만들면 예외 발생 @@ -28,27 +29,24 @@ class CarTest { .isInstanceOf(IllegalArgumentException.class); } - //2번 +// //2번 - 시도할 횟수 입력 // @Test // void 게임횟수는_1미만이면_예외발생() { -// assertThatThrownBy(() -> new Car("1")) -// .isInstanceOf(IllegalArgumentException.class); -// } - -// @Test -// void 자동차는_숫자가_4이상일때_전진() { //테스트는 경계값을 기준으로 설정 -// Car car = new Car("test1"); -// car.moveIf(4); -// assertThat(???).isEqualTo(???); +// assertThatThrownBy(() -> Application.validateTryCount("0") +// .isInstanceOf(IllegalArgumentException.class)); // } + //3. 전진 규칙 + @Test + void 자동차는_숫자가_4이상일때_전진() { //테스트는 경계값을 기준으로 설정 + Car car = new Car("test1"); + car.moveIf(4); + assertThat(car.getPosition()).isEqualTo(1); + } @Test void 자동차는_숫자가_3이하면_정지() { Car car = new Car("test1"); - car.moveIf(3); // 3 이하 → 멈춤 - - // 자동차의 위치가 0인지 검증 - // assertThat(???).isEqualTo(???); + assertThat(car.getPosition()).isEqualTo(0); // 자동차의 위치가 0인지 검증 } } diff --git a/src/test/java/racingcar/TryCountValidate.java b/src/test/java/racingcar/TryCountValidate.java deleted file mode 100644 index 6e207c4b..00000000 --- a/src/test/java/racingcar/TryCountValidate.java +++ /dev/null @@ -1,5 +0,0 @@ -package racingcar; - -public class TryCountValidate { - -} diff --git a/src/test/java/racingcar/TryCountValidateTest.java b/src/test/java/racingcar/TryCountValidateTest.java index fe84d674..cb8e4421 100644 --- a/src/test/java/racingcar/TryCountValidateTest.java +++ b/src/test/java/racingcar/TryCountValidateTest.java @@ -4,15 +4,15 @@ import org.junit.jupiter.api.Test; public class TryCountValidateTest { - + //2번 - 시도할 횟수 입력 테스트 @Test - void 숫자가_0이하면_예외처리(){ + void 게임횟수가_0이하면_예외처리(){ assertThatThrownBy(() -> Application.validateTryCount("0")) .isInstanceOf(IllegalArgumentException.class); } @Test - void 숫자가_10초과면_예외처리(){ + void 게임횟수가_10초과면_예외처리(){ assertThatThrownBy(() -> Application.validateTryCount("11")) .isInstanceOf(IllegalArgumentException.class); } From bd64f69f4ebb5982cec2ccdfe9147d7f3486287c Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=EC=9C=A4=ED=95=B4=EC=9D=B8?= Date: Mon, 22 Sep 2025 20:37:10 +0900 Subject: [PATCH 6/7] =?UTF-8?q?feat:=20applicationTest=20=ED=99=95?= =?UTF-8?q?=EC=9D=B8=20=E5=AE=8C?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/main/java/racingcar/Application.java | 6 +++--- src/main/java/racingcar/Game.java | 4 +++- src/test/java/racingcar/CarTest.java | 2 ++ 3 files changed, 8 insertions(+), 4 deletions(-) diff --git a/src/main/java/racingcar/Application.java b/src/main/java/racingcar/Application.java index 304f4570..81a01a89 100644 --- a/src/main/java/racingcar/Application.java +++ b/src/main/java/racingcar/Application.java @@ -26,13 +26,13 @@ public static void main(String[] args) { String tryCounts = Console.readLine(); //readLine은 String으로 받아야 함. (int 불가x) int Counts = Application.validateTryCount(tryCounts); - System.out.println("[게임 실행 결과]"); + //System.out.println("[게임 실행 결과]"); //3. 게임 실행 Game game = new Game(); for(int i = 0; i < Counts; i++){ - System.out.println(""); - System.out.println( "["+ (i+1) +"번째 시도]"); +// System.out.println(""); +// System.out.println( "["+ (i+1) +"번째 시도]"); //각 라운드 경주 진행 game.runRound(cars); diff --git a/src/main/java/racingcar/Game.java b/src/main/java/racingcar/Game.java index 9321f23f..1ee94fd1 100644 --- a/src/main/java/racingcar/Game.java +++ b/src/main/java/racingcar/Game.java @@ -56,7 +56,9 @@ else if (car.getPosition() == maxPosition) { return winners; } public void printWinner(Car[] cars){ - System.out.println("<최종 우승자> :"+ checkWinner(cars)); +// System.out.println("<최종 우승자> :"+ checkWinner(cars)); + System.out.println("최종 우승자 : " + checkWinner(cars)); + } } diff --git a/src/test/java/racingcar/CarTest.java b/src/test/java/racingcar/CarTest.java index ca5ffc6a..bcfc8dbb 100644 --- a/src/test/java/racingcar/CarTest.java +++ b/src/test/java/racingcar/CarTest.java @@ -49,4 +49,6 @@ class CarTest { car.moveIf(3); // 3 이하 → 멈춤 assertThat(car.getPosition()).isEqualTo(0); // 자동차의 위치가 0인지 검증 } + + } From 8f1c5fb9d8429adeb4484ecd3b9eb2442800ef1b Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=EC=9C=A4=ED=95=B4=EC=9D=B8?= Date: Mon, 22 Sep 2025 21:02:12 +0900 Subject: [PATCH 7/7] =?UTF-8?q?feat:=20=EC=BD=94=EB=93=9C=20=EA=B0=88?= =?UTF-8?q?=EB=AC=B4=EB=A6=AC=20=E5=AE=8C?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/main/java/racingcar/Application.java | 9 +++++++-- src/main/java/racingcar/Car.java | 15 ++++++++------- src/main/java/racingcar/Game.java | 2 +- 3 files changed, 16 insertions(+), 10 deletions(-) diff --git a/src/main/java/racingcar/Application.java b/src/main/java/racingcar/Application.java index 81a01a89..cde40658 100644 --- a/src/main/java/racingcar/Application.java +++ b/src/main/java/racingcar/Application.java @@ -31,7 +31,7 @@ public static void main(String[] args) { //3. 게임 실행 Game game = new Game(); for(int i = 0; i < Counts; i++){ -// System.out.println(""); + System.out.println(""); // System.out.println( "["+ (i+1) +"번째 시도]"); //각 라운드 경주 진행 game.runRound(cars); @@ -49,7 +49,12 @@ public static void main(String[] args) { //2-1. 시도 횟수 검증(임의 규칙 생성) public static int validateTryCount(String tryCounts){ // 게임 횟수는 1번 이상일 것 - int num = Integer.parseInt(tryCounts); + int num ; + try { + num = Integer.parseInt(tryCounts); + } catch(NumberFormatException e) { + throw new IllegalArgumentException("시도 횟수는 숫자여야 합니다."); + } if (num < 1){ throw new IllegalArgumentException("게임 횟수는 최소 1번이어야 합니다."); } diff --git a/src/main/java/racingcar/Car.java b/src/main/java/racingcar/Car.java index 2509cd7a..30e51286 100644 --- a/src/main/java/racingcar/Car.java +++ b/src/main/java/racingcar/Car.java @@ -1,7 +1,4 @@ package racingcar; - -import camp.nextstep.edu.missionutils.Randoms; - public class Car { private String name; @@ -12,7 +9,7 @@ public Car(String name) { this.name = validateName(name); } - private String validateName(String name) { //필드는 private 궈장 + private String validateName(String name) { //필드는 private 권장? // TODO: 1. null 체크 if (name == null) throw new IllegalArgumentException("이름을 입력해주세요."); @@ -28,11 +25,15 @@ private String validateName(String name) { //필드는 private 궈장 public String getName() { return name; } public int getPosition() { return position; } - public StringBuffer printPosition() { //String으로는 문자열 추가가 어려움. buffer또는 builder를 사용해야함. - StringBuffer sb = new StringBuffer(); - sb.append("-".repeat(Math.max(0, position))); //for문 대신 string.repeat로 변경? + public StringBuilder printPosition() { //String으로는 문자열 추가가 어려움. buffer또는 builder를 사용해야함. + StringBuilder sb = new StringBuilder(); + sb.append("-".repeat(Math.max(0, position))); //for문 대신 string.repeat로 변경 return sb; } +// public String printPosition() { //String으로는 문자열 추가가 어려움. buffer또는 builder를 사용해야함. +// return "-".repeat(position); +// } + //4 이상이면 전진 void moveIf(int num) { if (num >= 4) { position++; } } } \ No newline at end of file diff --git a/src/main/java/racingcar/Game.java b/src/main/java/racingcar/Game.java index 1ee94fd1..cc9a89e5 100644 --- a/src/main/java/racingcar/Game.java +++ b/src/main/java/racingcar/Game.java @@ -42,7 +42,7 @@ public StringBuilder checkWinner(Car[] cars){ } //[2] max와 동일하면 초기화는 하지 않고 우승자 후보 추가 입력 else if (car.getPosition() == maxPosition) { - winners.append(", "); + if (winners.length() > 0) { winners.append(", ");} winners.append(car.getName()); } }