diff --git a/README.md b/README.md index 62fa463c..c71132be 100644 --- a/README.md +++ b/README.md @@ -1 +1,23 @@ # kotlin-racingcar-precourse + +# 구현할 기능 목록 + +입력한 자동차 이름과 이동 횟수를 바탕으로 자동차 경주 게임을 구현한다. + +1. 자동차 이름 입력받기 + - 쉼표로 구성된 자동차 이름을 입력 받는다. + +2. 이동한 횟수 입력받기 + +3. 전진하는 조건을 설정하기 + - 0에서 9 사이에서 무작위 값을 구한 후 무작위 값이 4 이상일 때 전진한다. + +4. 자동차 경주 라운드별 전진 과정을 출력하기 + - `-`로 이동 결과를 출력하기 + +5. 최종 우승자 결과 출력하기 + - 한 명 이상의 우승자를 출력한다. + - 우승자가 여러 명일 경우 쉼표(,)를 이용하여 구분한다. + +6. 사용자가 잘못된 값을 입력할 경우 예외 처리하기 + - `IllegalArgumentException`을 발생시킨 후 애플리케이션은 종료되어야 한다. \ No newline at end of file diff --git a/src/main/kotlin/racingcar/Application.kt b/src/main/kotlin/racingcar/Application.kt index 0d8f3a79..64f5c5dd 100644 --- a/src/main/kotlin/racingcar/Application.kt +++ b/src/main/kotlin/racingcar/Application.kt @@ -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 { + 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, moveCount: Int) { + val racingResults = mutableMapOf() + + // 초기값 설정 + 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) { + racingResults.forEach { (name, distance) -> + println("$name : ${"-".repeat(distance)}") + } + + println() +} + +fun printFinalWinner(racingResults: Map) { + val maxDistance = racingResults.values.maxOrNull() ?: 0 // 가장 많이 전진한 거리 + val winners = racingResults.filter { racingResult -> + racingResult.value == maxDistance + }.keys // 가장 많이 전진한 사람을 우승자로 + + println("최종 우승자 : ${winners.joinToString(", ")}") // 최종 우승자 출력 }