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

[우인하] 프리코스 미션 제출합니다. #5550

Open
wants to merge 7 commits into
base: master
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
15 changes: 14 additions & 1 deletion README.md
Original file line number Diff line number Diff line change
Expand Up @@ -6,4 +6,17 @@
* 모든 피드백을 완료하면 다음 단계를 도전하고 앞의 과정을 반복한다.

## 온라인 코드 리뷰 과정
* [텍스트와 이미지로 살펴보는 온라인 코드 리뷰 과정](https://github.com/next-step/nextstep-docs/tree/master/codereview)
* [텍스트와 이미지로 살펴보는 온라인 코드 리뷰 과정](https://github.com/next-step/nextstep-docs/tree/master/codereview)

## 구현할 기능 목록
- [O] "경주할 자동차 이름을 입력하세요.(이름은 쉼표(,) 기준으로 구분)\n" 텍스트 출력
- [O] 유저가 입력한 [자동차 이름]을 ',' 단위로 파싱해서 Struct Car를 담고 있는 배열에 저장 (`IllegalArgumentException` 감지 필요, Struct Car는 String [자동차 이름], Int [전진한 칸] 으로 이루어져 있음)
- [O] "시도할 횟수는 몇회인가요?\n" 텍스트 출력
- [O] 유저가 입력한 [시도할 횟수]를 int로 저장 (`IllegalArgumentException` 감지 필요)
- [O] "\n실행 결과\n" 텍스트 출력
- [O] 각 자동차마다 0~9 무작위 값 generate한 뒤, 4 이상이면 전진한 칸을 1 증가시킴. (C++이라면 for문 돌리겠지만, Kotlin은 다른 방법 있나 찾아보기 - 왠지 있을 것 같음, 무작위 값은 굳이 int일 필요없어보임. 전진한 칸 수는 int로 저장)
- [O] 각 자동차마다 "${자동차 이름} : ", 전진한 칸 수 만큼 '-', '\n'을 출력.
- [O] 모든 자동차마다 전진한 칸 수 출력이 끝났으면 '\n'을 출력.
- [O] [시도할 횟수] 변수 1 감소
- [O] [시도할 횟수] 변수가 0이 되었다면, "\n최종 우승자 : " 텍스트 출력.
- [O] Car 배열에서 [전진한 칸]이 가장 많은 Car의 [자동차 이름]을 출력. 이 때, 각 [자동차 이름]사이에 ", "를 넣어서 출력한다. (왠지 Kotlin의 람다함수를 잘 이용하면 이 과정을 한줄로 만들 수 있을 것 같음)
2 changes: 2 additions & 0 deletions build.gradle
Original file line number Diff line number Diff line change
@@ -1,5 +1,6 @@
plugins {
id 'java'
id 'org.jetbrains.kotlin.jvm' version '1.9.0'
}

version '1.0'
Expand All @@ -11,6 +12,7 @@ repositories {
dependencies {
testImplementation 'org.assertj:assertj-core:3.22.0'
testImplementation 'org.junit.jupiter:junit-jupiter:5.8.2'
implementation "org.jetbrains.kotlin:kotlin-stdlib-jdk8"
}

java {
Expand Down
2 changes: 1 addition & 1 deletion gradle/wrapper/gradle-wrapper.properties
Original file line number Diff line number Diff line change
@@ -1,5 +1,5 @@
distributionBase=GRADLE_USER_HOME
distributionPath=wrapper/dists
distributionUrl=https\://services.gradle.org/distributions/gradle-6.8.1-bin.zip
distributionUrl=https\://services.gradle.org/distributions/gradle-6.8.3-bin.zip
zipStoreBase=GRADLE_USER_HOME
zipStorePath=wrapper/dists
58 changes: 58 additions & 0 deletions src/main/java/main.kt
Original file line number Diff line number Diff line change
@@ -0,0 +1,58 @@
import kotlin.random.Random

// 자동차 구조체 정의
data class Car(val name: String, var position: Int = 0)

fun main() {

// 자동차 이름 입력받기
val cars = inputCarNames()

// 시도할 횟수 입력받기
val tryCount = inputTryCount()
println("\n실행 결과")

// 자동차 경주
repeat(tryCount) {
raceCars(cars)
}

// 최종 결과 출력
printWinners(cars)
}

fun inputCarNames(): List<Car> {
print("경주할 자동차 이름을 입력하세요.(이름은 쉼표(,) 기준으로 구분)\n")
val carNames = readLine()?.split(",") ?: throw IllegalArgumentException("자동차 이름을 입력해야 합니다.")
return carNames.map { name -> Car(name.trim()) }
}

fun inputTryCount(): Int {
print("시도할 횟수는 몇회인가요?\n")
return readLine()?.toInt()?: throw IllegalArgumentException("횟수를 입력해야 합니다.")
}

fun raceCars(cars: List<Car>) {
cars.forEach { car ->
moveCarIfNeeded(car) // 중첩을 줄이기 위해 함수 호출

// 결과 출력
println("${car.name} : ${"-".repeat(car.position)}")
}
println()
}

fun printWinners(cars: List<Car>) {
// 최종 우승자 출력
val maxPosition = cars.maxByOrNull { it.position }?.position
val winners = cars.filter { it.position == maxPosition }.joinToString(", ") { it.name }
println("\n최종 우승자 : $winners")
}

// 차 전진 여부를 결정하는 함수
fun moveCarIfNeeded(car: Car) {
// 무작위 값을 생성하고, 4 이상이면 전진
if (Random.nextInt(10) >= 4) {
car.position++
}
}