Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

[자동차 경주] 허성현 미션 제출합니다. #109

Open
wants to merge 5 commits into
base: main
Choose a base branch
from
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
45 changes: 45 additions & 0 deletions README.md
Original file line number Diff line number Diff line change
@@ -1 +1,46 @@
# kotlin-racingcar-precourse

### 학습 목표
-여러 역할을 수행하는 큰 함수를 단일 역할을 수행하는 작은 함수로 분리한다.
- 테스트 도구를 사용하는 방법을 배우고 프로그램이 제대로 작동하는지 테스트한다.
- 1주차 공통 피드백을 반영

### 회고
- 지원서에 작성한 목표를 얼마나 달성하고 있다고 생각하나요? 그 이유는 무엇인가요?
- 지원서에 작성한 목표를 변경해야 한다고 생각하시나요? 그렇다면 그 이유와 어떤 목표로 변경하고 싶으신가요?
- 프리코스를 진행하면서 눈에 띄는 변화나 깨달은 점이 있나요?


### 기능 요구사항
초간단 자동차 경주 게임을 구현한다.

- 주어진 횟수 동안 n대의 자동차는 전진 또는 멈출 수 있다.
- 각 자동차에 이름을 부여할 수 있다. 전진하는 자동차를 출력할 때 자동차 이름을 같이 출력한다.
- 자동차 이름은 쉼표(,)를 기준으로 구분하며 이름은 5자 이하만 가능하다.
- 사용자는 몇 번의 이동을 할 것인지를 입력할 수 있어야 한다.
- 전진하는 조건은 0에서 9 사이에서 무작위 값을 구한 후 무작위 값이 4 이상일 경우이다.
- 자동차 경주 게임을 완료한 후 누가 우승했는지를 알려준다. 우승자는 한 명 이상일 수 있다.
- 우승자가 여러 명일 경우 쉼표(,)를 이용하여 구분한다.
- 사용자가 잘못된 값을 입력할 경우 IllegalArgumentException을 발생시킨 후 애플리케이션은 종료되어야 한다.

### 입출력 요구 사항
입력
- 경주할 자동차 이름
- 이름은 쉼표(,) 기준으로 구분
ex) pobi,woni,jun
- 시도할 횟수
5

출력
- 차수별 실행 결과
pobi : --
woni : ----
jun : ---
- 단독 우승자 안내 문구
최종 우승자 : pobi
- 공동 우승자 안내 문구
최종 우승자 : pobi, jun




70 changes: 69 additions & 1 deletion src/main/kotlin/racingcar/Application.kt
Original file line number Diff line number Diff line change
@@ -1,5 +1,73 @@
package racingcar

import camp.nextstep.edu.missionutils.Console
import camp.nextstep.edu.missionutils.Randoms
import java.util.Collections.max

var input: List<String>? = null
var num = 0
var runSizeList = mutableListOf<Int>()

fun main() {
// TODO: 프로그램 구현
startRacingCar()
}

// 입력 받기
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 }
}

// 자동차 경주 로직
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()
}
}

// 우승자 출력하기
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(",")}")
}

private fun startRacingCar() {
inputCar()
raceCar()
printWinner()
}
3 changes: 2 additions & 1 deletion src/test/kotlin/racingcar/ApplicationTest.kt
Original file line number Diff line number Diff line change
Expand Up @@ -15,7 +15,8 @@ class ApplicationTest : NsTest() {
run("pobi,woni", "1")
assertThat(output()).contains("pobi : -", "woni : ", "최종 우승자 : pobi")
},
MOVING_FORWARD, STOP
MOVING_FORWARD,
STOP,
)
}

Expand Down
43 changes: 43 additions & 0 deletions src/test/kotlin/racingcar/RacingCarTest.kt
Original file line number Diff line number Diff line change
@@ -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<IllegalArgumentException> {
input!!.forEach {
if (it.length > 5) throw IllegalArgumentException("이름은 5자보다 짧게 입력해주세요")
}
}
assertThat(exception).hasMessageContaining("이름은 5자보다 짧게 입력해주세요")
}
}