From a2de675ce08c8edbfbcecfad9e7a46a5e37eea9c Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=EA=B9=80=EC=9A=A9=EC=A7=84?= Date: Mon, 24 Mar 2025 18:46:43 +0900 Subject: [PATCH 01/20] =?UTF-8?q?docs/README.md=20=EC=9E=91=EC=84=B1?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- README.md | 1 + docs/README.md | 68 ++++++++++++++++++++++++++++++++++++++++++++++++++ 2 files changed, 69 insertions(+) diff --git a/README.md b/README.md index fa26560e..797556aa 100644 --- a/README.md +++ b/README.md @@ -152,3 +152,4 @@ Randoms.pickNumberInRange(0,9); - **기능을 구현하기 전 `docs/README.md`에 구현할 기능 목록을 정리**해 추가한다. - **Git의 커밋 단위는 앞 단계에서 `docs/README.md`에 정리한 기능 목록 단위**로 추가한다. + diff --git a/docs/README.md b/docs/README.md index e69de29b..b7ee734f 100644 --- a/docs/README.md +++ b/docs/README.md @@ -0,0 +1,68 @@ +# 미션 - 자동차 경주 + +## 기능 요구 사항 +초간단 자동차 경주 게임을 구현한다. + +- 주어진 횟수 동안 n대의 자동차는 전진 또는 멈출 수 있다. +- 각 자동차에 이름을 부여할 수 있다. 전진하는 자동차를 출력할 때 자동차 이름을 같이 출력한다. +- 자동차 이름은 쉼표(,)를 기준으로 구분하며 이름은 5자 이하만 가능하다. +- 사용자는 몇 번의 이동을 할 것인지를 입력할 수 있어야 한다. +- 전진하는 조건은 0에서 9 사이에서 무작위 값을 구한 후 무작위 값이 4 이상일 경우이다. +- 자동차 경주 게임을 완료한 후 누가 우승했는지를 알려준다. 우승자는 한 명 이상일 수 있다. +- 우승자가 여러 명일 경우 쉼표(,)를 이용하여 구분한다. +- 사용자가 잘못된 값을 입력할 경우 `IllegalArgumentException`을 발생시킨 후 애플리케이션은 종료되어야 한다. + +### 입출력 요구 사항 + +#### 입력 + +- 경주 할 자동차 이름(이름은 쉼표(,) 기준으로 구분) + +``` +pobi,woni,jun +``` + +- 시도할 회수 + +``` +5 +``` + +#### 출력 + +- 각 차수별 실행 결과 + +``` +pobi : -- +woni : ---- +jun : --- +``` + +- 단독 우승자 안내 문구 + +``` +최종 우승자 : pobi +``` + +- 공동 우승자 안내 문구 + +``` +최종 우승자 : pobi, jun +``` + +## 프로그래밍 요구 사항 + +- JDK 17 버전에서 실행 가능해야 한다. **JDK 17에서 정상적으로 동작하지 않을 경우 0점 처리한다.** +- 프로그램 실행의 시작점은 `Application`의 `main()`이다. +- `build.gradle` 파일을 변경할 수 없고, 외부 라이브러리를 사용하지 않는다. +- [Java 코드 컨벤션](https://github.com/woowacourse/woowacourse-docs/tree/master/styleguide/java) 가이드를 + 준수하며 프로그래밍한다. +- 프로그램 종료 시 `System.exit()`를 호출하지 않는다. +- 프로그램 구현이 완료되면 `ApplicationTest`의 모든 테스트가 성공해야 한다. **테스트가 실패할 경우 0점 처리한다.** +- 프로그래밍 요구 사항에서 달리 명시하지 않는 한 파일, 패키지 이름을 수정하거나 이동하지 않는다. + + +## 과제 진행 요구 사항 + +- **기능을 구현하기 전 `docs/README.md`에 구현할 기능 목록을 정리**해 추가한다. +- **Git의 커밋 단위는 앞 단계에서 `docs/README.md`에 정리한 기능 목록 단위**로 추가한다. \ No newline at end of file From 836319e9d0ca163a86fea45e204ce395e9e1e59f Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=EA=B9=80=EC=9A=A9=EC=A7=84?= Date: Mon, 24 Mar 2025 19:09:00 +0900 Subject: [PATCH 02/20] =?UTF-8?q?docs/README.md=20:=20=EC=88=98=EC=A0=95?= =?UTF-8?q?=20Application.java=20:=20=EA=B8=B0=EB=8A=A5=20=EC=9A=94?= =?UTF-8?q?=EA=B5=AC=20=EC=82=AC=ED=95=AD=5F=EC=B0=A8=EB=9F=89=20=EC=9D=B4?= =?UTF-8?q?=EB=A6=84=20=EC=9E=85=EB=A0=A5=EB=B0=9B=EA=B8=B0=20carInput(),?= =?UTF-8?q?=20carSplit()=20=EB=A7=A4=EC=84=9C=EB=93=9C=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 --- docs/README.md | 8 ++++---- src/main/java/racingcar/Application.java | 20 ++++++++++++++++++++ 2 files changed, 24 insertions(+), 4 deletions(-) diff --git a/docs/README.md b/docs/README.md index b7ee734f..6f65c112 100644 --- a/docs/README.md +++ b/docs/README.md @@ -3,14 +3,14 @@ ## 기능 요구 사항 초간단 자동차 경주 게임을 구현한다. -- 주어진 횟수 동안 n대의 자동차는 전진 또는 멈출 수 있다. -- 각 자동차에 이름을 부여할 수 있다. 전진하는 자동차를 출력할 때 자동차 이름을 같이 출력한다. -- 자동차 이름은 쉼표(,)를 기준으로 구분하며 이름은 5자 이하만 가능하다. +- 각 자동차에 이름을 부여할 수 있다, 자동차 이름은 쉼표(,)를 기준으로 구분하여 입력받는다. O - 사용자는 몇 번의 이동을 할 것인지를 입력할 수 있어야 한다. +- 이름은 5자 이하만 가능하다. 사용자가 잘못된 값을 입력할 경우 `IllegalArgumentException`을 발생시킨 후 애플리케이션은 종료되어야 한다. +- 주어진 횟수 동안 n대의 자동차는 전진 또는 멈출 수 있다. - 전진하는 조건은 0에서 9 사이에서 무작위 값을 구한 후 무작위 값이 4 이상일 경우이다. +- 각 자동차에 이름을 부여할 수 있다. 전진하는 자동차를 출력할 때 자동차 이름을 같이 출력한다. - 자동차 경주 게임을 완료한 후 누가 우승했는지를 알려준다. 우승자는 한 명 이상일 수 있다. - 우승자가 여러 명일 경우 쉼표(,)를 이용하여 구분한다. -- 사용자가 잘못된 값을 입력할 경우 `IllegalArgumentException`을 발생시킨 후 애플리케이션은 종료되어야 한다. ### 입출력 요구 사항 diff --git a/src/main/java/racingcar/Application.java b/src/main/java/racingcar/Application.java index a17a52e7..59d41bfd 100644 --- a/src/main/java/racingcar/Application.java +++ b/src/main/java/racingcar/Application.java @@ -1,7 +1,27 @@ package racingcar; +import java.util.Scanner; + public class Application { public static void main(String[] args) { // TODO: 프로그램 구현 + String carsStr = carInput(); + String carsList[] = carSplit(carsStr); + } + + public static String carInput() { // 사용자 입력 (자동차 목록) + Scanner scanner = new Scanner(System.in); + + System.out.println("경주를 진행할 자동차들을 ','를 기준으로 분리하여 입력해주세요.(이름은 5자 이하만 가능합니다.)"); + String cars = scanner.nextLine(); + return cars; + } + + public static String[] carSplit(String carsStr) { + String[] carsList = carsStr.split(","); + return carsList; } + + + } From c0e0378f3a2a26ab9cde61a7e27fa5ee32e05c09 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=EA=B9=80=EC=9A=A9=EC=A7=84?= Date: Mon, 24 Mar 2025 19:20:40 +0900 Subject: [PATCH 03/20] =?UTF-8?q?Application.java=20:=20tryNumInput()=20?= =?UTF-8?q?=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 | 11 +++++++++-- 1 file changed, 9 insertions(+), 2 deletions(-) diff --git a/src/main/java/racingcar/Application.java b/src/main/java/racingcar/Application.java index 59d41bfd..08d2fb44 100644 --- a/src/main/java/racingcar/Application.java +++ b/src/main/java/racingcar/Application.java @@ -7,11 +7,12 @@ public static void main(String[] args) { // TODO: 프로그램 구현 String carsStr = carInput(); String carsList[] = carSplit(carsStr); + int tryNum = tryNumInput(); } public static String carInput() { // 사용자 입력 (자동차 목록) Scanner scanner = new Scanner(System.in); - + System.out.println("경주를 진행할 자동차들을 ','를 기준으로 분리하여 입력해주세요.(이름은 5자 이하만 가능합니다.)"); String cars = scanner.nextLine(); return cars; @@ -22,6 +23,12 @@ public static String[] carSplit(String carsStr) { return carsList; } - + public static int tryNumInput() { + Scanner scanner = new Scanner(System.in); + + System.out.println("몇번의 이동을 할 지 횟수를 입력해주세요."); + int tryNum = scanner.nextInt(); + return tryNum; + } } From 05a224b47b71fb18cd34c43a350a0fec98a70ac0 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=EA=B9=80=EC=9A=A9=EC=A7=84?= Date: Mon, 24 Mar 2025 19:22:14 +0900 Subject: [PATCH 04/20] =?UTF-8?q?tryNumInt()=20=EC=B6=94=EA=B0=80=EC=97=90?= =?UTF-8?q?=20=EB=8C=80=ED=95=9C=20README.md=20=EC=88=98=EC=A0=95=20?= =?UTF-8?q?=EC=B6=94=EA=B0=80=20commit?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- docs/README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/README.md b/docs/README.md index 6f65c112..a2174cf3 100644 --- a/docs/README.md +++ b/docs/README.md @@ -4,7 +4,7 @@ 초간단 자동차 경주 게임을 구현한다. - 각 자동차에 이름을 부여할 수 있다, 자동차 이름은 쉼표(,)를 기준으로 구분하여 입력받는다. O -- 사용자는 몇 번의 이동을 할 것인지를 입력할 수 있어야 한다. +- 사용자는 몇 번의 이동을 할 것인지를 입력할 수 있어야 한다. O - 이름은 5자 이하만 가능하다. 사용자가 잘못된 값을 입력할 경우 `IllegalArgumentException`을 발생시킨 후 애플리케이션은 종료되어야 한다. - 주어진 횟수 동안 n대의 자동차는 전진 또는 멈출 수 있다. - 전진하는 조건은 0에서 9 사이에서 무작위 값을 구한 후 무작위 값이 4 이상일 경우이다. From f797d65de6ca4d5b0e277255b4ce12ca070d0c0d Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=EA=B9=80=EC=9A=A9=EC=A7=84?= Date: Mon, 24 Mar 2025 19:52:53 +0900 Subject: [PATCH 05/20] =?UTF-8?q?Application.java=20:=20=EC=98=88=EC=99=B8?= =?UTF-8?q?=EC=B2=98=EB=A6=AC=20errCheck=5FcarsLists(),=20errCheck=5FtryNu?= =?UTF-8?q?m()=20=EC=B6=94=EA=B0=80?= 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 | 27 ++++++++++++++++++++---- 2 files changed, 24 insertions(+), 5 deletions(-) diff --git a/docs/README.md b/docs/README.md index a2174cf3..4979ad70 100644 --- a/docs/README.md +++ b/docs/README.md @@ -5,7 +5,7 @@ - 각 자동차에 이름을 부여할 수 있다, 자동차 이름은 쉼표(,)를 기준으로 구분하여 입력받는다. O - 사용자는 몇 번의 이동을 할 것인지를 입력할 수 있어야 한다. O -- 이름은 5자 이하만 가능하다. 사용자가 잘못된 값을 입력할 경우 `IllegalArgumentException`을 발생시킨 후 애플리케이션은 종료되어야 한다. +- 예외 처리 : 이름은 5자 이하만 가능하다. 입력 시도 횟수가 마이너스이거나 0일 수 없다. 사용자가 잘못된 값을 입력할 경우 `IllegalArgumentException`을 발생시킨 후 애플리케이션은 종료되어야 한다. O - 주어진 횟수 동안 n대의 자동차는 전진 또는 멈출 수 있다. - 전진하는 조건은 0에서 9 사이에서 무작위 값을 구한 후 무작위 값이 4 이상일 경우이다. - 각 자동차에 이름을 부여할 수 있다. 전진하는 자동차를 출력할 때 자동차 이름을 같이 출력한다. diff --git a/src/main/java/racingcar/Application.java b/src/main/java/racingcar/Application.java index 08d2fb44..af9e5bff 100644 --- a/src/main/java/racingcar/Application.java +++ b/src/main/java/racingcar/Application.java @@ -7,28 +7,47 @@ public static void main(String[] args) { // TODO: 프로그램 구현 String carsStr = carInput(); String carsList[] = carSplit(carsStr); + errCheck_carsList(carsList); int tryNum = tryNumInput(); + errCheck_tryNum(tryNum); } public static String carInput() { // 사용자 입력 (자동차 목록) Scanner scanner = new Scanner(System.in); - System.out.println("경주를 진행할 자동차들을 ','를 기준으로 분리하여 입력해주세요.(이름은 5자 이하만 가능합니다.)"); + System.out.println("경주를 진행할 자동차의 이름을 ','를 기준으로 분리하여 입력해주세요.(이름은 5자 이하만 가능합니다.)"); String cars = scanner.nextLine(); return cars; } - public static String[] carSplit(String carsStr) { + public static String[] carSplit(String carsStr) { // 사용자 한테 입려받은 문자열 "," 기준으로 찢기 String[] carsList = carsStr.split(","); return carsList; } - public static int tryNumInput() { + public static int tryNumInput() { // 전진 시도 횟수 입력받기 Scanner scanner = new Scanner(System.in); System.out.println("몇번의 이동을 할 지 횟수를 입력해주세요."); int tryNum = scanner.nextInt(); return tryNum; } - + + public static void errCheck_carsList(String[] carsList) throws IllegalArgumentException{ // 입력한 차 이름이 5글자 이하인지 체크 + for (String s : carsList) { + if (s.length() > 5) { + throw new IllegalArgumentException("자동차의 이름이 5글자를 넘습니다."); + } + } + return; + } + + public static void errCheck_tryNum(int tryNum) throws IllegalArgumentException{ // 입력한 시도 횟수가 0이거나, 음수인지 체크 + if (tryNum < 0) { + throw new IllegalArgumentException("시도 횟수에 음수 입력"); + } else if (tryNum == 0) { + throw new IllegalArgumentException("시도 횟수에 0 입력"); + } + return; + } } From 64ef695dbd421cf13d7646a2664500c4cfa735ad Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=EA=B9=80=EC=9A=A9=EC=A7=84?= Date: Mon, 24 Mar 2025 20:41:49 +0900 Subject: [PATCH 06/20] =?UTF-8?q?Application.java=20:=20=EC=9E=90=EB=8F=99?= =?UTF-8?q?=EC=B0=A8=20=EB=9E=9C=EB=8D=A4=20=EC=A0=84=EC=A7=84=20=EB=B0=8F?= =?UTF-8?q?=20=EC=B6=9C=EB=A0=A5=20=EA=B5=AC=ED=98=84=20Game(),=20move(),?= =?UTF-8?q?=20randomMove(),=20printEachMove()=20=EC=B6=94=EA=B0=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- docs/README.md | 6 +-- src/main/java/racingcar/Application.java | 49 ++++++++++++++++++++---- 2 files changed, 45 insertions(+), 10 deletions(-) diff --git a/docs/README.md b/docs/README.md index 4979ad70..7ff3453e 100644 --- a/docs/README.md +++ b/docs/README.md @@ -6,9 +6,9 @@ - 각 자동차에 이름을 부여할 수 있다, 자동차 이름은 쉼표(,)를 기준으로 구분하여 입력받는다. O - 사용자는 몇 번의 이동을 할 것인지를 입력할 수 있어야 한다. O - 예외 처리 : 이름은 5자 이하만 가능하다. 입력 시도 횟수가 마이너스이거나 0일 수 없다. 사용자가 잘못된 값을 입력할 경우 `IllegalArgumentException`을 발생시킨 후 애플리케이션은 종료되어야 한다. O -- 주어진 횟수 동안 n대의 자동차는 전진 또는 멈출 수 있다. -- 전진하는 조건은 0에서 9 사이에서 무작위 값을 구한 후 무작위 값이 4 이상일 경우이다. -- 각 자동차에 이름을 부여할 수 있다. 전진하는 자동차를 출력할 때 자동차 이름을 같이 출력한다. +- 주어진 횟수 동안 n대의 자동차는 전진 또는 멈출 수 있다. O +- 전진하는 조건은 0에서 9 사이에서 무작위 값을 구한 후 무작위 값이 4 이상일 경우이다. O +- 각 자동차에 이름을 부여할 수 있다. 전진하는 자동차를 출력할 때 자동차 이름을 같이 출력한다. O - 자동차 경주 게임을 완료한 후 누가 우승했는지를 알려준다. 우승자는 한 명 이상일 수 있다. - 우승자가 여러 명일 경우 쉼표(,)를 이용하여 구분한다. diff --git a/src/main/java/racingcar/Application.java b/src/main/java/racingcar/Application.java index af9e5bff..e819c096 100644 --- a/src/main/java/racingcar/Application.java +++ b/src/main/java/racingcar/Application.java @@ -1,6 +1,7 @@ package racingcar; -import java.util.Scanner; +import camp.nextstep.edu.missionutils.Console; +import camp.nextstep.edu.missionutils.Randoms; public class Application { public static void main(String[] args) { @@ -10,13 +11,12 @@ public static void main(String[] args) { errCheck_carsList(carsList); int tryNum = tryNumInput(); errCheck_tryNum(tryNum); + Game(carsList, tryNum); } public static String carInput() { // 사용자 입력 (자동차 목록) - Scanner scanner = new Scanner(System.in); - System.out.println("경주를 진행할 자동차의 이름을 ','를 기준으로 분리하여 입력해주세요.(이름은 5자 이하만 가능합니다.)"); - String cars = scanner.nextLine(); + String cars = Console.readLine(); return cars; } @@ -26,10 +26,8 @@ public static String[] carSplit(String carsStr) { // 사용자 한테 입려받 } public static int tryNumInput() { // 전진 시도 횟수 입력받기 - Scanner scanner = new Scanner(System.in); - System.out.println("몇번의 이동을 할 지 횟수를 입력해주세요."); - int tryNum = scanner.nextInt(); + int tryNum = Integer.parseInt(Console.readLine()); return tryNum; } @@ -50,4 +48,41 @@ public static void errCheck_tryNum(int tryNum) throws IllegalArgumentException{ } return; } + + public static void Game(String[] carsList, int tryNum) { + int[] moveCnt = new int[carsList.length]; + for (int i = 0; i < carsList.length; i++){ + moveCnt[i] = 0; + } + for (int i = 0; i < tryNum; i++) { + moveCnt = move(carsList, moveCnt); + printEachMove(carsList, moveCnt); + } + } + + public static int[] move(String[] carsList, int[] moveCnt) { + for (int i = 0; i < carsList.length; i++) { + moveCnt = randomMove(moveCnt, i); + } + return moveCnt; + } + + public static int[] randomMove(int[] moveCnt, int i) { + if (Randoms.pickNumberInRange(0,9) >= 4) { + moveCnt[i]++; + } + return moveCnt; + } + + public static void printEachMove(String[] carsList, int[] moveCnt){ + for (int i = 0; i < carsList.length; i++) { + System.out.print(carsList[i] + " : "); + for (int j =0; j < moveCnt[i]; j++){ + System.out.print("-"); + } + System.out.println(); + } + System.out.println(); + } + } From 5b0521fba3243f87f6bdd7a32834b0ee27b784fc Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=EA=B9=80=EC=9A=A9=EC=A7=84?= Date: Mon, 24 Mar 2025 21:21:20 +0900 Subject: [PATCH 07/20] =?UTF-8?q?Application.java=20:=20=EC=9A=B0=EC=8A=B9?= =?UTF-8?q?=EC=9E=90=20=EC=B6=9C=EB=A0=A5=20checkWinner()=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 --- docs/README.md | 4 +-- src/main/java/racingcar/Application.java | 35 +++++++++++++++++++++++- 2 files changed, 36 insertions(+), 3 deletions(-) diff --git a/docs/README.md b/docs/README.md index 7ff3453e..74a3ba6f 100644 --- a/docs/README.md +++ b/docs/README.md @@ -9,8 +9,8 @@ - 주어진 횟수 동안 n대의 자동차는 전진 또는 멈출 수 있다. O - 전진하는 조건은 0에서 9 사이에서 무작위 값을 구한 후 무작위 값이 4 이상일 경우이다. O - 각 자동차에 이름을 부여할 수 있다. 전진하는 자동차를 출력할 때 자동차 이름을 같이 출력한다. O -- 자동차 경주 게임을 완료한 후 누가 우승했는지를 알려준다. 우승자는 한 명 이상일 수 있다. -- 우승자가 여러 명일 경우 쉼표(,)를 이용하여 구분한다. +- 자동차 경주 게임을 완료한 후 누가 우승했는지를 알려준다. 우승자는 한 명 이상일 수 있다. O +- 우승자가 여러 명일 경우 쉼표(,)를 이용하여 구분한다. O ### 입출력 요구 사항 diff --git a/src/main/java/racingcar/Application.java b/src/main/java/racingcar/Application.java index e819c096..06b36ff6 100644 --- a/src/main/java/racingcar/Application.java +++ b/src/main/java/racingcar/Application.java @@ -2,6 +2,8 @@ import camp.nextstep.edu.missionutils.Console; import camp.nextstep.edu.missionutils.Randoms; +import java.util.LinkedList; +import java.util.Queue; public class Application { public static void main(String[] args) { @@ -11,7 +13,10 @@ public static void main(String[] args) { errCheck_carsList(carsList); int tryNum = tryNumInput(); errCheck_tryNum(tryNum); + // 여기까지 입력 + Game(carsList, tryNum); + } public static String carInput() { // 사용자 입력 (자동차 목록) @@ -58,6 +63,14 @@ public static void Game(String[] carsList, int tryNum) { moveCnt = move(carsList, moveCnt); printEachMove(carsList, moveCnt); } + + String[] winner = checkWinner(carsList, moveCnt); + System.out.print("최종 우승자 : "); + for (int i = 0; i < winner.length - 1; i++) { + System.out.print(winner[i] + ", "); + } + System.out.println(winner[winner.length-1]); + } public static int[] move(String[] carsList, int[] moveCnt) { @@ -84,5 +97,25 @@ public static void printEachMove(String[] carsList, int[] moveCnt){ } System.out.println(); } - + + public static String[] checkWinner(String[] carsList, int[] moveCnt) { + Queue winnerQueue = new LinkedList<>(); + int maxValue = 0; + + for (int i = 0; i < moveCnt.length; i++) { + if(moveCnt[i] == maxValue) { + winnerQueue.add(carsList[i]); + } else if (moveCnt[i] > maxValue) { + winnerQueue.clear(); + winnerQueue.add(carsList[i]); + } + } + String[] winner = new String[winnerQueue.size()]; + for (int i = 0; i < winnerQueue.size(); i++) { + winner[i] = winnerQueue.poll(); + } + + return winner; + } + } From f69d33c86bc3b182bb9b5223095d91ba71acf508 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=EA=B9=80=EC=9A=A9=EC=A7=84?= Date: Mon, 24 Mar 2025 22:31:05 +0900 Subject: [PATCH 08/20] =?UTF-8?q?Application.java=20:=20=EC=9A=B0=EC=8A=B9?= =?UTF-8?q?=EC=9E=90=20=EC=B6=9C=EB=A0=A5=20=EC=8B=9C=20null=20=EC=B6=9C?= =?UTF-8?q?=EB=A0=A5=EB=90=98=EB=8A=94=20=ED=98=84=EC=83=81=20=EC=88=98?= =?UTF-8?q?=EC=A0=95,=20checkWinner()=20=ED=81=90=20=EB=8C=80=EC=8B=A0=20?= =?UTF-8?q?=EB=B0=B0=EC=97=B4=20=EC=82=AC=EC=9A=A9?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- build.gradle | 2 +- src/main/java/racingcar/Application.java | 46 ++++++++++++++++++++---- 2 files changed, 41 insertions(+), 7 deletions(-) diff --git a/build.gradle b/build.gradle index 15f33525..82925122 100644 --- a/build.gradle +++ b/build.gradle @@ -22,4 +22,4 @@ java { test { useJUnitPlatform() -} +} \ No newline at end of file diff --git a/src/main/java/racingcar/Application.java b/src/main/java/racingcar/Application.java index 06b36ff6..43a78fa3 100644 --- a/src/main/java/racingcar/Application.java +++ b/src/main/java/racingcar/Application.java @@ -2,8 +2,9 @@ import camp.nextstep.edu.missionutils.Console; import camp.nextstep.edu.missionutils.Randoms; -import java.util.LinkedList; -import java.util.Queue; +// import java.util.LinkedList; +// import java.util.Queue; +import java.util.Arrays; public class Application { public static void main(String[] args) { @@ -66,10 +67,17 @@ public static void Game(String[] carsList, int tryNum) { String[] winner = checkWinner(carsList, moveCnt); System.out.print("최종 우승자 : "); - for (int i = 0; i < winner.length - 1; i++) { + int winnerCnt = 0; + for(int i=0; i < winner.length; i++) { + if (winner[i] == null){ + break; + } + winnerCnt++; + } + for (int i = 0; i < winnerCnt-1; i++) { System.out.print(winner[i] + ", "); } - System.out.println(winner[winner.length-1]); + System.out.println(winner[winnerCnt-1]); } @@ -99,6 +107,7 @@ public static void printEachMove(String[] carsList, int[] moveCnt){ } public static String[] checkWinner(String[] carsList, int[] moveCnt) { + /* Queue winnerQueue = new LinkedList<>(); int maxValue = 0; @@ -108,13 +117,38 @@ public static String[] checkWinner(String[] carsList, int[] moveCnt) { } else if (moveCnt[i] > maxValue) { winnerQueue.clear(); winnerQueue.add(carsList[i]); + maxValue = moveCnt[i]; } } + System.out.println("winnerQueue = " + winnerQueue.size()); String[] winner = new String[winnerQueue.size()]; - for (int i = 0; i < winnerQueue.size(); i++) { - winner[i] = winnerQueue.poll(); + + for (int i = 0; i < winnerQueue.size() + 1; i++) { + winner[i] = winnerQueue.remove(); + } + System.out.println("winner = " + winner.length); + for (int i = 0; i < winner.length; i++) { + System.out.print(winner[i] + " "); + } + */ + int maxValue = 0; + int cnt = 0; + String[] winner = new String[moveCnt.length]; + + for (int i = 0; i < moveCnt.length; i++) { + if(moveCnt[i] == maxValue) { + winner[cnt] = carsList[i]; + cnt++; + } else if (moveCnt[i] > maxValue) { + Arrays.fill(winner, null); + cnt = 0; + winner[cnt] = carsList[i]; + cnt++; + maxValue = moveCnt[i]; + } } + return winner; } From 64a2adfcc9a4b17c3738e42a1155fa7b019507d1 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=EA=B9=80=EC=9A=A9=EC=A7=84?= Date: Tue, 25 Mar 2025 11:54:48 +0900 Subject: [PATCH 09/20] =?UTF-8?q?README.md=20=EC=88=98=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- docs/README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/README.md b/docs/README.md index 74a3ba6f..6d4523c8 100644 --- a/docs/README.md +++ b/docs/README.md @@ -10,7 +10,7 @@ - 전진하는 조건은 0에서 9 사이에서 무작위 값을 구한 후 무작위 값이 4 이상일 경우이다. O - 각 자동차에 이름을 부여할 수 있다. 전진하는 자동차를 출력할 때 자동차 이름을 같이 출력한다. O - 자동차 경주 게임을 완료한 후 누가 우승했는지를 알려준다. 우승자는 한 명 이상일 수 있다. O -- 우승자가 여러 명일 경우 쉼표(,)를 이용하여 구분한다. O +- 우승자가 여러 명일 경우 쉼표(,)를 이용하여 구분한다. O ### 입출력 요구 사항 From 0a129d5ce30d18f6de3e4ce51bf81ebe2751f946 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=EA=B9=80=EC=9A=A9=EC=A7=84?= Date: Tue, 1 Apr 2025 01:47:43 +0900 Subject: [PATCH 10/20] =?UTF-8?q?docs:=202=EC=A3=BC=EC=B0=A8=20=EC=BD=94?= =?UTF-8?q?=EB=93=9C=20=EB=A6=AC=ED=8C=A9=ED=86=A0=EB=A7=81=20=EA=B4=80?= =?UTF-8?q?=EB=A0=A8=20README.md=20=EC=88=98=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- docs/README.md | 16 +++++++++++++++- 1 file changed, 15 insertions(+), 1 deletion(-) diff --git a/docs/README.md b/docs/README.md index 6d4523c8..f36c33a5 100644 --- a/docs/README.md +++ b/docs/README.md @@ -65,4 +65,18 @@ jun : --- ## 과제 진행 요구 사항 - **기능을 구현하기 전 `docs/README.md`에 구현할 기능 목록을 정리**해 추가한다. -- **Git의 커밋 단위는 앞 단계에서 `docs/README.md`에 정리한 기능 목록 단위**로 추가한다. \ No newline at end of file +- **Git의 커밋 단위는 앞 단계에서 `docs/README.md`에 정리한 기능 목록 단위**로 추가한다. + +------------------------------------ +# 2주차 - Refactoring + +## 기능 요구 사항 + +- 사용하지 않는 코드 삭제 +- 적합하지 않은 변수명 변경 +- 쓸데없는 개행 정리 +- carSplit() 매서드에서 새로운 배열에 넣었다가 return 하지 않고 바로 return 하도록 수정 +- for-each 문 사용 시 변수명 의미있는 변수명으로 수정 +- 예외처리 시 매서드 명 validate(검증하다) 이용해서 변경 +- 자동차 움직임 관리를 Car 클래스로 분리해서 만들어보기 +- 코드 depth 3 넘는지 확인 From 14c3f4d1fa3b4a0caac975f2220d645393bebeb1 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=EA=B9=80=EC=9A=A9=EC=A7=84?= Date: Tue, 1 Apr 2025 01:56:31 +0900 Subject: [PATCH 11/20] =?UTF-8?q?refactor:=20main/java/racingcar/Applicati?= =?UTF-8?q?on=20=ED=81=B4=EB=9E=98=EC=8A=A4=20=EC=82=AC=EC=9A=A9=ED=95=98?= =?UTF-8?q?=EC=A7=80=20=EC=95=8A=EB=8A=94=20=EC=BD=94=EB=93=9C=20=EC=82=AD?= =?UTF-8?q?=EC=A0=9C?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/main/java/racingcar/Application.java | 27 ------------------------ 1 file changed, 27 deletions(-) diff --git a/src/main/java/racingcar/Application.java b/src/main/java/racingcar/Application.java index 43a78fa3..8db02215 100644 --- a/src/main/java/racingcar/Application.java +++ b/src/main/java/racingcar/Application.java @@ -2,8 +2,6 @@ import camp.nextstep.edu.missionutils.Console; import camp.nextstep.edu.missionutils.Randoms; -// import java.util.LinkedList; -// import java.util.Queue; import java.util.Arrays; public class Application { @@ -14,7 +12,6 @@ public static void main(String[] args) { errCheck_carsList(carsList); int tryNum = tryNumInput(); errCheck_tryNum(tryNum); - // 여기까지 입력 Game(carsList, tryNum); @@ -107,30 +104,6 @@ public static void printEachMove(String[] carsList, int[] moveCnt){ } public static String[] checkWinner(String[] carsList, int[] moveCnt) { - /* - Queue winnerQueue = new LinkedList<>(); - int maxValue = 0; - - for (int i = 0; i < moveCnt.length; i++) { - if(moveCnt[i] == maxValue) { - winnerQueue.add(carsList[i]); - } else if (moveCnt[i] > maxValue) { - winnerQueue.clear(); - winnerQueue.add(carsList[i]); - maxValue = moveCnt[i]; - } - } - System.out.println("winnerQueue = " + winnerQueue.size()); - String[] winner = new String[winnerQueue.size()]; - - for (int i = 0; i < winnerQueue.size() + 1; i++) { - winner[i] = winnerQueue.remove(); - } - System.out.println("winner = " + winner.length); - for (int i = 0; i < winner.length; i++) { - System.out.print(winner[i] + " "); - } - */ int maxValue = 0; int cnt = 0; String[] winner = new String[moveCnt.length]; From 7a9a4046b8c9bf2a720199199206415507d00331 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=EA=B9=80=EC=9A=A9=EC=A7=84?= Date: Tue, 1 Apr 2025 02:02:43 +0900 Subject: [PATCH 12/20] =?UTF-8?q?refactor:=20main/java/racingcar/Applicati?= =?UTF-8?q?on=20=ED=81=B4=EB=9E=98=EC=8A=A4=20carsStr=20->=20inputCarsName?= =?UTF-8?q?=20=EB=B3=80=EC=88=98=EB=AA=85=20=EB=B3=80=EA=B2=BD?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/main/java/racingcar/Application.java | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/main/java/racingcar/Application.java b/src/main/java/racingcar/Application.java index 8db02215..866e168d 100644 --- a/src/main/java/racingcar/Application.java +++ b/src/main/java/racingcar/Application.java @@ -7,8 +7,8 @@ public class Application { public static void main(String[] args) { // TODO: 프로그램 구현 - String carsStr = carInput(); - String carsList[] = carSplit(carsStr); + String inputCarsName = carInput(); + String carsList[] = carSplit(inputCarsName); errCheck_carsList(carsList); int tryNum = tryNumInput(); errCheck_tryNum(tryNum); From ddb116e275bac6794d6df4c7a1368f849dd2c15e Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=EA=B9=80=EC=9A=A9=EC=A7=84?= Date: Tue, 1 Apr 2025 02:04:54 +0900 Subject: [PATCH 13/20] =?UTF-8?q?refactor:=20main/java/racingcar/Applicati?= =?UTF-8?q?on=20=ED=95=84=EC=9A=94=EC=97=86=EB=8A=94=20=EA=B0=9C=ED=96=89?= =?UTF-8?q?=20=EC=82=AD=EC=A0=9C?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/main/java/racingcar/Application.java | 5 ----- 1 file changed, 5 deletions(-) diff --git a/src/main/java/racingcar/Application.java b/src/main/java/racingcar/Application.java index 866e168d..d0d2c5c4 100644 --- a/src/main/java/racingcar/Application.java +++ b/src/main/java/racingcar/Application.java @@ -12,9 +12,7 @@ public static void main(String[] args) { errCheck_carsList(carsList); int tryNum = tryNumInput(); errCheck_tryNum(tryNum); - Game(carsList, tryNum); - } public static String carInput() { // 사용자 입력 (자동차 목록) @@ -107,7 +105,6 @@ public static String[] checkWinner(String[] carsList, int[] moveCnt) { int maxValue = 0; int cnt = 0; String[] winner = new String[moveCnt.length]; - for (int i = 0; i < moveCnt.length; i++) { if(moveCnt[i] == maxValue) { winner[cnt] = carsList[i]; @@ -120,8 +117,6 @@ public static String[] checkWinner(String[] carsList, int[] moveCnt) { maxValue = moveCnt[i]; } } - - return winner; } From a7aaa564f9acff69f343c76425cab291d58ec9c2 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=EA=B9=80=EC=9A=A9=EC=A7=84?= Date: Tue, 1 Apr 2025 02:08:07 +0900 Subject: [PATCH 14/20] =?UTF-8?q?refactor:=20main/java/racingcar/Applicati?= =?UTF-8?q?on=20=ED=81=B4=EB=9E=98=EC=8A=A4=20carSplit()=20=EB=A9=94?= =?UTF-8?q?=EC=84=9C=EB=93=9C=EC=97=90=EC=84=9C=20=EB=B0=94=EB=A1=9C=20ret?= =?UTF-8?q?urn=20=ED=95=98=EB=8F=84=EB=A1=9D=20=EC=88=98=EC=A0=95?= 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, 1 insertion(+), 2 deletions(-) diff --git a/src/main/java/racingcar/Application.java b/src/main/java/racingcar/Application.java index d0d2c5c4..a16aa5e1 100644 --- a/src/main/java/racingcar/Application.java +++ b/src/main/java/racingcar/Application.java @@ -22,8 +22,7 @@ public static String carInput() { // 사용자 입력 (자동차 목록) } public static String[] carSplit(String carsStr) { // 사용자 한테 입려받은 문자열 "," 기준으로 찢기 - String[] carsList = carsStr.split(","); - return carsList; + return carsStr.split(","); } public static int tryNumInput() { // 전진 시도 횟수 입력받기 From 18f0ae7268c38238885d224a001e62c174f138a3 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=EA=B9=80=EC=9A=A9=EC=A7=84?= Date: Tue, 1 Apr 2025 02:10:44 +0900 Subject: [PATCH 15/20] =?UTF-8?q?refactor:=20main/java/racingcar/Applicati?= =?UTF-8?q?on=20=ED=81=B4=EB=9E=98=EC=8A=A4=20errCheck=5FcarsList()=20?= =?UTF-8?q?=EB=A7=A4=EC=84=9C=EB=93=9C=20for-each=20=EB=AC=B8=20=EB=B3=80?= =?UTF-8?q?=EC=88=98=EB=AA=85=20=EB=B3=80=EA=B2=BD?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/main/java/racingcar/Application.java | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/main/java/racingcar/Application.java b/src/main/java/racingcar/Application.java index a16aa5e1..d95f5b61 100644 --- a/src/main/java/racingcar/Application.java +++ b/src/main/java/racingcar/Application.java @@ -32,8 +32,8 @@ public static int tryNumInput() { // 전진 시도 횟수 입력받기 } public static void errCheck_carsList(String[] carsList) throws IllegalArgumentException{ // 입력한 차 이름이 5글자 이하인지 체크 - for (String s : carsList) { - if (s.length() > 5) { + for (String carName : carsList) { + if (carName.length() > 5) { throw new IllegalArgumentException("자동차의 이름이 5글자를 넘습니다."); } } From 56e474694b9a814f8d794df61fa20618f5bdd852 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=EA=B9=80=EC=9A=A9=EC=A7=84?= Date: Tue, 1 Apr 2025 02:21:51 +0900 Subject: [PATCH 16/20] =?UTF-8?q?refactor:=20main/java/racingcar/Applicati?= =?UTF-8?q?on=20=ED=81=B4=EB=9E=98=EC=8A=A4=20=EC=98=88=EC=99=B8=EC=B2=98?= =?UTF-8?q?=EB=A6=AC=20=EB=A7=A4=EC=84=9C=EB=93=9C=20=EB=AA=85=20=EC=88=98?= =?UTF-8?q?=EC=A0=95=20errCheck=5FcarsList()=20->=20validateCarsList()=20e?= =?UTF-8?q?rrCheck=5FtryNum()=20->=20validateTryNum()?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/main/java/racingcar/Application.java | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/src/main/java/racingcar/Application.java b/src/main/java/racingcar/Application.java index d95f5b61..62fc7e31 100644 --- a/src/main/java/racingcar/Application.java +++ b/src/main/java/racingcar/Application.java @@ -9,9 +9,9 @@ public static void main(String[] args) { // TODO: 프로그램 구현 String inputCarsName = carInput(); String carsList[] = carSplit(inputCarsName); - errCheck_carsList(carsList); + validateCarsList(carsList); int tryNum = tryNumInput(); - errCheck_tryNum(tryNum); + validateTryNum(tryNum); Game(carsList, tryNum); } @@ -31,7 +31,7 @@ public static int tryNumInput() { // 전진 시도 횟수 입력받기 return tryNum; } - public static void errCheck_carsList(String[] carsList) throws IllegalArgumentException{ // 입력한 차 이름이 5글자 이하인지 체크 + public static void validateCarsList(String[] carsList) throws IllegalArgumentException{ // 입력한 차 이름이 5글자 이하인지 체크 for (String carName : carsList) { if (carName.length() > 5) { throw new IllegalArgumentException("자동차의 이름이 5글자를 넘습니다."); @@ -40,7 +40,7 @@ public static void errCheck_carsList(String[] carsList) throws IllegalArgumentEx return; } - public static void errCheck_tryNum(int tryNum) throws IllegalArgumentException{ // 입력한 시도 횟수가 0이거나, 음수인지 체크 + public static void validateTryNum(int tryNum) throws IllegalArgumentException{ // 입력한 시도 횟수가 0이거나, 음수인지 체크 if (tryNum < 0) { throw new IllegalArgumentException("시도 횟수에 음수 입력"); } else if (tryNum == 0) { From 432caf00208cb6acfb9620e00ca5b032b3a46fd3 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=EA=B9=80=EC=9A=A9=EC=A7=84?= Date: Tue, 1 Apr 2025 02:29:23 +0900 Subject: [PATCH 17/20] =?UTF-8?q?refactor:=20Car=20=ED=81=B4=EB=9E=98?= =?UTF-8?q?=EC=8A=A4=20=EC=83=9D=EC=84=B1?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/test/java/racingcar/Car.java | 4 ++++ 1 file changed, 4 insertions(+) create mode 100644 src/test/java/racingcar/Car.java diff --git a/src/test/java/racingcar/Car.java b/src/test/java/racingcar/Car.java new file mode 100644 index 00000000..246c8e5a --- /dev/null +++ b/src/test/java/racingcar/Car.java @@ -0,0 +1,4 @@ +package racingcar; + +public class Car { +} From 0196b5c61c83064f8fffb290dc046a73c3f4ec47 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=EA=B9=80=EC=9A=A9=EC=A7=84?= Date: Tue, 1 Apr 2025 02:58:01 +0900 Subject: [PATCH 18/20] =?UTF-8?q?refactor:=20Car=20=ED=81=B4=EB=9E=98?= =?UTF-8?q?=EC=8A=A4=20=EC=83=9D=EC=84=B1=20=EC=9C=84=EC=B9=98=20=EB=B3=80?= =?UTF-8?q?=EA=B2=BD?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/main/java/racingcar/Application.java | 13 ++++++------- src/main/java/racingcar/Car.java | 11 +++++++++++ src/test/java/racingcar/Car.java | 4 ---- 3 files changed, 17 insertions(+), 11 deletions(-) create mode 100644 src/main/java/racingcar/Car.java delete mode 100644 src/test/java/racingcar/Car.java diff --git a/src/main/java/racingcar/Application.java b/src/main/java/racingcar/Application.java index 62fc7e31..9ebc1a75 100644 --- a/src/main/java/racingcar/Application.java +++ b/src/main/java/racingcar/Application.java @@ -7,18 +7,16 @@ public class Application { public static void main(String[] args) { // TODO: 프로그램 구현 - String inputCarsName = carInput(); - String carsList[] = carSplit(inputCarsName); - validateCarsList(carsList); + carsInfoInput(); int tryNum = tryNumInput(); - validateTryNum(tryNum); Game(carsList, tryNum); } - public static String carInput() { // 사용자 입력 (자동차 목록) + public static void carsInfoInput() { // 사용자 입력 (자동차 목록) System.out.println("경주를 진행할 자동차의 이름을 ','를 기준으로 분리하여 입력해주세요.(이름은 5자 이하만 가능합니다.)"); - String cars = Console.readLine(); - return cars; + String[] carList = carSplit(Console.readLine()); + validateCarsList(carList); + Car[] cars = new Car[carList.length]; } public static String[] carSplit(String carsStr) { // 사용자 한테 입려받은 문자열 "," 기준으로 찢기 @@ -28,6 +26,7 @@ public static String[] carSplit(String carsStr) { // 사용자 한테 입려받 public static int tryNumInput() { // 전진 시도 횟수 입력받기 System.out.println("몇번의 이동을 할 지 횟수를 입력해주세요."); int tryNum = Integer.parseInt(Console.readLine()); + validateTryNum(tryNum); return tryNum; } diff --git a/src/main/java/racingcar/Car.java b/src/main/java/racingcar/Car.java new file mode 100644 index 00000000..7348df13 --- /dev/null +++ b/src/main/java/racingcar/Car.java @@ -0,0 +1,11 @@ +package racingcar; + +public class Car { + String carName; + int score; + + Car(String carName, int score) { + this.carName = carName; + this.score = score; + } +} diff --git a/src/test/java/racingcar/Car.java b/src/test/java/racingcar/Car.java deleted file mode 100644 index 246c8e5a..00000000 --- a/src/test/java/racingcar/Car.java +++ /dev/null @@ -1,4 +0,0 @@ -package racingcar; - -public class Car { -} From 20e0647b92d5f7dc07526a99fdac21f68d237252 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=EA=B9=80=EC=9A=A9=EC=A7=84?= Date: Tue, 1 Apr 2025 03:02:37 +0900 Subject: [PATCH 19/20] =?UTF-8?q?refactor:=20carsInfoInput()=20=EB=A9=94?= =?UTF-8?q?=EC=84=9C=EB=93=9C=20Car=20=ED=81=B4=EB=9E=98=EC=8A=A4=20?= =?UTF-8?q?=EC=9D=B4=EC=9A=A9=ED=95=B4=EC=84=9C=20=EC=9E=85=EB=A0=A5?= =?UTF-8?q?=EB=B0=9B=EB=8F=84=EB=A1=9D=20=EC=88=98=EC=A0=95?= 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, 3 insertions(+) diff --git a/src/main/java/racingcar/Application.java b/src/main/java/racingcar/Application.java index 9ebc1a75..e77689f4 100644 --- a/src/main/java/racingcar/Application.java +++ b/src/main/java/racingcar/Application.java @@ -17,6 +17,9 @@ public static void carsInfoInput() { // 사용자 입력 (자동차 목록) String[] carList = carSplit(Console.readLine()); validateCarsList(carList); Car[] cars = new Car[carList.length]; + for (int i = 0; i < carList.length; i++) { + cars[i] = new Car(carList[i], 0); + } } public static String[] carSplit(String carsStr) { // 사용자 한테 입려받은 문자열 "," 기준으로 찢기 From bfae2c6e160cd9530aba5b5a7cdf319702142e46 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=EA=B9=80=EC=9A=A9=EC=A7=84?= Date: Tue, 1 Apr 2025 04:30:09 +0900 Subject: [PATCH 20/20] =?UTF-8?q?refactor:=20Car=20=ED=81=B4=EB=9E=98?= =?UTF-8?q?=EC=8A=A4=20=ED=99=9C=EC=9A=A9=ED=95=B4=EC=84=9C=20=EB=A6=AC?= =?UTF-8?q?=ED=8C=A9=ED=86=A0=EB=A7=81?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/main/java/racingcar/Application.java | 111 +++++++++++------------ src/main/java/racingcar/Car.java | 21 +++++ 2 files changed, 72 insertions(+), 60 deletions(-) diff --git a/src/main/java/racingcar/Application.java b/src/main/java/racingcar/Application.java index e77689f4..ae664728 100644 --- a/src/main/java/racingcar/Application.java +++ b/src/main/java/racingcar/Application.java @@ -2,28 +2,27 @@ import camp.nextstep.edu.missionutils.Console; import camp.nextstep.edu.missionutils.Randoms; -import java.util.Arrays; + +import java.util.LinkedList; +import java.util.Queue; public class Application { public static void main(String[] args) { // TODO: 프로그램 구현 - carsInfoInput(); + Car[] cars = carsInfoInput(); int tryNum = tryNumInput(); - Game(carsList, tryNum); + Game(cars, tryNum); } - public static void carsInfoInput() { // 사용자 입력 (자동차 목록) + public static Car[] carsInfoInput() { // 사용자 입력 (자동차 목록) System.out.println("경주를 진행할 자동차의 이름을 ','를 기준으로 분리하여 입력해주세요.(이름은 5자 이하만 가능합니다.)"); - String[] carList = carSplit(Console.readLine()); + String[] carList = Console.readLine().split(","); validateCarsList(carList); Car[] cars = new Car[carList.length]; for (int i = 0; i < carList.length; i++) { cars[i] = new Car(carList[i], 0); } - } - - public static String[] carSplit(String carsStr) { // 사용자 한테 입려받은 문자열 "," 기준으로 찢기 - return carsStr.split(","); + return cars; } public static int tryNumInput() { // 전진 시도 횟수 입력받기 @@ -51,74 +50,66 @@ public static void validateTryNum(int tryNum) throws IllegalArgumentException{ / return; } - public static void Game(String[] carsList, int tryNum) { - int[] moveCnt = new int[carsList.length]; - for (int i = 0; i < carsList.length; i++){ - moveCnt[i] = 0; - } - for (int i = 0; i < tryNum; i++) { - moveCnt = move(carsList, moveCnt); - printEachMove(carsList, moveCnt); - } - - String[] winner = checkWinner(carsList, moveCnt); - System.out.print("최종 우승자 : "); - int winnerCnt = 0; - for(int i=0; i < winner.length; i++) { - if (winner[i] == null){ - break; - } - winnerCnt++; - } - for (int i = 0; i < winnerCnt-1; i++) { - System.out.print(winner[i] + ", "); + public static void Game(Car[] cars, int tryNum) { + for(int i = 0; i < tryNum; i++) { + moveAndDisplayStatus(cars); + System.out.println(); } - System.out.println(winner[winnerCnt-1]); - + displayWinner(cars); } - public static int[] move(String[] carsList, int[] moveCnt) { - for (int i = 0; i < carsList.length; i++) { - moveCnt = randomMove(moveCnt, i); + public static void moveAndDisplayStatus(Car[] cars) { + for (int i = 0; i < cars.length; i++) { + randomMove(cars[i]); + } + for (Car car : cars) { + car.displayCarStatus(); } - return moveCnt; } - public static int[] randomMove(int[] moveCnt, int i) { + public static void randomMove(Car car) { if (Randoms.pickNumberInRange(0,9) >= 4) { - moveCnt[i]++; + car.go(); } - return moveCnt; } - public static void printEachMove(String[] carsList, int[] moveCnt){ - for (int i = 0; i < carsList.length; i++) { - System.out.print(carsList[i] + " : "); - for (int j =0; j < moveCnt[i]; j++){ - System.out.print("-"); + public static void displayWinner(Car[] cars) { + checkWinner(cars); + + Queue q = new LinkedList<>(); + + for (Car car : cars) { + if(car.winnerFlag == 1) { + q.add(car); } - System.out.println(); } - System.out.println(); + + System.out.print("최종 우승자 : "); + for (int i = 0; i < q.size() - 1; i++) { + System.out.print(q.remove().carName + ", "); + } + System.out.println(q.remove().carName); } - public static String[] checkWinner(String[] carsList, int[] moveCnt) { + + public static void checkWinner(Car[] cars) { int maxValue = 0; - int cnt = 0; - String[] winner = new String[moveCnt.length]; - for (int i = 0; i < moveCnt.length; i++) { - if(moveCnt[i] == maxValue) { - winner[cnt] = carsList[i]; - cnt++; - } else if (moveCnt[i] > maxValue) { - Arrays.fill(winner, null); - cnt = 0; - winner[cnt] = carsList[i]; - cnt++; - maxValue = moveCnt[i]; + + for (Car car : cars) { + if(maxValue < car.score) { + maxValue = car.score; + clearWinnerList(cars); + car.checkWinnerFlag(); + } else if (maxValue == car.score) { + car.checkWinnerFlag(); } } - return winner; + } + + public static void clearWinnerList(Car[] cars) { + for (Car car : cars) { + car.clearWinnerFlag(); + } } } diff --git a/src/main/java/racingcar/Car.java b/src/main/java/racingcar/Car.java index 7348df13..9183f4c1 100644 --- a/src/main/java/racingcar/Car.java +++ b/src/main/java/racingcar/Car.java @@ -3,9 +3,30 @@ public class Car { String carName; int score; + int winnerFlag; Car(String carName, int score) { this.carName = carName; this.score = score; } + + void go() { + score++; + } + + void displayCarStatus() { + System.out.print(carName + " : "); + for (int i = 0; i < score; i++) { + System.out.print("-"); + } + System.out.println(); + } + + void checkWinnerFlag() { + winnerFlag = 1; + } + + void clearWinnerFlag() { + winnerFlag = 0; + } }