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

[자동차 경주] 정호섭 미션 제출합니다. #115

Open
wants to merge 7 commits into
base: main
Choose a base branch
from
22 changes: 22 additions & 0 deletions README.md
Original file line number Diff line number Diff line change
@@ -1 +1,23 @@
# kotlin-racingcar-precourse

# 구현할 기능 목록

입력한 자동차 이름과 이동 횟수를 바탕으로 자동차 경주 게임을 구현한다.

1. 자동차 이름 입력받기
- 쉼표로 구성된 자동차 이름을 입력 받는다.

2. 이동한 횟수 입력받기

3. 전진하는 조건을 설정하기
- 0에서 9 사이에서 무작위 값을 구한 후 무작위 값이 4 이상일 때 전진한다.

4. 자동차 경주 라운드별 전진 과정을 출력하기
- `-`로 이동 결과를 출력하기

5. 최종 우승자 결과 출력하기
- 한 명 이상의 우승자를 출력한다.
- 우승자가 여러 명일 경우 쉼표(,)를 이용하여 구분한다.

6. 사용자가 잘못된 값을 입력할 경우 예외 처리하기
- `IllegalArgumentException`을 발생시킨 후 애플리케이션은 종료되어야 한다.
83 changes: 82 additions & 1 deletion src/main/kotlin/racingcar/Application.kt
Original file line number Diff line number Diff line change
@@ -1,5 +1,86 @@
package racingcar

import camp.nextstep.edu.missionutils.Console
import camp.nextstep.edu.missionutils.Randoms

fun main() {
// TODO: 프로그램 구현
println("경주할 자동차 이름을 입력하세요.(이름은 쉼표(,) 기준으로 구분)")
val input = Console.readLine()

println("시도할 횟수는 몇 회인가요?")
val count = Console.readLine()

val carNames = getCarNames(input)
val moveCount = getMoveCount(count)

println("\n실행 결과")
raceCars(carNames, moveCount) // 자동차 경주 시작
}

fun getCarNames(input: String): List<String> {
val carNames = input.split(",").map { name ->
name.trim()
} // 이름을 쉼표로 구분하고, 양쪽 공백 제거

// 자동차 이름 유효성 검사
if (carNames.any { name ->
name.isEmpty() || name.length > 5
}) {
throw IllegalArgumentException() // 이름이 비어 있거나 5자를 초과하는 경우 예외 처리
}

return carNames
}

fun getMoveCount(count: String): Int {
val moveCount = count.toInt()

// 이동 횟수 유효성 검사
if (moveCount <= 0) {
throw IllegalArgumentException() // 0 이하의 값인 경우 예외 처리
}

return moveCount
}

fun raceCars(carNames: List<String>, moveCount: Int) {
val racingResults = mutableMapOf<String, Int>()

// 초기값 설정
carNames.forEach { name ->
racingResults[name] = 0
}

// 전진 횟수마다 결과를 출력
repeat(moveCount) {
for (carName in carNames) {
val randomValue = Randoms.pickNumberInRange(0, 9)

if (randomValue >= 4 && racingResults[carName] != null) {
racingResults[carName] = racingResults[carName]!! + 1 // 무작위 값이 4 이상일 때 앞으로 전진
}
}

printRacingResults(racingResults) // 이동 결과 출력
}

// 최종 우승자 출력
printFinalWinner(racingResults)
}

fun printRacingResults(racingResults: Map<String, Int>) {
racingResults.forEach { (name, distance) ->
println("$name : ${"-".repeat(distance)}")
}

println()
}

fun printFinalWinner(racingResults: Map<String, Int>) {
val maxDistance = racingResults.values.maxOrNull() ?: 0 // 가장 많이 전진한 거리
val winners = racingResults.filter { racingResult ->
racingResult.value == maxDistance
}.keys // 가장 많이 전진한 사람을 우승자로

println("최종 우승자 : ${winners.joinToString(", ")}") // 최종 우승자 출력
}