From 8503dac871504e2658577f581452f38775adada5 Mon Sep 17 00:00:00 2001 From: Sunghyeon Date: Mon, 28 Oct 2024 23:38:54 +0900 Subject: [PATCH 1/5] =?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=EB=8F=99=EC=9E=91=20=ED=9A=9F=EC=88=98?= =?UTF-8?q?=20=EC=9E=85=EB=A0=A5?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- README.md | 45 ++++++++++++++++++++++++ src/main/kotlin/racingcar/Application.kt | 29 ++++++++++++++- 2 files changed, 73 insertions(+), 1 deletion(-) diff --git a/README.md b/README.md index 62fa463c..dd466084 100644 --- a/README.md +++ b/README.md @@ -1 +1,46 @@ # kotlin-racingcar-precourse + +### 학습 목표 +-여러 역할을 수행하는 큰 함수를 단일 역할을 수행하는 작은 함수로 분리한다. +- 테스트 도구를 사용하는 방법을 배우고 프로그램이 제대로 작동하는지 테스트한다. +- 1주차 공통 피드백을 반영 + +### 회고 +- 지원서에 작성한 목표를 얼마나 달성하고 있다고 생각하나요? 그 이유는 무엇인가요? +- 지원서에 작성한 목표를 변경해야 한다고 생각하시나요? 그렇다면 그 이유와 어떤 목표로 변경하고 싶으신가요? +- 프리코스를 진행하면서 눈에 띄는 변화나 깨달은 점이 있나요? + + +### 기능 요구사항 +초간단 자동차 경주 게임을 구현한다. + +- 주어진 횟수 동안 n대의 자동차는 전진 또는 멈출 수 있다. +- 각 자동차에 이름을 부여할 수 있다. 전진하는 자동차를 출력할 때 자동차 이름을 같이 출력한다. +- 자동차 이름은 쉼표(,)를 기준으로 구분하며 이름은 5자 이하만 가능하다. +- 사용자는 몇 번의 이동을 할 것인지를 입력할 수 있어야 한다. +- 전진하는 조건은 0에서 9 사이에서 무작위 값을 구한 후 무작위 값이 4 이상일 경우이다. +- 자동차 경주 게임을 완료한 후 누가 우승했는지를 알려준다. 우승자는 한 명 이상일 수 있다. +- 우승자가 여러 명일 경우 쉼표(,)를 이용하여 구분한다. +- 사용자가 잘못된 값을 입력할 경우 IllegalArgumentException을 발생시킨 후 애플리케이션은 종료되어야 한다. + +### 입출력 요구 사항 +입력 +- 경주할 자동차 이름 +- 이름은 쉼표(,) 기준으로 구분 + ex) pobi,woni,jun +- 시도할 횟수 + 5 + +출력 +- 차수별 실행 결과 + pobi : -- + woni : ---- + jun : --- +- 단독 우승자 안내 문구 + 최종 우승자 : pobi +- 공동 우승자 안내 문구 + 최종 우승자 : pobi, jun + + + + diff --git a/src/main/kotlin/racingcar/Application.kt b/src/main/kotlin/racingcar/Application.kt index 0d8f3a79..0d3fd3bb 100644 --- a/src/main/kotlin/racingcar/Application.kt +++ b/src/main/kotlin/racingcar/Application.kt @@ -1,5 +1,32 @@ package racingcar +import camp.nextstep.edu.missionutils.Console + +var input: List? = null +var num = 0 +var runSizeList = mutableListOf() + fun main() { - // TODO: 프로그램 구현 + inputCar() +} + +// 입력 받기 +private fun inputCar() { + println("경주할 자동차 이름을 입력하세요.(이름은 쉼표(,) 기준으로 구분)") + input = Console.readLine().split(",") + + println("시도할 횟수는 몇 회인가요?") + num = Console.readLine().toInt() + + // 입력 검사하기 + if (input.isNullOrEmpty()) { + throw IllegalArgumentException() + } + + input!!.forEach { + if (it.length > 5) { + throw IllegalArgumentException("이름은 5자보다 짧게 입력해주세요") + } + } + runSizeList = MutableList(input!!.size) { 0 } } From df517fdaf9fda70aa914b64c5ec3edeb61af8b53 Mon Sep 17 00:00:00 2001 From: Sunghyeon Date: Mon, 28 Oct 2024 23:39:50 +0900 Subject: [PATCH 2/5] =?UTF-8?q?feat=20:=20=EC=9E=90=EB=8F=99=EC=B0=A8=20?= =?UTF-8?q?=EA=B2=BD=EC=A3=BC=20=EB=A1=9C=EC=A7=81?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/main/kotlin/racingcar/Application.kt | 20 ++++++++++++++++++++ 1 file changed, 20 insertions(+) diff --git a/src/main/kotlin/racingcar/Application.kt b/src/main/kotlin/racingcar/Application.kt index 0d3fd3bb..71f6fcb9 100644 --- a/src/main/kotlin/racingcar/Application.kt +++ b/src/main/kotlin/racingcar/Application.kt @@ -1,6 +1,7 @@ package racingcar import camp.nextstep.edu.missionutils.Console +import camp.nextstep.edu.missionutils.Randoms var input: List? = null var num = 0 @@ -8,6 +9,7 @@ var runSizeList = mutableListOf() fun main() { inputCar() + raceCar() } // 입력 받기 @@ -30,3 +32,21 @@ private fun inputCar() { } runSizeList = MutableList(input!!.size) { 0 } } + +// 자동차 경주 로직 +private fun raceCar() { + println("실행 결과") + repeat(num) { + // 출력 받기 + input?.forEachIndexed { index, name -> + val run = Randoms.pickNumberInRange(0, 9) + if (run >= 4) { + runSizeList[index] += 1 + println("$name : ${"-".repeat(runSizeList[index])}") + } else { + println("$name : ${"-".repeat(runSizeList[index])}") + } + } + println() + } +} From df461e7451d6379a8c1b21dbf247960773b2a468 Mon Sep 17 00:00:00 2001 From: Sunghyeon Date: Mon, 28 Oct 2024 23:40:37 +0900 Subject: [PATCH 3/5] =?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?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/main/kotlin/racingcar/Application.kt | 17 +++++++++++++++++ 1 file changed, 17 insertions(+) diff --git a/src/main/kotlin/racingcar/Application.kt b/src/main/kotlin/racingcar/Application.kt index 71f6fcb9..ded6eea6 100644 --- a/src/main/kotlin/racingcar/Application.kt +++ b/src/main/kotlin/racingcar/Application.kt @@ -2,6 +2,7 @@ package racingcar import camp.nextstep.edu.missionutils.Console import camp.nextstep.edu.missionutils.Randoms +import java.util.Collections.max var input: List? = null var num = 0 @@ -10,6 +11,7 @@ var runSizeList = mutableListOf() fun main() { inputCar() raceCar() + printWinner() } // 입력 받기 @@ -50,3 +52,18 @@ private fun raceCar() { println() } } + +// 우승자 출력하기 +private fun printWinner() { + // 최대값 저장 + val maxRun = max(runSizeList) + // 우승자 리스트 + val winnerList = + runSizeList + .mapIndexedNotNull { index, it -> + if (it == maxRun) index else null + }.map { input!![it] } + + // 우승자 리스트 출력 + println("최종 우승자 : ${winnerList.joinToString(",")}") +} From a0042780b0c59299e91f1fbdf5ac2ca1185cf478 Mon Sep 17 00:00:00 2001 From: Sunghyeon Date: Mon, 28 Oct 2024 23:41:25 +0900 Subject: [PATCH 4/5] =?UTF-8?q?feat:=20=EC=9E=85=EB=A0=A5=20,=20=EC=B6=9C?= =?UTF-8?q?=EB=A0=A5,=20=EB=8F=99=EC=9E=91=20=ED=95=A8=EC=88=98=EB=A5=BC?= =?UTF-8?q?=20=ED=95=A8=EC=88=98=EB=A1=9C=20=EB=AC=B6=EA=B8=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/main/kotlin/racingcar/Application.kt | 10 +++++++--- 1 file changed, 7 insertions(+), 3 deletions(-) diff --git a/src/main/kotlin/racingcar/Application.kt b/src/main/kotlin/racingcar/Application.kt index ded6eea6..d0645b17 100644 --- a/src/main/kotlin/racingcar/Application.kt +++ b/src/main/kotlin/racingcar/Application.kt @@ -9,9 +9,7 @@ var num = 0 var runSizeList = mutableListOf() fun main() { - inputCar() - raceCar() - printWinner() + startRacingCar() } // 입력 받기 @@ -67,3 +65,9 @@ private fun printWinner() { // 우승자 리스트 출력 println("최종 우승자 : ${winnerList.joinToString(",")}") } + +private fun startRacingCar() { + inputCar() + raceCar() + printWinner() +} From 0bf1bf61fb7f73cf6b64ee6ae4067f8a530be739 Mon Sep 17 00:00:00 2001 From: Sunghyeon Date: Mon, 28 Oct 2024 23:53:45 +0900 Subject: [PATCH 5/5] =?UTF-8?q?test:=20=ED=85=8C=EC=8A=A4=ED=8A=B8=20?= =?UTF-8?q?=EC=BD=94=EB=93=9C=20=EC=B6=94=EA=B0=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/test/kotlin/racingcar/ApplicationTest.kt | 3 +- src/test/kotlin/racingcar/RacingCarTest.kt | 43 ++++++++++++++++++++ 2 files changed, 45 insertions(+), 1 deletion(-) create mode 100644 src/test/kotlin/racingcar/RacingCarTest.kt diff --git a/src/test/kotlin/racingcar/ApplicationTest.kt b/src/test/kotlin/racingcar/ApplicationTest.kt index 3c601c8e..3948cec4 100644 --- a/src/test/kotlin/racingcar/ApplicationTest.kt +++ b/src/test/kotlin/racingcar/ApplicationTest.kt @@ -15,7 +15,8 @@ class ApplicationTest : NsTest() { run("pobi,woni", "1") assertThat(output()).contains("pobi : -", "woni : ", "최종 우승자 : pobi") }, - MOVING_FORWARD, STOP + MOVING_FORWARD, + STOP, ) } diff --git a/src/test/kotlin/racingcar/RacingCarTest.kt b/src/test/kotlin/racingcar/RacingCarTest.kt new file mode 100644 index 00000000..268a5d0a --- /dev/null +++ b/src/test/kotlin/racingcar/RacingCarTest.kt @@ -0,0 +1,43 @@ +package racingcar + +import org.assertj.core.api.Assertions.assertThat +import org.junit.jupiter.api.BeforeEach +import org.junit.jupiter.api.Test +import java.util.Collections.max + +class RacingCarTest { + @BeforeEach + fun setUp() { + input = listOf("Car1", "Car2", "Car3") + num = 5 + runSizeList = mutableListOf(3, 5, 5) + } + + @Test + fun `우승자 반환 테스트`() { + val expectedWinners = listOf("Car2", "Car3") + + // Call function to find winners + val maxRun = max(runSizeList) + val winnerList = + runSizeList + .mapIndexedNotNull { index, it -> + if (it == maxRun) index else null + }.map { input!![it] } + + assertThat(winnerList).isEqualTo(expectedWinners) + } + + @Test + fun `자동차 이름 5자 제한 테스트`() { + input = listOf("Mandy", "Jon") + + val exception = + org.junit.jupiter.api.assertThrows { + input!!.forEach { + if (it.length > 5) throw IllegalArgumentException("이름은 5자보다 짧게 입력해주세요") + } + } + assertThat(exception).hasMessageContaining("이름은 5자보다 짧게 입력해주세요") + } +}